最近在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调试过程中,有时候某些语句打不上断点。
分析:之前有看过优化之类的文章,感觉跟优化有关,一试果真是的。
解决:因为在程序配置中优化程度过高,改成无优化,调试过程中就能顺利的打上断点了。