[STM32F1]

这算是一个STM32的BUG吗?

[复制链接]
1011|7
手机看帖
扫描二维码
随时随地手机跟帖
秉烛良宵|  楼主 | 2018-8-22 22:00 | 显示全部楼层 |阅读模式
完成串口初始化,之后再设置中断优先级。如果在这两个步骤间串口有数据传入,则单片机死机。

为了进一步测试,单独写了一段程序,用于测试串口2
程序非常简单,串口初始化完成后加入10S延时,在延时期间给串口发数据,10S后设置中断优先级。串口的中断服务函数是收到一个数据就发送出来,且在函数最后清除所有的中断标志位。如果单片机没有死机则完成中断优先级设置后进入循环,循环里面是闪LED。
现象是:每次都死机,死机后串口就一直发送同一个数据,从仿真看是死在中断函数里面。

猜想:STM32的其他外设也有同样问题。未测试。
磨砂| | 2018-8-23 08:09 | 显示全部楼层
用的什么供电

使用特权

评论回复
keaibukelian| | 2018-8-23 09:55 | 显示全部楼层
对有时候供电不足也会死循环的

使用特权

评论回复
paotangsan| | 2018-8-23 10:03 | 显示全部楼层
您是中断哪里判断有问题了 能看代码吗

使用特权

评论回复
秉烛良宵|  楼主 | 2018-8-25 14:15 | 显示全部楼层
paotangsan 发表于 2018-8-23 10:03
您是中断哪里判断有问题了 能看代码吗

int main(void)
{
        RCC_Configuration();
        delay_init(72);
        GPIO_Configuration();
        USART_Configuration();
GPIO_SetBits(GPIOB,GPIO_Pin_0);


delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);  

GPIO_ResetBits(GPIOB,GPIO_Pin_0);
        NVIC_Configration();
while(1)
{
   GPIO_SetBits(GPIOB,GPIO_Pin_1);
   delay_ms(200);
   GPIO_ResetBits(GPIOB,GPIO_Pin_1);
   delay_ms(200);
}
}


/*******************************************************************************
* Function Name  : USART2_IRQHandler
* Description    : This function handles USART2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
        static unsigned char dat;

        dat =  USART_ReceiveData(USART2);
USART_SendData(USART2,dat);

USART_ClearFlag(USART2,USART_FLAG_CTS);
USART_ClearFlag(USART2,USART_FLAG_LBD);
USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ClearFlag(USART2,USART_FLAG_RXNE);
}

使用特权

评论回复
Cjy_JDxy| | 2018-8-25 15:22 | 显示全部楼层
先关掉中断,串口中断优先级设置完再打开串口中断。

使用特权

评论回复
mohanwei| | 2018-8-25 17:15 | 显示全部楼层
串口中断函数里少了处理溢出中断的代码。
只要使能接收中断,会自动使能溢出中断。
……
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//串口接收中断
        {
                ucChar = USART_ReceiveData(USART1);
                ……
        }
        //溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
    {
        USART_ClearFlag(USART1,USART_FLAG_ORE);//读SR
        USART_ReceiveData(USART1);//读DR
    }
……

使用特权

评论回复
秉烛良宵|  楼主 | 2018-8-25 21:18 | 显示全部楼层
Cjy_JDxy 发表于 2018-8-25 15:22
先关掉中断,串口中断优先级设置完再打开串口中断。

嗯,所以我最后的结论就是这样的。上面的代码是故意最后设置优先级,目的就是要说明这么做会引起死机,事实上我很少看到有论坛讨论过这个问题,且发现有很多人的代码并没有在意这种顺序,因为一般情况下并不容易发现。

使用特权

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

本版积分规则

26

主题

163

帖子

7

粉丝