打印
[STM32F0]

STM32F030C8T6同时使用USART1和USART2的接收中断会死机

[复制链接]
9302|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 hjq451506709 于 2014-5-4 19:55 编辑

STM32F030C8T6同时使用USART1和USART2的接收中断会死机。
仿真的截图如下所示:
直接卡死在中断使能那一行了。

void USART_INIT(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1, ENABLE);
}
void USART2_INIT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, &USART_InitStructure);
  USART_Cmd(USART2, ENABLE);
}
void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
  USART2_RX_BUFFER[USART2_RX_COUNTER] = USART_ReceiveData(USART2);
  USART2_RX_COUNTER++;
  if(USART2_RX_COUNTER==1)
  {
   if(USART2_RX_BUFFER[0]!=0x34)
    USART2_RX_COUNTER = 0;
  }
  else if(USART2_RX_COUNTER==4)
  {
   USART2_RX_COUNTER = 0;
   if(USART2_RX_BUFFER[3]==0x0A)
   {
    NextFlag=1;
    USART2_RX_BUFFER[0]=0;
    USART2_RX_BUFFER[1]=0;
    USART2_RX_BUFFER[2]=0;
    USART2_RX_BUFFER[3]=0;
   }
  }
  }
}
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
  rx_buffer[rx_counter] = USART_ReceiveData(USART1);
  rx_counter++;
  if(rx_counter==1)
  {
   if(rx_buffer[0]!=0x55)
    rx_counter = 0;
  }
  else if(rx_counter==(((rx_buffer[1]<<8)+rx_buffer[2])))
  {
   if(rx_buffer[rx_counter-1]==0x88) //LCD
   {
    rx_counter=0;
    rx_complishflag=1;
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
   }
  }
}

QQ图片20140504194626.jpg (228.71 KB )

QQ图片20140504194626.jpg
沙发
mmuuss586| | 2014-5-4 19:55 | 只看该作者

我用407开了6个串口都不会死机
程序发上来看看

使用特权

评论回复
板凳
hjq451506709|  楼主 | 2014-5-4 20:08 | 只看该作者
上传了,好奇怪啊,USART1完全没有问题,只要一执行到USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);就死机了。

STM32F030_DEMO - 2.0.3.rar

238.02 KB

使用特权

评论回复
地板
hjq451506709|  楼主 | 2014-5-4 20:09 | 只看该作者
我没有用外部晶振,用的是内部的

使用特权

评论回复
5
hjq451506709|  楼主 | 2014-5-4 20:13 | 只看该作者
这个是串口接收到的

QQ图片20140504201210.jpg (67.49 KB )

QQ图片20140504201210.jpg

使用特权

评论回复
6
hjq451506709|  楼主 | 2014-5-7 20:18 | 只看该作者
解决问题了,开机要先关闭中断,延时一段时间(不延时的话,还是会死在那行串口中断代码),就可以正常进入串口2中断了。

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
icecut + 4
7
MakeBetter| | 2014-5-8 16:25 | 只看该作者
你把堆栈设大点,保你就没问题了。

使用特权

评论回复
8
hjq451506709|  楼主 | 2014-5-8 21:07 | 只看该作者
MakeBetter 发表于 2014-5-8 16:25
你把堆栈设大点,保你就没问题了。

怎么设置堆栈?你说的堆栈指的是串口数据接收缓冲区吗?跟堆栈没有关系吧?

使用特权

评论回复
9
icecut| | 2014-5-9 10:04 | 只看该作者
很多时候,还是软件被中断搞乱了吧.导致不该产生的提前产生了.

使用特权

评论回复
10
hjq451506709|  楼主 | 2014-5-9 11:08 | 只看该作者
icecut 发表于 2014-5-9 10:04
很多时候,还是软件被中断搞乱了吧.导致不该产生的提前产生了.

现在的问题是:两个串口中断程序只负责把接收到的数据保存到各自的串口数据缓冲区中,而且现在的情况是仿真的时候发现直接停在了串口2的中断使能语句,还没有到达主循环之前就死了。更重要的是:在执行那一行语句之前全部都是模块初始化程序,这就想不通了:为什么延时一会儿就不会死机?(PS:串口2是直接连到一个MP3模块的串口,MP3模块上电会在串口发送MP3的版本信息)

使用特权

评论回复
11
icecut| | 2014-5-9 13:30 | 只看该作者
hjq451506709 发表于 2014-5-9 11:08
现在的问题是:两个串口中断程序只负责把接收到的数据保存到各自的串口数据缓冲区中,而且现在的情况是仿 ...

就是在配置之前的时候已经收到东西了...这时候,你最好复位控制器.保持控制器在正常状态.

使用特权

评论回复
12
jzxlit| | 2015-4-12 00:20 | 只看该作者
为什么我这里就这样呢?

无标题.png (18.49 KB )

无标题.png

使用特权

评论回复
13
搞IT的| | 2015-4-12 11:04 | 只看该作者
恩 学习了。。

使用特权

评论回复
14
破天#mcu| | 2017-8-7 10:22 | 只看该作者
代理兆易创新(GD)32-bit ARM架构,Cortex-M3、M4内核MCU,可提供技术支持等服务;
GD32F130系列 M3内核与STM32F030/051系列,硬件pin to pin兼容;烧录器、寄存器、开发环境完全兼容;
欢迎来电咨询探讨,邱先生 电话:136 8955 5135;

使用特权

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

本版积分规则

8

主题

132

帖子

3

粉丝