1. 程式人生 > 其它 >HAL庫移植RT-Thread Nano

HAL庫移植RT-Thread Nano

一、移植RT-Thread Nano準備

  1. keil軟體
  2. CubeMx軟體
    STM32 CubeMx使用教程:https://www.cnblogs.com/jzcn/p/16313803.html
  3. STM32開發版
    我使用的是STM32F103C8T6。

二、使用CubeMx生成HAL庫

這裡就以最簡單的LED程式作為移植工程,由於使用CubeMx生成HAL庫生成比較簡單,這裡就不詳細說明了,有不明白的地方可以參考STM32 CubeMx使用教程

三、新增RT-Thread Nano


如果找不到RT-Thread Nano,可以在Pack Installer中安裝

四、遮蔽SystemClock_Config函式的呼叫

系統時鐘已經在RT-Thread中完成了初始化,所以在mian中就不用再次進行系統時鐘的初始化,否則RT-Thread無法正常執行,只需在mian函式中遮蔽SystemClock_Config函式的呼叫即可,如下圖所示:

五、 錯誤處理

編譯後會有如下錯誤提示

解決辦法

  • 將stm32f1xx_it.c檔案中的void HardFault_Handler(void)、void PendSV_Handler(void)、void SysTick_Handler(void)三個方法遮蔽即可

  • 或者在CubeMX生成程式碼時將,取消這三個函式模板的生成,如下圖所示:

    處理完成後編譯即可

六、編寫測試程式需

由於需要使用RT-Thread中的函式,所以在需要在使用到的地方加入標頭檔案rtthread.h。

#include <rtthread.h>

靜態執行緒測試

  1. 建立執行緒函式

    static struct rt_thread led_thread;
    static char led_thread_stack[256];
    
    static void led_thread_entry(void *parameter)
    {
        while (1)
        {
    	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    	rt_thread_mdelay(500);
    	
    	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    	rt_thread_mdelay(500);
        }
    }
    

    如下圖所示:

  2. 在面函式中呼叫執行緒

    rt_err_t rst;
    rst = rt_thread_init(&led_thread,
    		        "ledshine",
    		        led_thread_entry,
    			RT_NULL,
    			&led_thread_stack[0],
    			sizeof(led_thread_stack),
    			RT_THREAD_PRIORITY_MAX - 2,
    			20);
    
    if (rst == RT_EOK)
    {
         rt_thread_startup(&led_thread);
    }
    

    如下圖所示:

    注意: 需要在mian函式中加入rt_thread_startup(&led_thread)延時,防止主執行緒被殺死

動態執行緒測試

  1. 需要在rtconfig.h檔案中取消RT_USING_HEAP巨集的遮蔽

  2. 將靜態呼叫的程式修改一下,不用修改執行緒函式,如下圖所示

編譯後下載測試即可,如果led能正常閃爍說明移植RT-Thread成功