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
14
void 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.