硬件:
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 |
RE:STM32 串口通信导致hard fault 产生