CONNESSIONE PC to
STM32
Per la gestione lato P.C.
utilizzeremo il programma in Visual Basic precedentemente scritto negli appunti
‘CONNESSIONE di una scheda a
Microcontrollore al P.C.’
Utilizzeremo L’MCU NUCLEO-ST32L432KC PER CONNETTERSI VIA
RS232 AL P.C. ed il solito FTDI questa
volta con il jumper settato sui 3,3v che è la tensione di lavoro dell’’STM.
Schema di collegamento.
Connessioni pratiche
Per riutilizzare il software
‘Comm_UnByte_RS232.exe’, precedentemente scritto in Visual Basic, dovremmo
scrivere un programma simile
a quello scritto per Arduino che
acquisisce un dato e lo restituisce immediatamente incrementato di uno.
Unica differenza, rispetto al
programma Arduino e che la comunicazione avverrà in Interrupt.
Programmeremo l’STM in modo che potrà eseguire il programma principale e solo
all’arrivo di un dato da ricevere, interromperà l’esecuzione del programma,
solo per il tempo necessario per completare la comunicazione, e poi riprenderà
l’esecuzione del programma principale. Questa è la soluzione solitamente più utilizzata
nell’ambito professionale.
Per la scrittura del programma su STM, utilizzeremo STM32CubeIDE 1.15.0
-àUna guida sintetica e chiara per la programmazione delle MCU stm32 …
https://wiki.st.com/stm32mcu/wiki/Getting_started_with_UART
]
Quindi descriviamo dall’inizio la
procedura. (chi ha già esperienza potrà sorvolare le parti per lui scontate!)
Selezionare
modalità Asincrona.
Nella finestra
sottostante appaiono i parametri di conf.
Alla voce NVIC Setting,
Spuntare USART1 global interrupt
‘ENABLE’
Settare parametri trasmissione:9600
Bit/s (le rimanenti config. Sono quelle di default)
Alla voce ‘GPIO Setting’ I pin
utilizzati sono PA9 e PA10. Appaiono già
selezionati! Se vogliamo diamo
un nome personalizzato(User Label)
Per terminare e ritrovare il codice
scritto, relativo alla configurazione grafica appena fatta..
A questo punto
apparirà il codice completo della configurazione pronto da usare.
Il codice ha sempre
nome main.c
E si trova nella
finestra sul lato sinistro del ‘ProiectExplorer(annotare posizione per futuri
utilizzi!);
Completiamo il codice
per eseguire le operazioni necessarie.
1) Creiamo il Buffer TX
ed RX:
Vengono creati due
matrici ad un solo elemento. Normalmente, le matrici sono destinate al
contenimento di più elementi ma nel nostro caso ne serv
solo uno.
Per le vostre future
implementazioni creerete le matrici delle dimensioni necessarie.
La matrice rx_buff[]
è naturalmente destinata a contenere il dato da ricevere dal PC mentre nella tx_buff[] verrà collocato il dato ricevuto +1.
Inserire il
seguente codice tra /* USER CODE BEGIN 0 */ e /* USER CODE END 0 */
/* USER CODE BEGIN 0
*/
uint8_t tx_buff[1]; // USART
uint8_t rx_buff[1]; // USART
/* USER CODE END 0 */
2)
Avvia la ricezione prima dell’avvio
del programma.
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, rx_buff, 1);
/* USER CODE END 2 */
3)
Routine di interruzione:
La routine di interruzione va scritta! Non viene creata
direttamente dal Configuratore grafico!!!!!!!!!!!!!!!!!!!!
Nella funzione, prima si riceve il dato spedito dal PC e poi lo si
restituisce incrementato di uno.
Inserire il seguente codice tra /* USER CODE BEGIN 4 */ e /* USER CODE END 4 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart1, rx_buff, 1);
rx_buff[0]= rx_buff[0] + 1
HAL_UART_Transmit_IT(&huart1, tx_buff,
1);
}
/* USER CODE END 4 */
Come già accennato, il programma
principale ‘gira’ indisturbato
nell loop While (1), { .. }, quando, in un qualsiasi
momento, il PC invia un dato, l’STM
subisce una interruzione (il pin RX
dell’STM attiva l’interruzione), il programma interrompe l’esecuzione del
programma Principale ed esegue la
routine di interruzione (HAL_UART_RxCpltCallback).
Finita l’esecuzione della routine, il programma riprende a ‘girare’ dal
punto in cui si è INTERROTTO.
Nota sulle librerie HAL.
Le librerie HAL semplificano
notevolmente l’utilizzo dei mmicrocontrollori STM32.
Con un singolo richiamo ad una funzione,
è possibile realizzare una serie di operazioni che, diversamente, sarebbe
difficile, lunga e complessa.
In sostanza con la libreria, si
dispone di un linguaggio più ad alto livello somigliante al conosciutissimo Wiring utilizzato per la programmazione nell’IDE di
Arduino.
Tutte le librerie sono integrate ed
immediatamente disponibili nell’IDE STM32CubeIDE.