STM32 串口通信导致hard fault 产生

yyang0514 2014-10-09 03:15:59
硬件:

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

...全文
783 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyang0514 2014-10-11
  • 打赏
  • 举报
回复
非常感谢帮我找到了问题,谢谢!
beimenxue 2014-10-10
  • 打赏
  • 举报
回复
在函数 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; } MSGINFO* msginfo= (MSGINFO*)malloc(sizeof(MSGINFO));你这个地方malloc有free吗?

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧