Można zintegrować projekt tworzony w STM32CubeMX ze środowiskiem Keil.
Bare metal
Zaczniemy od użycia Keil tak samo, jak to było w przypadku STM32Ide – do aplikacji bare metal bez RTOS, ale z HAL.
W CubeMX w zakładce Project Manager zmieniamy IDE na MDK-ARM (v. 5.27 min) reszta po staremu – Generate Code – Open Project.
Teraz otwieramy uVision5, w dobrze znanej nam sekcji while(1) dopisujemy co trzeba (np. mruganie diodą)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); HAL_Delay(500); //printfx("."); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); HAL_Delay(500); } /* USER CODE END 3 */ |
(nazwa pinów zielonej diody zostawiona oryginalna LD2 z CubeMX). Teraz F7 -> F8 -> Ctrl-F5 -> Ctrl-F5. Program działa na kontrolerze – dioda miga.
Dodajemy RTOS do projektu
Teraz spróbujemy zainstalować do naszego projektu RTOS.
Project -> Manage -> Run Time Evironment
RTOS -> RT-Thread (select option) -> Kernel (checkbox) -> OK
Dodaliśmy RTOS, ale co to? F7 i projekt się nie kompiluje? Pokryły się nazwy przykrytych funkcji, wchodzimy do pliku obok main.c -> stm32f1xx_it.c (lub podobnie w zależności od typu kontrolera). Wyłączamy komentarzem trzy funkcje powodujące konflikt, dwie są puste, jedynie funkcja Systick zawiera
1 | HAL_IncTick(); |
Przenosimy ją do pliku RTOS->board.c gdzie jest druga taka sama funkcja systick, dopisujemy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include "stm32f1xx_hal.h" //............. void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); //FX TUTAJ DOPISUJEMY NASZĄ FUNKCJĘ: HAL_IncTick(); /* leave interrupt */ rt_interrupt_leave(); } |
Robimy to, ponieważ Systick jest wywyoływany 1kHz i aktualizuje licznik z biblioteki RT, a teraz dodatkowo drugi licznik z biblioteki HAL. Inaczej HAL_delay nie działa (ale czy musi? Zamiast niego używamy funkcje z biblioteki RT).
Teraz F7 -> F8 -> Ctrl F5 -> Ctrl F5 – działa!
Delay z RT-Thread
Pierwszy test – zmieniamy HAL_delay (zaprojektowany do pracy bez RTOS) na rt_thread_mdelay
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); //HAL_Delay(500); zamiast HAL uzywamy rt_thread: rt_thread_mdelay(500); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); //HAL_Delay(500); zamiast tego piszemy: rt_thread_mdelay(500); } /* USER CODE END 3 */ } |