本文介紹了基于HPM SDK如何新建一個新的工程供用戶項目開發,包括HPM SDK代碼結構介紹,新BOARD適配驅動運行以及新工程的建立和注意事項。
先楫半導體面向用戶同時提供HPM SDK的集成工具集sdk_env,本文的介紹基于hpm sdk版本0.14.0,基于工具集sdk_env_v0.14.0。搭配以下費教授的教程視頻,體驗更佳哦,趕緊來一睹為快!
【先楫“芯”教程】如何創建HPM_SDK例程?
----- 以下為本指南的詳細內容 -----?
HPMSDK組成結構介紹
一、SDK ENV組成結構
整個SDK ENV組成結構如下圖所示:
doc:主要是先楫半導體官方開發的用戶指導手冊,包含 HPM6750EVK和HPM6750EVK mini的用戶指導手冊。
hpm_sdk: HPM SDK的核心軟件包。
toolchains:編譯工具鏈,主要為rv32imadc-ilp32d-x86_64-w64-mingw32
tools:主要第三方軟件和相應的處理腳本。
其他:SDK運行環境配置腳本和說明文件。
二、HPM SDK核心軟件包架構
SDK核心軟件包主要是支持完成應用軟件開發的各種組件,包含了驅動、板級支持文件、中間件、soc定義文件、實例、處理腳本、幫助文件等。如下圖所示
各個目錄的主要內容:
boards:與開發板相關的硬件定義和接口,主要為HPM6300EVK、HPM6750 EVK和HPM6750 EVK mini相關的板卡硬件信息。
cmake:與cmake和工程管理相關配置文件。
components:常用板載模塊驅動、處理邏輯和控制接口,包括camera、codec、debug_console、enet_phy、serial_nor、touch、usb等。
doc:SDK支持文檔和軟件API的支持文檔。
drivers:soc片上硬件模塊驅動、處理邏輯和控制接口。
middleware:常見算法庫、圖形庫、組件庫、RTOS等。
samples:各種應用例程。
script:與工程管理、編譯相關的處理腳本。
soc:soc片上資源寄存器定義。
utils:其他通用處理組件。
其他:處理腳步和說明文件。
新 board 添加適配
集成工具集sdk_env壓縮包解壓目錄下的start_cmd.cmd腳本可以啟動命令行環境sdk prompt, 可通過命令generate_project -list 查看當前支持的boards,可以查詢到當前支持的boards如下:
hpm6300evk
hpm6750evk
hpm6750evk2
hpm6750evkmini
在目錄hpm_sdk/boards下添加新board目錄,例如名稱:hpm6750demo,如下:
參考官方board添加新board的適配code,代碼介紹如下:
注:建議按照官方代碼結構添加。
board.c:新board硬件初始化,包括clock/console/pmp/ahb等以新board實際硬件添加相關code。
pinmux.c:新board硬件pin腳復用選擇,以新board實際外設功能添加相關code(可使用HPM pinmux tool 泡泡龍工具自動生成)。
CMakeList.txt: cmake構建腳本文件,必須添加。
hpm6750evk.yaml:yaml配置文件, 名稱同新board名稱一致。文件中包含了board的相關信息,包括openocd 仿真器的相關信息。
*openocd目錄下同步添加board cfg文件:
board硬件初始化核心內容詳解:
注意:新board以實際功能添加、刪減、修改。
(1).flash配置信息:在區域.nor_cfg_option存放flash的配置信息,包括:flash類型、頻率、電壓、片選等。
注:當新board外掛的flash和官方的型號參數不一致時,注意修改此配置。
#if defined(FLASH_XIP) && FLASH_XIP__attribute__ ((section(".nor_cfg_option"))) const uint32_t option[4] = {0xfcf90001, 0x00000007, 0x0, 0x0};#endif
(2).UF2固件頭部的簽名信息:當固件是UF2類型,簽名存放在空間.uf2_signature區域。
if defined(FLASH_UF2) && FLASH_UF2ATTR_PLACE_AT(".uf2_signature") const uint32_t uf2_signature = BOARD_UF2_SIGNATURE;#endif
(3).終端初始化:串口終端初始化。
void board_init_console(void)
(4).時鐘初始化:系統時鐘及各個外設IP時鐘組選擇初始化。
void board_init_clock(void)
(5).外設初始化及外設時鐘源配置:各個外設的初始化,包括PINMUX及功能配置。
//外設初始化void board_init_uart(UART_Type *ptr) //UART 串口初始化void board_init_ahb(void) //AHB總線初始化void board_init_sdram_pins(void) //SDRAM PIN初始化void board_init_lcd(void) //LCD初始化void board_init_i2c(I2C_Type *ptr) //I2C初始化void board_init_cap_touch(void) //TOUCH觸摸屏初始化void board_init_gpio_pins(void) //GPIO PIN初始化void board_init_spi_pins(SPI_Type *ptr) //SPI PIN初始化void board_init_led_pins(void) //LED PIN初始化void board_init_cam_pins(void) //CAM PIN初始化void board_init_can(CAN_Type *ptr) //CAN 初始化void board_init_sd_pins(SDXC_Type *ptr) //SD PIN初始化void board_init_usb_pins(void) //USB PIN初始化void board_init_pmp(void) //PMP 初始化void board_init_adc12_pins(void) //ADC12 PIN初始化
void board_init_adc16_pins(void) //ADC16 PIN初始化hpm_stat_t board_init_enet_pins(ENET_Type *ptr) //ENEN PIN初始化//外設時鐘源配置uint32_t board_init_spi_clock(SPI_Type *ptr) //SPI CLOCK配置uint32_t board_init_uart_clock(UART_Type *ptr) //UART CLOCK配置uint32_t board_init_dram_clock(void) //DRAM CLOCK配置uint32_t board_init_lcd_clock(void) //LCD CLOCK 配置uint32_t board_init_cam_clock(CAM_Type *ptr) //CAM CLOCK配置uint32_t board_init_adc12_clock(ADC12_Type *ptr) //ADC12 CLOCK配置uint32_t board_init_dao_clock(void) //DAO CLOCK配置uint32_t board_init_pdm_clock(void) //PDM CLOCK配置uint32_t board_init_i2s_clock(I2S_Type *ptr) //I2S CLOCK 配置uint32_t board_init_adc16_clock(ADC16_Type *ptr) //ADC16 CLOCK配置uint32_t board_init_can_clock(CAN_Type *ptr) //CAN CLOCK配置uint32_t board_sd_configure_clock(SDXC_Type *ptr, uint32_t freq) //SD CLOCK配置hpm_stat_t board_init_enet_ptp_clock(ENET_Type *ptr) //ENET PTP CLOCK配置hpm_stat_t board_init_enet_rmii_reference_clock(ENET_Type *ptr, bool internal) //ENET RMII CLOCK配置hpm_stat_t board_init_enet_rgmii_clock_delay(ENET_Type *ptr) //ENET RGMII delay CLOCK配置
(6). 外部SDRAM初始化:外部SDRAM初始化。
注意:當初始數據有放到外部SDRAM,必須要定義宏:INIT_EXT_RAM_FOR_DATA。(此函數在啟動start.s中被調用)
#ifdef INIT_EXT_RAM_FOR_DATA/** this function will be called during startup to initialize external memory for data use*/void _init_ext_ram(void)
通過命令generate_project -list 查看當前支持的boards:
新 工 程 創 建
在目錄hpm_sdk/samples 下包含了官方的所有參考用例。參考官方用例來創建新的工程,新的工程路徑原則上是任意的,建議用戶放到hpm_sdk之外的目錄,方便用戶后續更新hpm_sdk而不影響用戶工程。例如創建兩個工程demo1,demo2,路徑和hpm_sdk在同一個目錄下:
新工程組成介紹:
CMakeList.txt:cmake構建腳本文件,必須添加。
Linkers:當前工程使用的linker文件。當然也可以通過-t 使用官方的linker文件。
inc:工程頭文件。
src:工程源文件。
CMakeList.txt腳本文件內容介紹:
cmake_minimum_required(xxx):cmake最低版本要求,使用默認3.13即可。
set(xxx):設置要使用到的中間件、組件或linker文件。例如:set(CONFIG_LVGL 1)使能中間件LVGL(middleware/littlevgl)。set(CUSTOM_GCC_LINKER_FILE xxx)設置工程使用的linker文件。
set_compile_definitions(xxx):設置編譯器選項及宏定義。例如:set_compile_definitions(-DFLASH_XIP=1):宏定義 FLASH_XIP=1
注意:如果是FLASH_XIP的方式,一定要宏定義FLASH_XIP=1;如果初始數據使用了外部SDRAM,一定要宏定義INIT_EXT_RAM_FOR_DATA=1;或通過構建命令-t 指定。當-t指定工程類型,則當前cmakelist.txtset(CUSTOM_GCC_LINKER_FILE)指定的linker文件無效;
project(xxx): 工程名稱xxx。例如:project(demo1),demo1工程。
sdk_inc(xxx):工程頭文件路徑。
sdk_app_src(xxx):工程源文件添加,也可使用sdk_ses_src(xxx)或sdk_gcc_src(xxx)來指定為SES工程文件還是GCC工程文件。
generate_ses_project(): 構建為ses工程。
通過命令:generate_project -b hpm6750demo -f 構建生成SES工程。
注意:如果cmakelist.txt中指定了linker文件及工程類型,無需-t指定。
雙擊工程xxx_build/segger_embedded_studio/xxx.emProject文件,打開SES工程編譯調試。
至此新建工程已完成。本文主要介紹了基于sdk_env_v0.14.0如何新建一個工程。詳細介紹了新BOARD適配驅動運行以及新工程建立的注意事項。HPM SDK基于CMAKE工具來為Segger構建工程,同時用戶也可通過添加修改cmake腳本來快速新建工程,為用戶省去了繁瑣的工程配置及編譯調試環境配置,大大提升了用戶的開發效率。(欲了解參考文獻,可點擊“閱讀原文”獲取)
本期的內容就分享到這兒,如果有其他感興趣的內容,歡迎隨時留言給小編,先楫芯上人會在接下來的分享中陸續為大家呈現~
-
SDK
+關注
關注
3文章
1045瀏覽量
46246 -
HPM
+關注
關注
1文章
23瀏覽量
7787
發布評論請先 登錄
相關推薦
評論