RT-Thread 創(chuàng)建一個標(biāo)準(zhǔn)工程
問題:
如何在原有的bsp/stm32/stm32f091-nucleo基礎(chǔ)上,創(chuàng)建一個新的標(biāo)準(zhǔn)工程/stm32f030? 因?yàn)楣俜讲豢赡芴峁┧械男酒腷sp模板,所以掌握創(chuàng)建自己的板子的bsp,是必須要掌握的。并且官方現(xiàn)在提供的教程太詳細(xì)了,照葫蘆畫瓢,就可以搞定,這點(diǎn)給RT-Thread點(diǎn)個贊。這也是方便開展后續(xù)開發(fā)的基礎(chǔ),只有這個開頭順利完成,后面的就更方便,否則真的會打消使用的勁頭。我是邊寫下面文檔,邊操作2個小時。快的話,半個小時。
我的項(xiàng)目只用到gpio 和串口2.
參考資料:STM32 系列 BSP 制作教程
BSP 的制作過程分為如下五個步驟:
復(fù)制通用模板
使用 CubeMX 工具配置工程
修改 BSP 中的 Kconfig 文件
修改構(gòu)建工程相關(guān)文件
重新生成工程
3.1復(fù)制通用模板
本次制作的 BSP 為 F0 系列,因此拷貝模板文件夾下的 stm32f0xx 文件夾,并將該文件夾的名稱改為 stm32f020-miao ,如下圖所示:
在接下來的 BSP 的制作過程中,將會修改 board 文件夾內(nèi)的配置文件,將 F0 系列的 BSP 模板變成一個適用于正點(diǎn)原子 stm32f030-miao 開發(fā)板的 BSP ,下表總結(jié)了 board 文件夾中需要修改的內(nèi)容:
項(xiàng)目 | 需要修改的內(nèi)容說明 |
CubeMX_Config (文件夾) | CubeMX 工程 |
linker_scripts (文件夾) | BSP 特定的鏈接腳本 |
board.c/h | 系統(tǒng)時鐘、GPIO 初始化函數(shù)、芯片存儲器大小 |
Kconfig | 芯片型號、系列、外設(shè)資源 |
SConscript | 芯片啟動文件、目標(biāo)芯片型號 |
3.2 使用 CubeMX 配置工程
在制作 BSP 的第二步,需要創(chuàng)建一個基于目標(biāo)芯片的 CubeMX 工程。默認(rèn)的 CubeMX 工程在 CubeMX_Config 文件夾中,雙擊打開 CubeMX_Config.ioc 工程,如下圖所示:
在 CubeMX 工程中將芯片型號為修改芯片型號為 STM32F030R8 。
1.引腳配置:
2.配置時鐘:
3. 設(shè)置項(xiàng)目名稱,并在指定地址重新生成 CubeMX 工程:
選擇需要的依賴文件。
由于超時,暫時先不下載。也是可以的。
最終 CubeMX 生成的工程目錄結(jié)構(gòu)如下圖所示:
3.2.2 拷貝初始化函數(shù)
在 board.c 文件中存放了函數(shù) SystemClock_Config() ,該函數(shù)負(fù)責(zé)初始化系統(tǒng)時鐘。當(dāng)使用 CubeMX 工具對系統(tǒng)時鐘重新配置的時候,需要更新這個函數(shù)。
該函數(shù)由 CubeMX 工具生成,默認(rèn)存放在board/CubeMX_Config/Src/main.c 文件中。但是該文件并沒有被包含到我們的工程中,因此需要將這個函數(shù)從 main.c 中拷貝到 board.c 文件中。在整個 BSP 的制作過程中,這個函數(shù)是唯一要要拷貝的函數(shù),該函數(shù)內(nèi)容如下所示:
#include "board.h"
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
在 board.h 文件中配置了 FLASH 和 RAM 的相關(guān)參數(shù),這個文件中需要修改的是 STM32_FLASH_SIZE 和 STM32_SRAM_SIZE 這兩個宏控制的參數(shù)。本次制作的 BSP 所用的 STM32F030R8T 芯片的 flash 大小為 64k,ram 的大小為 8k,因此對該文件作出如下的修改:
#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE (64 * 1024)
#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))
/* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/
#define STM32_SRAM_SIZE 8
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
3.3 修改 Kconfig 選項(xiàng)
在本小節(jié)中修改 board/Kconfig 文件的內(nèi)容有如下兩點(diǎn):
芯片型號和系列
BSP 上的外設(shè)支持選項(xiàng)
芯片型號和系列的修改如下表所示:
宏定義 | 意義 | 格式 |
SOC_STM32F030R8 | 芯片型號 | SOC_STM32xxx |
SOC_SERIES_STM32F0 | 芯片系列 | SOC_SERIES_STM32xx |
關(guān)于 BSP 上的外設(shè)支持選項(xiàng),一個初次提交的 BSP 僅僅需要支持 GPIO 驅(qū)動和串口驅(qū)動即可,因此在配置選項(xiàng)中只需保留這兩個驅(qū)動配置項(xiàng),Kconfig如下圖所示:
menu "Hardware Drivers Config"
config SOC_STM32F030R8
bool
select SOC_SERIES_STM32F0
default y
menu "Onboard Peripheral Drivers"
endmenu
menu "On-chip Peripheral Drivers"
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN
default y
config BSP_USING_UART2
bool "Enable UART2"
select RT_USING_SERIAL
default y
endmenu
menu "Board extended module Drivers"
endmenu
endmenu
3.4 修改工程構(gòu)建相關(guān)文件
接下來需要修改用于構(gòu)建工程相關(guān)的文件。
3.4.1 修改鏈接腳本
linker_scripts 鏈接文件如下圖所示:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00002000 { ; RW data
.ANY (+RW +ZI)
}
}
本次制作 BSP 使用的芯片為 STM32F030R8,F(xiàn)LASH 為 64k,因此修改 LR_IROM1 和 ER_IROM1 的參數(shù)為 0x00010000。RAM 的大小為8k, 因此修改 RW_IRAM1 的參數(shù)為 0x00002000。這樣的修改方式在一般的應(yīng)用下就夠用了,后續(xù)如果有特殊要求,則需要按照鏈接腳本的語法來根據(jù)需求修改。
3.4.2 修改構(gòu)建腳本
SConscript 腳本決定 MDK/IAR 工程的生成以及編譯過程中要添加文件。
在這一步中需要修改芯片型號以及芯片啟動文件的地址,修改內(nèi)容如下圖所示:
import os
import rtconfig
from building import *
Import('SDK_LIB')
cwd = GetCurrentDir()
# add general drivers
src = Split('''
board.c
CubeMX_Config/Src/stm32f0xx_hal_msp.c
''')
path = [cwd]
path += [cwd + '/CubeMX_Config/Inc']
startup_path_prefix = SDK_LIB
if rtconfig.CROSS_TOOL == 'gcc':
src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc/startup_stm32f030x8.s']
elif rtconfig.CROSS_TOOL == 'keil':
src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f030x8.s']
elif rtconfig.CROSS_TOOL == 'iar':
src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f030x8.s']
# STM32F030x6 || STM32F030x8 || STM32F031x6
# STM32F038xx || STM32F042x6 || STM32F048xx
# STM32F070x6 || STM32F051x8 || STM32F058xx
# STM32F071xB || STM32F072xB || STM32F078xx
# STM32F070xB || STM32F091xC || STM32F098xx || STM32F030xC
# You can select chips from the list above
CPPDEFINES = ['STM32F030x8']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
Return('group')
注意:如果在文件夾中找不到相應(yīng)系列的 .s 文件,可能是多個系列的芯片重用了相同的啟動文件,此時可以在 CubeMX 中生成目標(biāo)芯片的工程,查看使用了哪個啟動文件,然后再修改啟動文件名?!揪褪窃谙旅娴奈募A下】
3.4.3 修改工程模板
template 文件是生成 MDK/IAR 工程的模板文件,通過修改該文件可以設(shè)置工程中使用的芯片型號以及下載方式。MDK4/MDK5/IAR 的工程模板文件,如下圖所示:
下面以 MDK5 模板的修改為例,介紹如何修改模板配置:
選擇芯片型號:
修改程序下載方式:
3.5 重新生成工程
重新生成工程需要使用 env 工具。
3.5.1 重新生成 rt_config.h 文件
在 env 界面輸入命令 menuconfig 對工程進(jìn)行配置,并生成新的 rt_config.h 文件。如下圖所示:
我的為什么沒有DMA?
說明:默認(rèn)只初始化 GPIO 驅(qū)動和 FinSH 對應(yīng)的串口驅(qū)動,不使用 DMA
在 rt_hw_board_init 中需要完成堆的初始化:調(diào)用 rt_system_heap_init
重新生成工程成功:
到這一步為止,新的 BSP 就可以使用了。
都得先用scons –target=mdk5,然后在mdk中編譯才能通過。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。