最近在STM8S单片机上调试遇到些问题,共享出来!
问题:STM8S在用IAR编译器调试过程中,中途暂停下,发现程序不能正常运行了,一直死在串口接收中断函数中。
分析:怀疑是串口接收中断函数未清标志位,但函数确实有相应的清中断语句,语句如下:
uint8_t tmp;
UART3_ClearFlag(UART1_FLAG_RXNE);
tmp = UART3_ReceiveData8();
进入UART3_ClearFlag(UART1_FLAG_RXNE)函数中查看代码:
void UART3_ClearFlag(UART3_Flag_TypeDef UART3_FLAG)
{
/* Check the parameters */
assert_param(IS_UART3_CLEAR_FLAG_OK(UART3_FLAG));
/*Clear the Receive Register Not Empty flag */
if (UART3_FLAG == UART3_FLAG_RXNE)
{
UART3->SR = (uint8_t)~(UART3_SR_RXNE);
}
/*Clear the LIN Break Detection flag */
else if (UART3_FLAG == UART3_FLAG_LBDF)
{
UART3->CR4 &= (uint8_t)(~UART3_CR4_LBDF);
}
/*Clear the LIN Header Detection Flag */
else if (UART3_FLAG == UART3_FLAG_LHDF)
{
UART3->CR6 &= (uint8_t)(~UART3_CR6_LHDF);
}
/*Clear the LIN Synch Field flag */
else
{
UART3->CR6 &= (uint8_t)(~UART3_CR6_LSF);
}
}
发现其确实清了接收中断标志位,故去STM8S参考手册看UART3->SR寄存器的描述,发现串口通信除了接收中断外,还有过载错误中断。
接收中断描述如下:
RXNE:读数据寄存器非空
当RDR移位寄存器中的数据被转移到UART_DR寄存器中,该位被硬件置位。如果UART_CR1
寄存器中的RXNEIE为1,则产生中断。对UART_DR的读操作可以将该位清零。RXNE位也可
以通过写入0来清除,对于UART2和UART3,该位也可以通过写入0来清除。
0:数据没有收到;
1:收到数据,可以读出。
过载错误中断描述如下:
RXNE:读数据寄存器非空
当RDR移位寄存器中的数据被转移到UART_DR寄存器中,该位被硬件置位。如果UART_CR1
寄存器中的RXNEIE为1,则产生中断。对UART_DR的读操作可以将该位清零。RXNE位也可
以通过写入0来清除,对于UART2和UART3,该位也可以通过写入0来清除。
0:数据没有收到;
1:收到数据,可以读出。
故发现该UART3_ClearFlag(UART1_FLAG_RXNE)只清了接收中断,未清除过载错误中断,因为清除过载错误中断需先读UART_SR,然后读UART_DR。
而UART3_ClearFlag(UART1_FLAG_RXNE)函数中运行的语句只写了UART->SR,未读UART->SR。
UART3->SR = (uint8_t)~(UART3_SR_RXNE);
解决:故用UART3->SR &= 0xDF代替UART3_ClearFlag(UART1_FLAG_RXNE),既能清除接收中断中断,又能清除过载错误中断,这样调试过程中暂停一下,程序就不会死在中断中了。
uint8_t tmp;
UART3->SR &= 0xDF;
tmp = (uint8_t)UART3->DR;
问题:STM8S调试过程中,有时候某些语句打不上断点。
分析:之前有看过优化之类的文章,感觉跟优化有关,一试果真是的。
解决:因为在程序配置中优化程度过高,改成无优化,调试过程中就能顺利的打上断点了。
上一篇:STM 8 AD 转换问题
下一篇:STM8S003F使用I/O口模拟串口(一)发送数据
推荐阅读最新更新时间:2024-11-13 10:47
设计资源 培训 开发板 精华推荐
- 使用 LTC2389CLX-18、18 位、2.5Msps SAR ADC 的典型应用
- 19年H题:模拟电磁曲射炮 717574A
- 使用 Analog Devices 的 LT1578IS8 的参考设计
- AD8659ACPZ-RL电压跟随器运算放大器典型应用电路
- DC2870A,使用 LTC5596 Linduino Shield 100MHz 至 40GHz RMS 功率检测器的演示板
- 使用 Analog Devices 的 ADG5409BRUZ 的参考设计
- 高效率小功率BUCK电路
- AD8341-EVAL,基于 AD8341 1.5 至 2.4 GHz 射频矢量调制器的评估板
- 使用 ROHM Semiconductor 的 BD49E52G-TR 的参考设计
- 具有两个充电输入的典型应用 使用 NX20P5090 高压 USB PD 电源开关