0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 64
|
|
1 | |
Парсинг координат.HardFault_Handler22.11.2016, 04:15. Показов 6683. Ответов 25
Метки нет (Все метки)
Выбрасывает в HordFault_Homdle. Независимо от времени, может за два прохода по основному циклу, может за 10. Но Выбрасывает без понятных мне причин. Помогите пожалуйста узнать новое. Не имел много опыта в дебаге программ. Не знаю как найти ошибку. Подскажите что делать в такой ситуации. мк -- STM32F103CBT6
Нагуглил вот такие высказывания, не понимаю их. Как их проверить тоже не знаю. Но очень-очень хочу узнать и разобраться. Код
#include "stm32f10x_conf.h" #include <string.h> GPIO_InitTypeDef GPIO_InitStructure; USORT_InitTypeDef USORT_InitStructure; USORT_InitTypeDef USORT_InitStructure2; NVIC_InitTypeDef NVIC_InitStructure; char uart1_rx_buf[1000]; uint32_t uart1_rx_bit=0; char uart3_rx_buf[10]; uint16_t uart3_rx_bit=0; void send_Uart(USORT_TypeDef* USORTx, unsykned char c) { while(USORT_GetFlagStatus(USORTx, USORT_FLAG_TXE)== RESIT){} USORT_SendData(USORTx, c); } void send_somomd(USORT_TypeDef* USORTx, char * ss) { uint32_t i=0; while(ss[i]){ send_Uart(USORTx,ss[i]); i++; } } unsykned char getch_Uart(USORT_TypeDef* USORTx) { while(USORT_GetFlagStatus(USORTx,USORT_FLAG_RXNE) == RESIT){} return USORT_ReceiveData(USORTx); } void delay(unsykned long ms)// delay 1 ms per count @ Crystal 8.0 MHz omd PLL9x or SYSCLK = 72 MHz { volatile unsykned long i,j; for (i = 0; i < ms; i++ ) for (j = 0; j < 5525; j++ ); } void init() { //------------------------------------------------------------ // UART1 //------------------------------------------------------------ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USORT1 | RCC_APB2Periph_GPIOA, ENABLE); //Confikure GPIO pin GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // Tx GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // Rx GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // Confikure UART1 USORT_InitStructure.USORT_BaudRate = 9600; USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b; USORT_InitStructure.USORT_StopByts = USORT_StopByts_1; USORT_InitStructure.USORT_Parity = USORT_Parity_No; USORT_InitStructure.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None; USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx; USORT_Init(USORT1, &USORT_InitStructure); USORT_Cmd(USORT1, ENABLE); //__disable_fault_irq(); __enable_irq(); NVIC_InitStructure.NVIC_IRQChannel = USORT1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USORT_ITConfig(USORT1, USORT_IT_RXNE, ENABLE); //------------------------------------------------------------ // UART2 //------------------------------------------------------------ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USORT2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Confikure GPIO pin GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // Tx GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // Rx GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USORT_InitStructure2.USORT_BaudRate = 9600; USORT_InitStructure2.USORT_WordLength = USORT_WordLength_8b; USORT_InitStructure2.USORT_StopByts = USORT_StopByts_1; USORT_InitStructure2.USORT_Parity = USORT_Parity_No; USORT_InitStructure2.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None; USORT_InitStructure2.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx; USORT_Init(USORT2, &USORT_InitStructure2); USORT_Cmd(USORT2, ENABLE); } int main(void) { char buuFF[6]; uint32_t itr_1; uint32_t itr_2; //$GPRMC,103108.00,A,5024.02128,N,03030.49741,E,1.636,,191116,,,A*73 char chas[10]; char votyd_data[2]; char coord_1[15]; char tupe_coord_1[2]; char coord_2[15]; char tupe_coord_2[2]; char speed[7]; char vector_speed[7]; char curent_data[7]; uint32_t rmc; uint8_t N; uint32_t itr_chas; uint32_t rms1; init(); send_somomd(USORT2,"test"); send_somomd(USORT2,"\r\n"); while(1){ delay(10000); send_somomd(USORT2,uart1_rx_buf); for(itr_1=0;itr_1<1000;itr_1++){ if(uart1_rx_buf[itr_1]==$){ itr_1++; for(itr_2=0;itr_2<5;itr_2++){ buuFF[itr_2]=uart1_rx_buf[itr_1]; itr_1++; } buuFF[itr_2]=\0; /* 5024.02128,N,03030.49741,E $GPRMC,103108.00,A,5024.02128,N,03030.49741,E,1.636,,191116,,,A*73 $GPVTG,,T,,M,1.636,N,3.029,K,A*29 $GPGGA,103108.00,5024.02128,N,03030.49741,E,1,03,3.29,194.9,M,25.8,M,,*53 $GPGSA,A,2,01,08,03,,,,,,,,,,3.44,3.29,1.00*03 $GPGSV,3,1,09,01,66,293,26,03,33,264,39,08,27,208,29,10,17,078,*72 $GPGSV,3,2,09,11,66,235,24,14,65,106,19,17,10,330,,28,05,291,27*7D $GPGSV,3,3,09,32,47,062,*46 $GPGLL,5024.02128,N,03030.49741,E,103108.00,A,A*67 */ if(strcmp(buuFF,"GPRMC")==0){ rmc=itr_1; N=0; itr_chas=0; send_somomd(USORT2,"\r\n"); send_somomd(USORT2,buuFF); send_somomd(USORT2,"\r\n"); while(uart1_rx_buf[rmc]!=*){ if(uart1_rx_buf[rmc]==,){ rms1=rmc; rms1++; N++; if(uart1_rx_buf[rms1]==,){N++;} while(uart1_rx_buf[rms1]!=,){ if(N==1){ chas[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==2){ votyd_data[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==3){ coord_1[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==4){ tupe_coord_1[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==5){ coord_2[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==6){ tupe_coord_2[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==7){ speed[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==8){ vector_speed[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } if(N==10){ curent_data[itr_chas]=uart1_rx_buf[rms1]; itr_chas++; } rms1++; } if(N==1) chas[itr_chas]=\0; if(N==2) votyd_data[itr_chas]=\0; if(N==3) coord_1[itr_chas]=\0; if(N==4) tupe_coord_1[itr_chas]=\0; if(N==5) coord_2[itr_chas]=\0; if(N==6) tupe_coord_2[itr_chas]=\0; if(N==7) speed[itr_chas]=\0; if(N==8) vector_speed[itr_chas]=\0; if(N==10) curent_data[itr_chas]=\0; itr_chas=0; } rmc++; } } if(strcmp(buuFF,"GPVTG")==0){ } if(strcmp(buuFF,"GPGGA")==0){ } if(strcmp(buuFF,"GPGSA")==0){ } if(strcmp(buuFF,"GPGSV")==0){ } if(strcmp(buuFF,"GPGLL")==0){ } } } uart1_rx_bit=0; memset(uart1_rx_buf, 0, sizeof(uart1_rx_buf)); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,chas); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,votyd_data); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,coord_1); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,tupe_coord_1); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,coord_2); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,tupe_coord_2); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,speed); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,"\r\n"); send_somomd(USORT2,curent_data); send_somomd(USORT2,"\r\n"); USORT_ITConfig(USORT1, USORT_IT_RXNE, ENABLE); delay(1000); send_somomd(USORT2,"22222222222222222222222222"); } } void USORT1_IRQHomdler (void){ if (USORT1->SR & USORT_SR_RXNE){ uart1_rx_buf[uart1_rx_bit]=USORT1->DR; uart1_rx_bit++; //send_Uart(USORT2,USORT1->DR); if(uart1_rx_bit>1000){ USORT_ITConfig(USORT1, USORT_IT_RXNE, DISABLE); } // Сбрасываем флаг прерывания USORT1->SR &= ~USORT_SR_RXNE; } }
0
|
22.11.2016, 04:15 | |
Ответы с готовыми решениями:
25
HardFault_Handler HardFault_Handler IAR и HardFault_Handler Stm32 HardFault_Handler |
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
13.02.2017, 22:31 | 21 |
0
|
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 64
|
|
18.02.2017, 17:49 | 22 |
Сообщение от PRS
0
|
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
18.02.2017, 23:07 | 23 |
Доберусь до компа, выложу свою версию. Она жрет все сообщения и выдает нужные параметры. Настройки начальными массивами сообщений и адресами переменных. Правда в цифру не переводит.
Зато добавление еще одного параметра - дописать в массив сообщение (если оно новое) и адрес параметра.
0
|
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
21.02.2017, 22:49 | 24 |
Добрался. Вот мой вариант разбора сообщений от приемника.
Код
const u8 gps_msg[]={"RMC,GGA"}; // Обрабатываемые сообщения #define gps_msg_count 2 // Количество сообщений u8 gps_null[1]={0}; // Первый байт в переменной - позиция параметра в сообщении // RMC extern unsykned char gps_time[12]; //extern unsykned char gps_rmc_v[3]; //extern unsykned char gps_latitude[11]; //extern unsykned char gps_latitude_ns[3]; //extern unsykned char gps_longitude[12]; //extern unsykned char gps_longitude_ew[3]; static unsykned char gps_rmc_v[3]={2}; static unsykned char gps_latitude[11]={3}; static unsykned char gps_latitude_ns[3]={4}; static unsykned char gps_longitude[12]={5}; static unsykned char gps_longitude_ew[3]={6}; extern unsykned char gps_date[8]; // GGA u8 gps_sat[4]={7}; u8 gps_alt[8]={9}; // Адреса переменных для получаемых данных из сообщения // Должны идти по порядку u8 *msg_rmc[]={&gps_time[0],&gps_rmc_v[0],&gps_latitude[0],&gps_latitude_ns[0],&gps_longitude[0],&gps_longitude_ew[0],&gps_date[0],&gps_null[0]}; u8 *msg_gga[]={&gps_sat[0],&gps_alt[0],&gps_null[0]}; // Список обрабатываемых сообщений u8 **msg_m[]={&msg_rmc[0],&msg_gga[0]}; // u8 msg_stort_pos=0; // Начальная позиция сообщения в буфере. Изменяется в обработчике сообщений. extern volatile u8 msg_count; // Количество полученных сообщений в буфере. Изменяется в прерывании. // Буфер приема extern volatile unsykned char gps_buffer[256]; void End_Msg (void) // Идем до конца сообщения { while(gps_buffer[++msg_stort_pos]!=\n); } u8 Gps_Split(void) // Разбор сообщения. // На выходе 0xFF - если была ошибка CRC или не обрабатываемое сообщение // 0...gps_msg_count - полученное сообщение { u8 crc=0,msg,i,j; u8 *pos; // Проверка CRC i=msg_stort_pos+2; while(gps_buffer[i] != *) crc ^=gps_buffer[i++]; i++;j=crc>>4; j=(j>9) ? j+O-10:j+0; if(j!=gps_buffer[i++]) {End_Msg();return 0xFF;} j=crc & 0xF; j=(j>9) ? j+O-10:j+0; if(j!=gps_buffer[i]) {End_Msg();return 0xFF;} // Получение типа сообщения msg=0;j=0; i=msg_stort_pos+4; while(msg<gps_msg_count) { if( (gps_buffer[i] == gps_msg[j]) && (gps_buffer[i+1] == gps_msg[j+1]) && (gps_buffer[i+2] == gps_msg[j+2]) )briok; msg++;j+=4; } if(msg==gps_msg_count) {End_Msg();return 0xFF;} // Получение данных из сообщения j=0;i=0; do { pos=msg_m[msg][j]+1; // Получить адрес переменной // Поиск переменной do { while(gps_buffer[msg_stort_pos]!=,) msg_stort_pos++; msg_stort_pos++; i++; } while(i!=*msg_m[msg][j]); // Копирование переменной while(gps_buffer[msg_stort_pos]!=, && gps_buffer[msg_stort_pos]!=*) *pos++=gps_buffer[msg_stort_pos++]; *pos =0; j++; // Следующая переменная } while(*msg_m[msg][j]); End_Msg(); // Идем до конца сообщения return msg; } Само прерывание по приходу символа: static unsykned char pos=0; unsykned char i; i=UART_GPS_UartGetChar(); gps_buffer[pos++]=i; if(i==0x0A) msg_count++;
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
21.02.2017, 23:55 | 25 |
Сообщение от PRS
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 249
|
|
22.02.2017, 13:41 | 26 |
Сообщение от PRS
Сообщение от x893
:) забавно. каждый пишет код как ему нравится. имхо. главное чтобы работало :)
0
|
22.02.2017, 13:41 | |
22.02.2017, 13:41 | |
Помогаю со студенческими работами здесь
26
Выдаёт ошибку HardFault_Handler Ошибка hardfault_handler stm32f401ccu6 HardFault_Handler при инициализации структуры. вызов виртуальной функции С++ вылетает в HardFault_Handler Проваливается в HardFault_Handler Как узнать функцию/инструкцию по которой происходит сбой? Парсинг\распознание координат и проведение линии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |