STM8S单片机串口调试

    最近在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调试过程中,有时候某些语句打不上断点。

    分析:之前有看过优化之类的文章,感觉跟优化有关,一试果真是的。

    解决:因为在程序配置中优化程度过高,改成无优化,调试过程中就能顺利的打上断点了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值