STM32/STM8技术论坛
直播中

贾埃罗

7年用户 1634经验值
私信 关注
[问答]

这算是一个STM32的BUG吗?

完成串口初始化,之后再设置中断优先级。如果在这两个步骤间串口有数据传入,则单片机死机。

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

猜想:STM32的其他外设也有同样问题。未测试。

回帖(6)

李娜

2018-8-27 10:40:14
有时候供电不足也会死循环的
举报

王飞云

2018-8-27 10:44:46
您是中断哪里判断有问题了 能看代码吗
举报

贾埃罗

2018-8-27 10:47:15

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);
}




举报

王飞云

2018-8-27 10:52:18
先关掉中断,串口中断优先级设置完再打开串口中断。
举报

贾埃罗

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

123一起玩

2018-8-27 16:51:36
1) 串口参数初始化(波特率/停止位等), 并使能串口。
2)使能串口和 GPIO 口时钟。
3) GPIO 口初始化设置(速度,上下拉等)以及复用映射配置。
4)开启串口相关中断,配置串口中断优先级。
5)编写中断服务函数。
6) 串口数据接收和发送。
以上是我从STM32开发datesheet中里面写的串口中断编程步骤,没毛病,看到你的步骤不是按照这样配。就出现死机
举报

更多回帖

发帖
×
20
完善资料,
赚取积分