娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

GD32 RISC-V系列 BSP框架制作與移植

發布者:VelvetDreamer最新更新時間:2024-11-04 來源: elecfans關鍵字:GD32  移植 手機看文章 掃描二維碼
隨時隨地手機看文章

熟悉RT-Thread的朋友都知道,RT-Thread提供了許多BSP,但不是所有的板子都能找到相應的BSP,這時就需要移植新的BSP。RT-Thread的所有BSP中,最完善的BSP就是STM32系列,但從2020年下半年開始,國內出現史無前例的芯片缺貨潮,芯片的交期和價格不斷拉升,STM32的價格也是水漲船高,很多朋友也在考慮使用國產替代,筆者使用的兆易創新的GD32系列,我看了下RT-Thread中GD系列BSP,都是玩家各自為政,每個人都是提交自己使用的板子的BSP,充斥著大量冗余的代碼,對于有強迫癥的我就非常不爽,就根據手頭的板子,參看STM32的BSP架構,構建了GD32的BSP架構。


目前筆者已經完成了ARM架構和RISC-V架構的移植,關于ARM架構的移植可以看我以前的文章,本文將要講解基于RISC-V架構的移植。


筆者使用的開發板是兆易創新設計的GD32VF103V-SEVAL開發板。其主控芯片為GD32VF103VB,主頻 108MHz,128KB FLASH,32KB RAM,資源還算豐富。

pYYBAGKy-yaAZMK1AAHDDFLltVo796.png


1 BSP框架制作

在具體移植GD32VF103V-SEVAL的BSP之前,先做好GD32 RISC-V系列的BSP架構。BSP框架結構如下圖所示:

poYBAGKy-zKAOvYGAACIroKhBts181.png

BSP架構主要分為三個部分:libraries、tools和具體的Boards,其中libraries包含了GD32的通用庫,包括每個系列的Firmware Library以及適配RT-Thread的drivers;tools是生成工程的Python腳本工具;另外就是Boards文件,當然這里的Boards有很多,我這里值列舉了GD32VF103V-SEVAL。

這里先談談libraries和tools的構建,然后在后文單獨討論具體板級BSP的制作。


1.1 Libraries構建

Libraries文件夾包含兆易創新提供的固件庫,這個直接在兆易創新的官網就可以下載。

下載地址:http://www.gd32mcu.com/cn/download/

然后將GD32VF103_Firmware_Library復制到libraries目錄下,其他的系列類似。

pYYBAGKy-z2AXxdDAAAvrJRX3BE603.png

GD32VF103_Firmware_Library就是官方的文件,基本是不用大改,這里先在在文件夾中需要添加構建工程的腳本文件SConscript,其實也就是Python腳本。后面具體講解需要修改的地方。

pYYBAGKy-02AYQceAABZ4zU-8Wg632.png

SConscript文件的內容如下:

import rtconfig

from building import *


# get current directory

cwd = GetCurrentDir()


# The set of source files associated with this SConscript file.

cwd = GetCurrentDir()


src = Split('''

RISCV/env_Eclipse/handlers.c

RISCV/env_Eclipse/init.c

RISCV/env_Eclipse/your_printf.c

RISCV/drivers/n200_func.c

GD32VF103_standard_peripheral/system_gd32vf103.c

GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c

GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c

GD32VF103_standard_peripheral/Source/gd32vf103_exti.c

GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c

''')

   

if GetDepend(['RT_USING_SERIAL']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_usart.c']

   

if GetDepend(['RT_USING_I2C']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c']


if GetDepend(['RT_USING_SPI']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_spi.c']


if GetDepend(['RT_USING_CAN']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_can.c']


if GetDepend(['BSP_USING_ETH']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_enet.c']


if GetDepend(['RT_USING_ADC']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_adc.c']


if GetDepend(['RT_USING_DAC']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_dac.c']


if GetDepend(['RT_USING_HWTIMER']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_timer.c']


if GetDepend(['RT_USING_RTC']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c']

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c']


if GetDepend(['RT_USING_WDT']):

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c']

    src += ['GD32VF103_standard_peripheral/Source/gd32vf103fwdgt.c']


path = [

    cwd + '/RISCV/drivers',

    cwd + '/GD32VF103_standard_peripheral',

    cwd + '/GD32VF103_standard_peripheral/Include',]


group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path)


Return('group')

該文件主要的作用就是添加庫文件和頭文件路徑,一部分文件是屬于基礎文件,因此直接調用Python庫的Split包含,另外一部分文件是根據實際的應用需求添加的。


這里是以GD32VF1來舉例的,其他系列的都是類似的。


接下來說說Kconfig文件,這里是對內核和組件的功能進行配置,對RT-Thread的組件進行自由裁剪。


如果使用ENV環境,則在使用 menuconfig配置和裁剪 RT-Thread時體現。

poYBAGKxy_qAAKaAAADWXQnSAxc666.png

后面所有的Kconfig文件都是一樣的邏輯。下表列舉一些常用的Kconfig句法規則。

關鍵詞說明
config此關鍵字定義了一新的配置選項
menuconfig此關鍵字和前面的關鍵字很相似,但它在前面的基礎上要求所有的子選項作為獨立的行顯示。
choice/endchoice該關鍵字定義了一組選擇項。
comment這里定義了在配置過程中顯示給用戶的注釋,該注釋還將寫進輸出文件中。格式說明: comment 'eg: description content'
menu / endmenu這里定義了一個菜單,所有依賴于此菜單的選項都是它的子選項。
if/endif這里定義了if結構。
source讀取其他具體的配置文件,其他配置文件會被解析。

Kconfig的語法規則網上資料很多,自行去學習吧。

bsp/gd32/risc-v/libraries/Kconfig內容如下:

config SOC_FAMILY_GD32

    bool


config SOC_GD32VF103V

    bool

    select SOC_SERIES_GD32VF103V

    select SOC_FAMILY_GD32


最后談談gd32_drivers,這個文件夾就是GD32的外設驅動文件夾,為上層應用提供調用接口。

poYBAGKy-3eAfKUMAACv920wGQY383.png

該文件夾是整個GD32共用的,因此在編寫和修改都要慎重。關于drv_xxx文件在后句具體移植BSP的時候講解,這里主要將整體架構,SConscript和Kconfig的作用和前面的一樣,只是具體的內容不同罷了。

好了,先看bsp/gd32/risc-v/libraries/gd32_drivers/SConscript文件。


Import('RTT_ROOT')

Import('rtconfig')

from building import *


cwd = GetCurrentDir()


# add the general drivers.

src = Split('''

''')


# add pin drivers.

if GetDepend('RT_USING_PIN'):

    src += ['drv_gpio.c']


# add usart drivers.

if GetDepend(['RT_USING_SERIAL']):

    src += ['drv_usart.c']


# add i2c drivers.

if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):

    if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1') or GetDepend('BSP_USING_I2C2') or GetDepend('BSP_USING_I2C3'):

        src += ['drv_soft_i2c.c']


# add spi drivers.

if GetDepend('RT_USING_SPI'):

    src += ['drv_spi.c']


# add spi flash drivers.

if GetDepend('RT_USING_SFUD'):

    src += ['drv_spi_flash.c', 'drv_spi.c']


# add wdt drivers.

if GetDepend('RT_USING_WDT'):

    src += ['drv_wdt.c']


# add rtc drivers.

if GetDepend('RT_USING_RTC'):

    src += ['drv_rtc.c']


# add timer drivers.

if GetDepend('RT_USING_HWTIMER'):

    src += ['drv_hwtimer.c']


# add adc drivers.

if GetDepend('RT_USING_ADC'):

    src += ['drv_adc.c']


path = [cwd]


group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path)


Return('group')

和GD32VF103_Firmware_Library文件夾中的SConscript是類似的。


bsp/gd32/risc-v/libraries/gd32_drivers/Kconfig文件結構如下:


if BSP_USING_USBD

    config BSP_USBD_TYPE_FS

        bool

        # 'USB Full Speed (FS) Core'

endif

1.2 Tools構建

該文件夾就是工程構建的腳本,


import os

import sys

import shutil


cwd_path = os.getcwd()

sys.path.append(os.path.join(os.path.dirname(cwd_path), 'rt-thread', 'tools'))


def bsp_update_board_kconfig(dist_dir):

    # change board/kconfig path

    if not os.path.isfile(os.path.join(dist_dir, 'board/Kconfig')):

        return


    with open(os.path.join(dist_dir, 'board/Kconfig'), 'r') as f:

        data = f.readlines()

    with open(os.path.join(dist_dir, 'board/Kconfig'), 'w') as f:

        for line in data:

            if line.find('../libraries/gd32_drivers/Kconfig') != -1:

                position = line.find('../libraries/gd32_drivers/Kconfig')

                line = line[0:position] + 'libraries/gd32_drivers/Kconfig'n'

            f.write(line)

           

# BSP dist function

def dist_do_building(BSP_ROOT, dist_dir):

    from mkdist import bsp_copy_files

    import rtconfig


    print('=> copy gd32 bsp library')

    library_dir = os.path.join(dist_dir, 'libraries')

    library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries')

    bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE),

                   os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE))


    print('=> copy bsp drivers')

    bsp_copy_files(os.path.join(library_path, 'gd32_drivers'), os.path.join(library_dir, 'gd32_drivers'))

    shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig'))

   

    bsp_update_board_kconfig(dist_dir)

以上代碼很簡單,主要使用了Python的OS模塊的join函數,該函數的作用就是連接兩個或更多的路徑名。最后將BSP依賴的文件復制到指定目錄下。


在使用scons --dist命令打包的時候,就是依賴的該腳本,生成的dist文件夾的工程到任何目錄下使用,也就是將BSP相關的庫以及內核文件提取出來,可以將該工程任意拷貝。


需要注意的是,使用scons --dist打包后需要修改board/Kconfig中的庫路徑,因此這里調用了bsp_update_board_kconfig方法修改。


1.3 gd32vf103v-eval構建

該文件夾就gd32vf103v-eval的具體BSP文件,文件結構如下:

poYBAGKy-6OADNpSAAF0rcbhAzE765.png

在后面將具體講解如何構建該部分內容。


2 BSP移植

2.1GCC環境準備

RISC-V系列MCU使用的工具鏈是xPack GNU RISC-V Embedded GCC。

在配置交叉編譯工具鏈之前,需要下載得到GCC工具鏈的安裝包,然后解壓即可,也可配置環境變量。

GCC工具鏈下載地址:https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases/

pYYBAGKy-62AaDX4AAEAYWmd8z0776.png

根據自己的主機選擇相應的版本,下載完成解壓即可。


2.2 BSP工程制作

1.構建基礎工程

首先看看RT-Thread代碼倉庫中已有很多BSP,而我要移植的是RISC-V內核。這里參考GD32 ARM工程。最終目錄如下:


risc-v
docs #說明文檔
gd32vf103v-eval #具體BSP
libraries #庫文件
  gd32_drivers
  GD32VF103_Firmware_Library # GD官方固件庫
tools
  OpenOCD # OpenOCD下載調試工具
README.md

2.修改BSP構建腳本

bsp/gd32/risc-v/gd32vf103v-eval/SConstruct修改后的內容如下:

import os

import sys

import rtconfig


if os.getenv('RTT_ROOT'):

    RTT_ROOT = os.getenv('RTT_ROOT')

else:

    RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..')


sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]

try:

    from building import *

except:

    print('Cannot found RT-Thread root directory, please check RTT_ROOT')

    print(RTT_ROOT)

    exit(-1)


TARGET = 'rtthread.' + rtconfig.TARGET_EXT


DefaultEnvironment(tools=[])

env = Environment(tools = ['mingw'],

    AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,

    CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,

    AR = rtconfig.AR, ARFLAGS = '-rc',

    CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,

    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)

env.PrependENVPath('PATH', rtconfig.EXEC_PATH)

env['ASCOM'] = env['ASPPCOM']


Export('RTT_ROOT')

Export('rtconfig')


SDK_ROOT = os.path.abspath('./')


if os.path.exists(SDK_ROOT + '/libraries'):

    libraries_path_prefix = SDK_ROOT + '/libraries'

[1] [2] [3]
關鍵字:GD32  移植 引用地址:GD32 RISC-V系列 BSP框架制作與移植

上一篇:GD32 485發送異常最常見原因
下一篇:什么是GD32 MCU讀保護?

推薦閱讀最新更新時間:2025-06-16 17:54

[單片機框架][bsp層][cx32l003][bsp_adc] ADC配置和使用
ADC是模數轉換器轉換器 的供應商的英文簡稱,是一種能將模擬信號轉變為數字信號的電子元件。通常是將信號采樣并保持以后,再進行量化和編碼,這兩個過程是在轉化的同時實現的。 分辨率-說明AD對輸入信號的分辨能力,及數值部分的精度。一般模擬采樣中使用16位還是24位的AD芯片說的就是分辨率. 例如:輸入模擬電壓的變化范圍為0~3.3 V,輸出16位二進制數可以分辨的最小模擬電壓為3.3V / 216=0.05 mV; 轉化誤差-表示AD實際電壓與理論電壓的偏差,一般用最低有效位來表示,單位LSB,通常以相對誤差的形式出現,比如相對誤差≤±LSB/2,表明實際輸出的數字量和理論量誤差小于最低位的一半。 轉換精度-這里一般用轉化
[單片機]
[單片機<font color='red'>框架</font>][<font color='red'>bsp</font>層][cx32l003][<font color='red'>bsp</font>_adc] ADC配置和使用
如何調試GD32虛擬串口的兩個BUG?
最近魚鷹在搞調試器,折騰了好多天終于理解了 MDK 、下載算法、調試器、MCU 之間的關系。 簡單來說,就是,調試器作為 USB 轉 SWD 協議的轉換工具,MDK 通過 USB 驅動這個工具,下載算法包含了一些 MCU 內部 FLASH 擦除、編程代碼,和普通代碼不同的是,該代碼可以下載在任意位置運行。如果需要校驗,還會加入 CRC 校驗代碼,扇區檢測代碼。 MDK 首先通過調試器將算法寫入內部 RAM,然后把需要寫入的固件程序寫入 RAM,再由 MDK 控制(通過調試器) MCU 執行相應代碼(擦除或寫入扇區),通過 MCU 的寄存器和設定軟件斷點得到執行結果,如此來回搬運,就可完成固件下載。 說起來簡單,做起來很麻煩
[單片機]
如何調試<font color='red'>GD32</font>虛擬串口的兩個BUG?
關于GD32 MCU打造綠色智能家居的介紹和應用
基于綠色節能的理念,在智能家居模型中加入了蓄電池、太陽能電池板、風能發電機,以GD32 MCU為控制核心,設計了紅外檢測、人體檢測、光控LED、溫度監測和電子鎖等功能,并可通過GSM短信進行報警。 GD32F1 系列MCU產品是ARM架構的Cortex-M3處理器,其主頻為108MHz。精簡指令集架構配上百兆主頻,提供了出色的運算處理性能。為了給用戶更大的選擇空間,產品提供16KB到3072KB的FLASH容量,6KB到96KB的內部SRAM,并有QFN36、LQFP48、LQFP64、LQFP100和LQFP144多種封裝選擇。系列產品在軟件和引腳封裝方面全兼容。 GD32F1 MCU供電電壓范圍為2.6V-3.6V,內
[單片機]
關于<font color='red'>GD32</font> MCU打造綠色智能家居的介紹和應用
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(4)EXTI 中斷介紹
EXTI(中斷/事件控制器)包含多個相互獨立的邊沿檢測電路并且能夠向處理器內核產生中斷請求或喚醒事件。 EXTI 有三種觸發類型:上升沿觸發、下降沿觸發和任意沿觸發。 EXTI中的每一個邊沿檢測電路都可以獨立配置和屏蔽。 4.1.GD32 EXTI 外設原理簡介 GD32 EXTI 主要特性(以 GD32F30x 為例) ? 高效的中斷處理; ? 支持異常搶占和咬尾中斷; ? 將系統從省電模式喚醒; ? 3 種觸發類型:上升沿觸發,下降沿觸發和任意沿觸發; ? 軟件中斷或事件觸發; ? 可配置的觸發源; ? Cortex-M4系統異常; ? 多達68種可屏蔽的外設中斷; ? 4位中斷優先級配置位,可配置16個中斷優先級; ? EX
[單片機]
【<font color='red'>GD32</font> MCU 入門教程】<font color='red'>GD32</font> MCU 常見外設介紹(4)EXTI 中斷介紹
GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32
IAR版本眾多,版本之間的兼容性并不好,如果初次使用建議安裝7.3以上的版本,安裝好IAR以后再根據該文檔來添加GD的器件型號,進行相關的debug工作。 2.1 在IAR中添加GD32 MCU Device 2.1.1 從官網上下載相應的GD32系列插件。 下面以GD32F30x系列為例,下載插件IAR_GD32F30x_ADDON.1.0.0.exe: 2.1.2 運行IAR_GD32F30x_ADDON.1.0.0.exe,單擊start開始安裝插件。 2.1.3 安裝成功后單擊Finish,結束插件安裝。 2.2 在IAR中編譯調試GD32 在上一小節中我們已經添加了GD32F30x系列的插件,這一小節我們介紹
[單片機]
【<font color='red'>GD32</font> MCU 入門教程】一、<font color='red'>GD32</font> MCU 開發環境搭建(2)使用 IAR 開發 <font color='red'>GD32</font>
一文詳解GD32單片機和STM32單片機
一、GD32單片機的概念、工作原理及內部結構 1.概念 GD32單片機是中國龍芯集成電路公司推出的一款ARM Cortex-M3內核的微控制器。它具有與STM32單片機相同的架構和指令集,但是價格相比STM32更為便宜。同時,GD32單片機有著更高的品質和可靠性,成為一個理想的低成本單片機解決方案。 2.工作原理 GD32單片機的工作原理基于時鐘周期,其中時鐘周期是單片機執行機器指令的重要組成部分。單片機中的每個時鐘周期都包含多個時鐘周期,每個時鐘周期都可以執行一組基本指令。這些指令對應于單片機內部的不同部分,例如處理器、總線、存儲器、IO等。 3.內部結構 GD32單片機的內部結構包含三個主要元件:處理器、存儲器和輸
[單片機]
迅為-i.MX6ULL開發板-Busybox移植DHCP(二)
2 下載 DHCP-4.4.1 源碼 我們可以從以下鏈接下載 DHCP-4.3.6 源碼: 如圖89.2.1 所示,點擊保存,開始下載: 3 交叉編譯 DHCP-4.4.1 在 Ubuntu 的 home/topeet/目錄下新建一個 dhcp 的文件夾,將下載的文件 dhcp-4.4.1.tar.gz 拷貝到文件夾下面,如圖 89.3.1 所示: 輸入命令 tar -vxf dhcp-4.4.1.tar.gz 將文件解壓,如圖 89.3.2 所示: 解壓完成后進入解壓后的目錄,如圖 89.3.3 所示 輸入命令:chmod 777 configure 賦予 configure 權限,如圖 89.3.4 所示: 輸入命
[單片機]
迅為-i.MX6ULL開發板-Busybox<font color='red'>移植</font>DHCP(二)
rt_thread hc32f460開發五:wdt驅動移植
看門狗驅動的代碼結構和原理 參考STM32的看門狗驅動,RT-Thread中的看門狗驅動主要有兩個函數組成wdt_init和wdt_control。 其中wdt_init提供看門狗初始化,主要就是初始化看門狗依賴的時鐘,不過看門狗的功能比較簡單,init函數一般空置。wdt_control根據命令字提供喂狗、設置超時時間、獲取超時時間、啟動看門狗的功能。由于大部分的處理器對于看門狗的設置是一次性的,因此大多數工作再start的時候一次做完就OK了。 hc32f460看門狗的時鐘來自PLCK3,根據自己的頻率設置分頻系數和計數器的數值就可以了。hc32f60的計數器是16bit的,所以把看門狗的時鐘分頻道xKHZ的級別,一般就
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 安塞县| 孟津县| 阳泉市| 平乐县| 明光市| 西平县| 梓潼县| 盐亭县| 景东| 福清市| 宜川县| 南昌县| 林西县| 石河子市| 隆德县| 宣威市| 枣强县| 潢川县| 磴口县| 石首市| 壶关县| 晋州市| 靖宇县| 全州县| 方山县| 兴安盟| 县级市| 来宾市| 竹溪县| 黔江区| 无棣县| 鄂托克前旗| 珠海市| 福州市| 治多县| 财经| 米脂县| 武胜县| 平阴县| 连南| 临湘市|