#include "serial_at_cmd_app.h" #include "global_param.h" #include #include #include "dw_app.h" #define CMD_READ 1 #define CMD_WRITE 2 #define CMD_REPLY 3 #define EUART_RX_BUF_SIZE 100 typedef enum{ UsartReceiveWaitHead0, UsartReceiveWaitHead1, UsartReceiveWaitMsgType, UsartReceiveWaitLength, UsartReceiveWaitCMD, UsartReceiveWaitIndex, UsartReceiveWaitDataLen, UsartReceiveWaitData, UsartReceiveWaitChecksum }UsartRecvPackState; uint8_t mUsartReceivePack[100] = {0}; void SendComMap(uint8_t data_length, uint8_t index) { static uint8_t send_frame[EUART_RX_BUF_SIZE]; uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x03; send_frame[3] = data_length+5; send_frame[4] = CMD_REPLY; send_frame[5] = index; send_frame[6] = data_length; memcpy(&send_frame[7], &g_com_map[index], data_length); for(int i = 0; i<(data_length+5); i++) { checksum += send_frame[2+i]; } checksum = Checksum_u16(&send_frame[2],5+data_length); memcpy(&send_frame[7+data_length],&checksum,2); UART_PushFrame(send_frame, data_length+9); } void UpdateProcess(uint8_t index) { if(index == 2*CNT_UPDATE) { uint32_t result = 0; uint16_t tmp = 0xAAAA; __disable_irq(); result = FLASH_Prepare(0x8004A38, 128); while(!result) { result = FLASH_Prepare(0x8004A38, 128); delay_ms(200); } if(result) result = FLASH_Write(0x8004A38, (const uint8_t*)&tmp, 2); __enable_irq(); printf("½øÈëÉý¼¶Ä£Ê½\r\n"); g_com_map[CNT_UPDATE]=0; save_com_map_to_flash(); delay_ms(100); // STMFLASH_Write_NoCheck(0x8004A38,0xAAAA); // Delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } if(index == 2*CNT_REBOOT) { g_com_map[CNT_REBOOT]=0; g_com_map[MAP_SIGN_INDEX]=0; save_com_map_to_flash(); delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } if(index == 2*CNT_RESTART) { g_com_map[CNT_RESTART]=0; save_com_map_to_flash(); delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } } void UsartParseDataHandler(uint8_t data) { static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0; uint16_t checksum = 0; static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ; static uint8_t index = 0; if(usart_receive_state == UsartReceiveWaitChecksum) { //ÈôÊÕµ½Ð£ÑéºÍ°ü checksum = 0; for(int i = 0; i>1); break; default: break; } } usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; index=0; } else if((usart_receive_state == UsartReceiveWaitData) ) { //Èô¹ûÊÕµ½µÄÊÇÕý³£Í¨Ñ¶°ü mUsartReceivePack[index] = data; index++; if(index == pack_length-5) { //Èç¹ûÊÕµ½µÄindexÓ볤¶ÈÏàµÈ usart_receive_state = UsartReceiveWaitChecksum; } } else if(usart_receive_state == UsartReceiveWaitDataLen) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_datalen = data; usart_receive_state = UsartReceiveWaitData; }else if(usart_receive_state == UsartReceiveWaitIndex) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_index = data; usart_receive_state = UsartReceiveWaitDataLen; } else if(usart_receive_state == UsartReceiveWaitCMD) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_cmd = data; usart_receive_state = UsartReceiveWaitIndex; } else if(usart_receive_state == UsartReceiveWaitLength) { //ÊÕµ½³¤¶È×Ö½Ú pack_length = data; pack_index = 0; usart_receive_state = UsartReceiveWaitCMD; } else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) { //ÊÕµ½µÚÒ»¸ö°üÍ· usart_receive_state = UsartReceiveWaitHead1; } else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) { //ÊÕµ½µÚ¶þ¸ö°üÍ· usart_receive_state = UsartReceiveWaitMsgType; }else if ((usart_receive_state == UsartReceiveWaitMsgType) && (data == 0x3)) { usart_receive_state = UsartReceiveWaitLength; pack_msgtype = data; } else { usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; } }