搜索
bottom↓
回复: 19

stm32f030串口2接收数据后进入HardFault_Handler

[复制链接]

出0入0汤圆

发表于 2017-3-10 10:39:40 | 显示全部楼层 |阅读模式
使用stm32f030c8t6,只要串口2接收到数据就马上跳转到HardFault_Handler,
请大家帮忙看看是怎么回事,以下是初始化代码。
  1. void USART2_Init(void)
  2.   {  
  3.        GPIO_InitTypeDef  GPIO_InitStructure;
  4.         USART_InitTypeDef USART_InitStructure;
  5.                     NVIC_InitTypeDef NVIC_InitStructure;
  6.                
  7.         RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );
  9.                
  10.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  11.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);        
  12.                               
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;                 
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  16.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
  19.         
  20.         USART_InitStructure.USART_BaudRate = 9600;//设置串口波特率
  21.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
  22.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
  23.         USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
  24.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
  25.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置工作模式
  26.         USART_Init(USART2, &USART_InitStructure); //配置入结构体
  27.                                
  28.                                 NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;//设置中断  
  29.                                 NVIC_InitStructure.NVIC_IRQChannelPriority=0;//设置优先级  
  30.                                 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能  
  31.                                 NVIC_Init(&NVIC_InitStructure);

  32.                                 USART_ClearITPendingBit(USART2,USART_IT_RXNE) ;  //清除接收中断标志
  33.         USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//接收中断使能
  34.                                
  35.         USART_Cmd(USART2, ENABLE);//使能串口2
  36.                                
  37.                 }
复制代码

出0入4汤圆

发表于 2017-3-10 10:46:36 | 显示全部楼层
接收函数看看

出0入0汤圆

 楼主| 发表于 2017-3-10 10:54:15 | 显示全部楼层

void USART2_IRQHandler(void){  

    //如果是接收中断  
    if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){
                       
                        UART2_ModBus_Rec_data[UART2_RecvData_num]=USART_ReceiveData(USART2);//读完即自动清除RXNE
                        UART2_RecvData_num++;
                              Open_TIM3();                       
    }  
    //如果是发送中断  
    else  
    {  
                        USART_ClearFlag(USART2,USART_FLAG_TC);   
    }  
}

这是接收函数,关键是根本执行不到这里就死机了

出0入0汤圆

发表于 2017-3-10 11:20:27 | 显示全部楼层
void USART2_IRQHandler(void){  

    //如果是接收中断  
    if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){
                        
           
UART2_ModBus_Rec_data[0]=USART_ReceiveData(USART2);//读完即自动清除RXNE
                        UART2_RecvData_num++;
                              Open_TIM3();
                       
    }  
    //如果是发送中断  
    else  
    {  
                        USART_ClearFlag(USART2,USART_FLAG_TC);   
    }  
}
改下看看死不死

出0入0汤圆

 楼主| 发表于 2017-3-10 11:58:18 | 显示全部楼层
亽亼 发表于 2017-3-10 11:20
void USART2_IRQHandler(void){  

    //如果是接收中断  

还是不行,估计是USART2初始化函数有问题,哪位坛友帮忙发一下

出0入198汤圆

发表于 2017-3-10 11:59:47 | 显示全部楼层
看样子应该是内存写穿(数组越界)了,可以试试用我即将正式开源的错误追踪库 CmBacktrace 来定位下具体代码位置及异常原因, https://github.com/armink/CmBacktrace

出0入0汤圆

 楼主| 发表于 2017-3-10 13:48:03 | 显示全部楼层
sunnydragon 发表于 2017-3-10 11:59
看样子应该是内存写穿(数组越界)了,可以试试用我即将正式开源的错误追踪库 CmBacktrace 来定位下具体代 ...

是不是访问了不存在的寄存器,因为只要接收到数据根本进不了串口中断直接死机,难道STM32F030C8的串口2有问题?

出0入0汤圆

发表于 2017-3-10 14:02:47 | 显示全部楼层
没问题啊,只不过我用的是HAL这个库,你看看IO有没有被其他功能占用

出0入0汤圆

 楼主| 发表于 2017-3-10 14:20:07 | 显示全部楼层
cqsgcqsg 发表于 2017-3-10 14:02
没问题啊,只不过我用的是HAL这个库,你看看IO有没有被其他功能占用

检查过了IO没有占用,朋友能不能把你的工程给我发过来我测试一下串口,谢谢了

出0入0汤圆

发表于 2017-3-10 15:00:15 | 显示全部楼层
整个工程还真给不了,我用的STM32CubeMX直接生成的代码,这个库函数效率不高但是能将就用。
你可以安装一个,配置好了直接生成工程模板。

出0入0汤圆

 楼主| 发表于 2017-3-10 15:51:23 | 显示全部楼层
cqsgcqsg 发表于 2017-3-10 15:00
整个工程还真给不了,我用的STM32CubeMX直接生成的代码,这个库函数效率不高但是能将就用。
你可以安装一个 ...

好的,软件已经安了但是提示缺少安装包,我再安个新版本的试试

出0入0汤圆

发表于 2017-3-10 16:19:44 | 显示全部楼层
wtiechen1969 发表于 2017-3-10 15:51
好的,软件已经安了但是提示缺少安装包,我再安个新版本的试试

有问题的话可以联系ST的技术支持,他们好像也在主推这个新的库

出0入0汤圆

发表于 2017-3-10 20:34:31 来自手机 | 显示全部楼层
sunnydragon 发表于 2017-3-10 11:59
看样子应该是内存写穿(数组越界)了,可以试试用我即将正式开源的错误追踪库 CmBacktrace 来定位下具体代 ...

兄台论坛有开过帖子宣传嘛~ 看起来不错

出0入198汤圆

发表于 2017-3-11 22:34:20 | 显示全部楼层
lgc150 发表于 2017-3-10 20:34
兄台论坛有开过帖子宣传嘛~ 看起来不错

先不急,等晚些时候正式发布

出0入0汤圆

发表于 2017-3-14 15:44:40 | 显示全部楼层
初始化代码应该是没有问题,我的也是这样,就是顺序不一样,我的顺序是中断配置、IO配置、然后串口2配置、最终开使能,但是这个影响应该不大。在接收中断中我强制清除标志位USART_ClearITPendingBit(USART2, USART_IT_RXNE)。如果你连中断都进不来的话,很有可能是中断向量表的映射不对,那就看看你的启动文件有没有选对了,我选的是startup_stm32f030.s。

出0入4汤圆

发表于 2017-3-14 16:28:36 | 显示全部楼层
调试时进入错误后, 打开堆栈视图, 看看是哪个函数引起的错误.  一般是数组越界, 指针越界, 字节对齐,,,错误

出0入0汤圆

发表于 2017-3-23 13:21:35 | 显示全部楼层
还要检查一下堆栈大小

出0入0汤圆

发表于 2017-3-23 15:38:11 | 显示全部楼层
16楼的答复非常棒。

看堆栈就知道执行到哪里错误了。

出0入0汤圆

发表于 2017-3-23 17:08:24 | 显示全部楼层
UART初始化的时候要读取当前设备时钟计算波特率寄存器,然后有一次初始化读取设备时钟的时候就会进入HardFault,最后一直没解决,直接往波特率寄存器里写了定值。

出0入0汤圆

发表于 2017-3-23 18:28:04 | 显示全部楼层
有可能是定义是缓冲数组过大,或者没有定界,造成越界,试下改少一点缓冲区
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 02:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表