la situazione e l'ambiente di sviluppo sono simili alla mia richiesta viewtopic.php?f=17&t=86559
Per riassumere, sono un principiante degli STM32 e sto giocando con una STM32F429I-DISCO. Sono riuscito a fare diverse cosette ed è molto carina.
In questi ultimi giorni, mi sto battendo un po' con l'UART. In pratica, vorrei ricevere dei segnali MIDI (cosa che ho già fatto molte volte con i PIC). Riesco a configurare l'UART per ricevere tramite interrupt, solo che sembra che solo un byte venga ricevuto. Ecco un estratto del codice :
- Codice: Seleziona tutto
int main(void)
{
HAL_Init();
SystemClock_Config();
/* [...] */
ConfigureGPIOPorts();
/*##-1- Configure the UART peripheral ###################################*/
/* Put the USART peripheral in the Asynchronous mode (UART Mode) */
/* UART1 configured as follow:
- Word Length = 8 Bits
- Stop Bit = One Stop bit
- Parity = None
- BaudRate = 31250 baud (as per MIDI standard)
- Hardware flow control disabled (RTS and CTS signals) */
UartHandle.Instance = USARTx;
UartHandle.Init.BaudRate = 31250;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
if(HAL_UART_Init(&UartHandle) != HAL_OK) {
Error_Handler();
}
/* Other configuration code for timers and GPIO here */
/*##-2- Put UART peripheral in reception process #####################*/
if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, 1) != HAL_OK) {
Error_Handler();
}
while (1) {
/* [...] */
}
}
/* [...] */
/**
* @brief Rx Transfer completed callback
* @param handle: UART handle
* @note
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *handle)
{
if(handle->Instance !=USARTx)
return;
/* MIDI Event state machine here. */
HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, 1);
}
/**
* @brief UART error callbacks
* @param UartHandle: UART handle
* @note This example shows a simple way to report transfer error, and you can
* add your own implementation.
* @retval None
*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
/* Turn LED3 on: Transfer error in reception/transmission process */
BSP_LED_On(LED3);
}
In pratica, la chiamata a HAL_UART_Receive_IT nell'interrupt non va a buon fine per una ragione che ignoro (il valore di ritorno non è HAL_OK, tra l'altro). Il sistema quindi dopo aver ricevuto correttamente un byte (il primo ricevuto) non riesce a ricevere i byte successivi, perché l'interrupt non è più richiamato.
La cosa divertente è che se nell'interrupt inserisco delle funzioni che lo rallentano troppo (come una scrittura sul display, che uso anche per debug), il sistema segnala errore tramite la HAL_UART_ErrorCallback, ma se recupero l'errore riesce a ricevere altri byte (perdendone comunque per strada un bel po').
Ho letto in giro che alcune versioni della HAL (io ne uso una piuttosto vecchia, del 2014) erano afflitte da un bug, ma non ho trovato una descrizione di questo bug abbastanza chiara perché possa capire da dove venga. Qui c'è qualcosa, ma non ci capisco molto: https://community.st.com/s/question/0D5 ... -something
Qui c'è il codice di tutto il progettino, abbastanza brutto perché sono tuttora in fase alquanto esploratoria: https://github.com/DarwinNE/MIDI2SwinSIDs
Il file main.c da cui ho estratto i pezzi di cui sopra è qui:
https://github.com/DarwinNE/MIDI2SwinSI ... src/main.c
Una risposta RTFM mi va benissimo, mi basta essere indirizzato sul buon manuale.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



