STM32F103 CAN-Bus

STM32F103 CAN-Bus

1. Potrzebne rzeczy

Moduł STM32 Transceiver CAN Moduł USB-CDC
bluepill D_NQ_NP_864272-MLA43518917088_092020-O CH340_mini
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 SYS_Debug_Serial_Wire


2. Ustawienia zegarów

BluePill ma zewnętrzne kwarce. Należy je teraz włączyć.
RCC_HSE_LSE_Crystal

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


3. LED PC13

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

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

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.
GPIO_LED_Pin_Level_High


4. USART2

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

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

oraz włączamy przerwania NVIC Settings->USART global interrupt
USART2_NVIC_USART2_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.
USART2_pins


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)