Salut,
J'ai un probleme du a un UART dans une routine d'interruption:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == (TIM2)) //TIMER INTERUPT FOR SD CARD { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2); strcat(mot_sd_1,mot_sd_2); machine_SD_write(FALSE,mot_sd_1,nom_fichier); //write the data into the SD Card } if(htim->Instance == (TIM4)) //TIMER INTERUPT FOR SIGFOX { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_3); sigfox_send_test(); } }
Lorsque j'enleve la ligne en rouge tout mon programme fonctionne, mais des qu'elle est presente, le programme est comme fige.
Voici le contenu de cette fonction:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 /*Test function for Sigfox*/ char str[12]; void sigfox_send_test(void){ sprintf(str,"AT$SF=4444\r"); //String composed of a 4-bytes message via AT Command UART_puts(UART3_ID, (uint8_t*)str, sizeof(str)); //Send the message to UART3 (Sigfox module) //HAL_Delay(10000); //10-seconds delay }
Voici le code de la fonciton UART_puts qui envoie une chaine de caractere sur l'UART:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /** * @brief Envoi une chaine de caractere sur l'USARTx. Fonction BLOCANTE si un caractere est deja en cours d'envoi. * @func void UART_putc(UART_HandleTypeDef * UART_Handle, char c) * @param str : la chaine de caractère à envoyer * @param USARTx : USART1, USART2 ou USART6 */ void UART_puts(uart_id_e uart_id, uint8_t * str, uint8_t len) { HAL_StatusTypeDef state; HAL_UART_StateTypeDef uart_state; assert(uart_id < UART_ID_NB); if(!len) len = strlen(str); do { NVIC_DisableIRQ(nvic_irq_array[uart_id]); state = HAL_UART_Transmit_IT(&UART_HandleStructure[uart_id], str, len); NVIC_EnableIRQ(nvic_irq_array[uart_id]); }while(state == HAL_BUSY); do{ uart_state = HAL_UART_GetState(&UART_HandleStructure[uart_id]); }while(uart_state == HAL_UART_STATE_BUSY_TX || uart_state == HAL_UART_STATE_BUSY_TX_RX); //Blocant. }
Cela est surement du au fait que la fonction UART_puts soit bloquante, mais je n'en suis pas certain, et si c'est le cas je ne sais pas comment la modifier pour qu'elle ne soit plus bloquante. Merci pour votre aide.






Répondre avec citation
Partager