STM32F103 CAN-Bus
1. Potrzebne rzeczy
| Moduł STM32 | Transceiver CAN | Moduł USB-CDC |
|---|---|---|
![]() |
![]() |
![]() |
| Płytka BluePill - u mnie STM32F103C6/C8 | Moduł Tranceivera CAN - u mnie SN65HVD230 | Moduł konwertera USB/RS232 - u mnie CH340 |
2. Konfiguracja mikrokontrolera.
1. Debugowanie
Żeby nie stracić możliwości programowania po pierwszynm zaprogramowaniu musimy włączyć deugowanie SYS->Debug = Serial Wire

2. Ustawienia zegarów
BluePill ma zewnętrzne kwarce. Należy je teraz włączyć.

Pojawiły się nam na zielono piny skonfigurowane pod kwarce.

3. LED PC13
Dodatkowo włączymy sobie diodę LED aby sygnalizować sobie jakieś zdażenia, np. przerwanie z USARTa bądź CANa.

Oraz nadajemy nazwą dla pinu aby nie myśleć na jakim pinie i porcie jest diona LED.

Ze względu na to że w BluePill dioda LED podłączona jest katodą do mikrokontrolera, musimy ją wyłączyć (wygasić) czyli na pin PC13 podać stan wysoki.

4. USART2
Kolejnym krokiem będzie włączenie i konfiguracja USART2. W zakładce Conectivity znajdujemy USART2 i wybieramy tryb Asynchronous.

W Parameter Settingsustawiamy nas interesujący Baud Rate = 250000 Bits/s

oraz włączamy przerwania NVIC Settings->USART global interrupt

Piny USART2 przypisane z automatu to akurat dla tego iterfejsu i STM32F103Cx bez możliwości przemapowania, PA2 = USART2_TX, PA3 = USART2_RX.

3. Kod
W pliku main.c, deklarujemy zmienne
/* USER CODE BEGIN PV */
uint8_t rx_byte;
int led_status = 0;
/* USER CODE END PV */
Prototyp funkcji
/* USER CODE BEGIN PFP */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/* USER CODE END PFP */
a następnie kod funkcji,
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart == USART2){
led_status = 1;
HAL_UART_Receive_IT(&huart2, &rx_byte, 1);
}
}
/* USER CODE END 0 */
Uruchamiamy odbiór USART w pliku main.c w funkcji main()
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, &rx_byte, 1) ;
/* USER CODE END 2 */
W pętli while() dodajemy kod migania diodą LED
/* USER CODE BEGIN 3 */
if(led_status){
led_status = 0;
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
}
/* USER CODE END 3 */
Można też w funkcji przerwania dodać transmisję zwrotną przez USART (echo)


