熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專欄

EEPW首頁 > 博客 > RT-Thread 創(chuàng)建一個標(biāo)準(zhǔn)工程

RT-Thread 創(chuàng)建一個標(biāo)準(zhǔn)工程

發(fā)布人:電子禪石 時間:2018-12-30 來源:工程師 發(fā)布文章

問題:

如何在原有的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 制作教程

https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97BSP%E5%88%B6%E4%BD%9C%E6%95%99%E7%A8%8B.md

BSP 的制作過程分為如下五個步驟:

  1. 復(fù)制通用模板

  2. 使用 CubeMX 工具配置工程

  3. 修改 BSP 中的 Kconfig 文件

  4. 修改構(gòu)建工程相關(guān)文件

  5. 重新生成工程

3.1復(fù)制通用模板

本次制作的 BSP 為 F0 系列,因此拷貝模板文件夾下的 stm32f0xx 文件夾,并將該文件夾的名稱改為 stm32f020-miao ,如下圖所示:

1.png

在接下來的 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 工程,如下圖所示:

2.png

在 CubeMX 工程中將芯片型號為修改芯片型號為 STM32F030R8 。

1.引腳配置:

3.png

 

2.配置時鐘:

4.png

3. 設(shè)置項(xiàng)目名稱,并在指定地址重新生成 CubeMX 工程:

5.png

選擇需要的依賴文件。

6.png7.png

由于超時,暫時先不下載。也是可以的。

最終 CubeMX 生成的工程目錄結(jié)構(gòu)如下圖所示:

8.png

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_SIZESTM32_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下】

9.png

 

3.4.3 修改工程模板

template 文件是生成 MDK/IAR 工程的模板文件,通過修改該文件可以設(shè)置工程中使用的芯片型號以及下載方式。MDK4/MDK5/IAR 的工程模板文件,如下圖所示:

10.png

下面以 MDK5 模板的修改為例,介紹如何修改模板配置:

選擇芯片型號:

11.png

修改程序下載方式:

12.png

3.5 重新生成工程

重新生成工程需要使用 env 工具。

3.5.1 重新生成 rt_config.h 文件

在 env 界面輸入命令 menuconfig 對工程進(jìn)行配置,并生成新的 rt_config.h 文件。如下圖所示:

13.png

我的為什么沒有DMA?

說明:默認(rèn)只初始化 GPIO 驅(qū)動和 FinSH 對應(yīng)的串口驅(qū)動,不使用 DMA

在 rt_hw_board_init 中需要完成堆的初始化:調(diào)用 rt_system_heap_init

14.png

 

重新生成工程成功:

15.png

到這一步為止,新的 BSP 就可以使用了。

都得先用scons –target=mdk5,然后在mdk中編譯才能通過。

16.png



*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉