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 */
}