打印
[STM8]

STM8L串口中断问题

[复制链接]
1538|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
iangzy|  楼主 | 2017-4-24 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 iangzy 于 2017-4-24 21:22 编辑

我这里的中断为何经常无法接收到数据?数据丢失了
void USART1_Init(void)
{
    GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);  //TXD   //txd初始化为高电平互补推挽输出模式
    GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);      //RXD   //rxd初始化为不带中断上拉输入模式         
   
    CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//开启USART时钟
    USART_Init(USART1,115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);//设置USART参数115200,8N1,接收/发送
    USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);//使能接收中断
    USART_Cmd (USART1,ENABLE);//使能USART
}
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    u8 res=0;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {   
        USART_ClearITPendingBit (USART1,USART_IT_RXNE);//清中断标志
        res = USART_ReceiveData8 (USART1);                                 
        if(USART_RX_STA<500)               
        {
              USART_RX_count=0;
              if(USART_RX_STA==0)
              {
                  USART_RX_count_enable = 1;
              }
              USART_RX_BUF[USART_RX_STA++]=res;               
        }
        else
        {
                USART_RX_STA|=1<<15;                                       
        }
    }
}


沙发
airwill| | 2017-4-25 07:15 | 只看该作者
还是新人哪
不知道这 "经常" 怎么讲. 多少个字符里丢掉几个?  还是连续发送的时候会丢掉几个?

这种情况, 往往不是你的中断服务程序本身的问题, 而是这个系统的问题.
比如更改优先级的中断长期占有 CPU 时间, 导致这个中断没有机会响应中断. 或者中间关闭了中断允许.
另外, 你的波特率也不低, 中断服务里, 可以多读几次接受寄存器, 读到没有为止, 因为双缓冲问题.
还有可能是 软件 BUG
USART_RX_count=0;                                这个可以随便清零么
USART_RX_BUF[USART_RX_STA++]=res;     这里保持数据没错的
但是你对 USART_RX_STA 的操作太复杂了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

9

帖子

0

粉丝