你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 串口通信导致hard fault 产生

[复制链接]
yangrobin 提问时间:2014-10-9 15:29 /
 硬件:

STM32F103VE

实现过程:
串口中断接收的数据采用 全局变量来接收,然后再main 循环处理串口接收数据。
上位机每次发送8个字节给STM32开发板,即消息处理中的case 'o'的情况。
现象:

1.当全局变量分配为400个字节时,开发板能够处理5次上位机消息。
2.当全局变量分配为200个字节时,开发板能够处理17次上位机消息。
3.当全局变量分配为100个字节时,开发板能够处理26次上位机消息。

检查了代码没有内存泄露的情况。请高手帮忙检查一下代码。谢谢!

追加一个问题:

在主函数中的while循环中,如果不加上count>7 这个判断条件  硬件错误中断也会直接发生。

请问有没有更好的办法在主函数来处理中断上来的消息。最好能给一个相对较完整的代码演示。谢谢!
主循环函数:
[size=1em]C/C++ code[size=1em] 
?
            
[size=1em]1

            
[size=1em]2

            
[size=1em]3

            
[size=1em]4

            
[size=1em]5

            
[size=1em]6

            
[size=1em]7

            
[size=1em]8

            
[size=1em]9

            
[size=1em]10

            
[size=1em]11

            
[size=1em]12

            
[size=1em]13

            
[size=1em]14

            
[size=1em]15

            
[size=1em]16

            
[size=1em]17

            
[size=1em]18

            
[size=1em]19

            
[size=1em]20

            
[size=1em]21

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




消息处理函数:
[size=1em]C/C++ code[size=1em] 
?
            
[size=1em]1

            
[size=1em]2

            
[size=1em]3

            
[size=1em]4

            
[size=1em]5

            
[size=1em]6

            
[size=1em]7

            
[size=1em]8

            
[size=1em]9

            
[size=1em]10

            
[size=1em]11

            
[size=1em]12

            
[size=1em]13

            
[size=1em]14

            
[size=1em]15

            
[size=1em]16

            
[size=1em]17

            
[size=1em]18

            
[size=1em]19

            
[size=1em]20

            
[size=1em]21

            
[size=1em]22

            
[size=1em]23

            
[size=1em]24

            
[size=1em]25

            
[size=1em]26

            
[size=1em]27

            
[size=1em]28

            
[size=1em]29

            
[size=1em]30

            
[size=1em]31

            
[size=1em]32

            
[size=1em]33

            
[size=1em]34

            
[size=1em]35

            
[size=1em]36

            
[size=1em]37

            
[size=1em]38

            
[size=1em]39

            
[size=1em]40

            
[size=1em]41

            
[size=1em]42

            
[size=1em]43

            
[size=1em]44

            
[size=1em]45

            
[size=1em]46

            
[size=1em]47

            
[size=1em]48

            
[size=1em]49

            
[size=1em]50

            
[size=1em]51

            
[size=1em]52

            
[size=1em]53

            
[size=1em]54

            
[size=1em]55

            
[size=1em]56

            
[size=1em]57

            
[size=1em]58

            
[size=1em]59

            
[size=1em]60

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




中断接收函数:
[size=1em]C/C++ code[size=1em] 
?
            
[size=1em]1

            
[size=1em]2

            
[size=1em]3

            
[size=1em]4

            
[size=1em]5

            
[size=1em]6

            
[size=1em]7

            
[size=1em]8

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


更多0

程序.zip

下载

1.3 MB, 下载次数: 0, 下载积分: ST金币 -1

收藏 评论1 发布时间:2014-10-9 15:29

举报

1个回答
废鱼 回答时间:2014-10-10 10:44:41

RE:STM32 串口通信导致hard fault 产生

count++溢出了。导致buff发生了错误,count不要超出buff的最大值。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版