• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > STM32串口通信导致hardfault产生

STM32串口通信导致hardfault产生

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了stm32 hardfault,hardfault handler,hardfault,hardfault interrupt,b hardfault handler等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:STM32 串口通信导致hard fault 产生
描述:

硬件:
STM32F103VE
实现过程:
串口中断接收的数据采用 全局变量来接收,然后再main 循环处理串口接收数据。
上位机每次发送8个字节给STM32开发板,即消息处理中的case 'o'的情况。
现象:
1.当全局变量分配为400个字节时,开发板能够处理5次上位机消息。
2.当全局变量分配为200个字节时,开发板能够处理17次上位机消息。
3.当全局变量分配为100个字节时,开发板能够处理26次上位机消息。
检查了代码没有内存泄露的情况。请高手帮忙检查一下代码。谢谢!
追加一个问题:
在主函数中的while循环中,如果不加上count>7 这个判断条件  硬件错误中断也会直接发生。
请问有没有更好的办法在主函数来处理中断上来的消息。最好能给一个相对较完整的代码演示。谢谢!
主循环函数:


u8 *usart_buff;
u32 count=0;
int main(void)
{
   u16 i=0,j=0,icnt=0;
   RCC_Configuration();    //系统时钟初始化
   GPIO_Configuration();//端口初始化
   USART_Configuration();
   NVIC_Configuration();
   usart_buff=(u8*)malloc(PC_MSG_LEN);
   BuffSet(usart_buff,0x0,PC_MSG_LEN);
   
   while(1)
   {     
    if(!USART_GetFlagStatus(USART1,USART_FLAG_RXNE)&&count>7)
    {
          MessageProcess();
     
    }
   }   
}

消息处理函数:

extern unsigned int count;
extern u8* usart_buff;
 
void  MessageProcess(void)
{
    MSGINFO* msg_info=(MSGINFO*)malloc(sizeof(MSGINFO));
    msg_info=GetMsgInfo(usart_buff);
     switch(msg_info->command)
     {
     
    case 'o':
    printf("o\n");
    break;
     default:
         break;
     }
     free(msg_info);
    count=0;
    BuffSet(usart_buff,0x0,PC_MSG_LEN);
}
 
void BuffSet(unsigned char* buff,unsigned char vaule, unsigned int length)
{
    unsigned char* temp=buff;
    int i=0;
    for(i=0;i<length;i++)
    {
        *temp=vaule;
        temp++;
    }
}
MSGINFO* GetMsgInfo(u8 * buff)
{
    u32 i =0,j=0,temp=0;
    MSGINFO* msginfo= (MSGINFO*)malloc(sizeof(MSGINFO));
    unsigned int sum;
    //printf("MessageProcess\r\n");
    msginfo->command=0;
    msginfo->data_start_addr=0;
    msginfo->length=0;
    while(buff[i++]==0xaa && i<count)
    {
        temp=i-1;
         
        //printf("length = 0x%x\r\n",length);
        sum =GetChecksum(&buff[temp],msginfo->length+1+1+2);
       // printf("sum = 0x%x\r\n",sum);
        if(VerifyChksum(sum,&buff[msginfo->length+1+1+2]))
        {
           msginfo->length =GetLength(&buff[temp+2]);
           msginfo->command = buff[temp+1];
           return  msginfo;
        }
        else
        {
             return 0;
        }
    }
    return 0;
}

中断接收函数:

void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
   {
     
    usart_buff[count++]=USART_ReceiveData(USART1);
   }
}


解决方案1:

检查了代码没有内存泄露的情况。
你怎么查的?
MessageProcess(void) 里面给msg_info分配了一次内存,GetMsgInfo(u8 * buff)里面又分配了一次
删掉MessageProcess(void)里面那句 malloc


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 自定义scatter文件,程序进入HardFault_Handler
  • STM32串口通信导致hardfault产生

相关文章

  • 2017-06-05 流媒体播放器Lua开发流媒体播放器如何?
  • 2017-06-05 stm32f0通过ILI9163驱动TFT液晶屏显示问题
  • 2017-06-05 请问有没有把INF转化成EXE的代码?
  • 2017-06-05 linux启动问题
  • 2017-06-05 如果单片机要通过运营商的gprs下载星历数据
  • 2017-06-05 请问6针的1394端口转9针的RS232串口需要转换芯片吗?
  • 2017-06-05 怎么给外设分配空间,能访问外设地址?(急)
  • 2017-06-05 MSP430编程点亮12864端口设置
  • 2017-06-05 北京的内核编程高手进来啊?有挑战性的
  • 2017-06-05 D12TESTSys无法在Win7/Win8下安装,能否通过修改inf解决?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 用什么方法可以实现,在有调试器的情况下,程序出现异常时控制权不返回到调试器。
    • 新手,请各位指教
    • SPI总线模块
    • 安装Xilinxise133ISO时,打开镜像文件中的xsetupexe时停止工作怎么回事?
    • 新手上路,请高手指点(关于读卡器驱动)
    • 关于流媒体传输h264
    • 帮忙分析下dump文件
    • MSP430多路捕获问题……
    • 如何设定inf文件中拷贝驱动程序的目录???--Win2k和WinXp我已解决,但Win98却不行
    • 如何计算进程切换的花费时间?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有