完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>
標簽 > ch582
CH582為RISCV架構(gòu)的32位微處理器,集成開發(fā)環(huán)境使用基于Eclipse的MounRiver集成開發(fā)環(huán)境,官方為CH582提供了標準的庫函數(shù),位于“。/EVT/EXAM/SRC”。
CH582集成BLE無線通訊的32位RISC-V內(nèi)核微控制器。片上集成2Mbps低功耗藍牙BLE通訊模塊、2個全速USB主機和設備控制器及收發(fā)器、2個SPI、4個串口、ADC、觸摸按鍵檢測模塊、RTC等豐富的外設資源。
CH582為RISCV架構(gòu)的32位微處理器,集成開發(fā)環(huán)境使用基于Eclipse的MounRiver集成開發(fā)環(huán)境,官方為CH582提供了標準的庫函數(shù),位于“。/EVT/EXAM/SRC”。
接下來聚焦提供的標準庫和TRM。
連接命令文件和系統(tǒng)存儲資源
按照官方給的器件手冊,該開發(fā)板應當包含4段Flash區(qū)域,但是連接命令文件中僅僅啟用了兩個,即RAM(32k),和FLASH(448k),這些資源足夠應付絕大多數(shù)的應用場景。另外兩個沒有寫明在連接命令文件中的項目分為為:
24KB 系統(tǒng)引導程序存儲區(qū)BootLoader
8KB系統(tǒng)非易失配置信息存儲區(qū)InfoFlash
如果需要使用則需要在連接命令文件中添加如下代碼:
MEMORY
{
BOOT (rx) : ORIGIN = 0x00078000, LENGTH = 24K
INFO (rw) : ORIGIN = 0x0007E000, LENGTH = 8K
}
?
SECTIONS
{
.bootloader :
{
KEEP(*(SORT_NONE(.bootloader)))
。 = ALIGN(4);
} 》BOOT AT》BOOT
.infoflash :
{
。 = ALIGN(4);
} 》INFO AT》INFO
}
在C語言代碼中如果需要使用則需要告訴鏈接器,需要保存的段,需要使用下面的聲明方法:
__attribute__((section(“.bootloader”))) // 用來修飾需要保存在BootLoader段的代碼和數(shù)據(jù)
__attribute__((section(“.infoflash”))) // 用來修飾需要保存在InfoFlash段的數(shù)據(jù)
這些代碼保留待用。后面的具體實現(xiàn)過程中可能需要。
另外在連接命令文件中提供了一些常量,將來可能供匯編代碼使用。(可以看完下一節(jié)之后看這里,_highcode_vma_start常量等都是通過直接在這里通過PROVIDE關鍵字導出的)。
另外我們需要關注到,通過“用戶級非易失配置信息”配置可以使能bootloader。在使能之后才會默認從bootloader段代碼開始執(zhí)行。
CFG_BOOT_EN = 1; // 使能BootLoader
片上外設也分配了相應的地址,但是在連接命令文件中并沒有分配相應的存儲空間,這與我平時使用ti公司的相關DSP產(chǎn)品實現(xiàn)方式不同??梢詮脑创a中找到實現(xiàn),以TMR0為例,我們可以找到下面的代碼:
#define R32_TMR0_CONTROL (*((volatile unsigned long)0x40002000)) // RW, TMR0 control
可以看到源代碼中也是通過直接使用volatile關鍵字實現(xiàn)對于特定外設進行配置的,但是并沒有在連接命令文件中寫明,也就是直接使用了宏模式,而不是使用連接命令文件綁定的變量模式。
評注:我在最開始學習TI-DSP的時候,也是通過volatile關鍵字直接綁定地址空間的方式來直接對外設的配置寄存器直接實現(xiàn)讀寫的。這種方法上手快,容易理解。但是TI選擇使用綁定某一個外設變量和一段地址空間這種實現(xiàn)方式的優(yōu)勢在于DSP將特定的外設的一組寄存器編址在一起,可以容易地通過結(jié)構(gòu)體實現(xiàn)訪問。
初始化啟動代碼
接下來可以找到初始化啟動代碼“startup_CH583.S”,可以簡單粗略地觀察一下其中的布置。都是熟悉的配方,下面通過偽代碼簡單概括一下框架,然后逐個詳細分析。
_start: // .init
jmp _handle_reset
_vector_base: // .vector
// 這里寫明了所有的中斷類型
// 為所有的中斷函數(shù)聲明了weak標識符修飾的函數(shù)
handle_reset: // .handle_reset
// 構(gòu)建堆??蚣?/p>
// 將必要的代碼、數(shù)據(jù)地址加載到寄存器中,
// 初始化全局變量段
// 啟用芯片功能:流水線控制位 & 動態(tài)預測控制位;打開嵌套中斷、硬件壓棧功能; 配置向量表模式為絕對地址模式
// 將程序的控制權(quán)交給main函數(shù)
la t0, main
csrw mepc, t0
mret
與其他類型的芯片啟動過程相似。如果有其他朋友需要研究其中的內(nèi)容,可以仔細分析一下連接命令文件,其中提供了各類代碼的加載地址。
評注:簡單,明快,清晰,值得學習。
匯編-C接口
如果考慮仔細研究芯片的具體性能和芯片的一些具體實現(xiàn),就需要關注RVMSIS文件夾中的兩個文件。兩個文件都提供了一些封裝好的匯編語句,方便用戶直接調(diào)用從而實現(xiàn)對于特定功能的使能、關閉、檢測。
在core_riscv.h中提供了一系列的內(nèi)聯(lián)函數(shù),主要是針對PFIC(Programmable Fast Interrupt Controller)的相關設置,東西比較細碎,不做更深入的閱讀,用到再說,直接繼續(xù)。
標準外設庫
接下來到最關鍵也是作為用戶最應關注的部分——外設庫。接下來將逐步分析芯片具有的各類外設。
首先是片上總硬件資源匯總:2Mbps 低功耗藍牙BLE 通訊模塊、2 個全速USB主機和設備控制器及收發(fā)器、2 個SPI、4 個串口(UART)、1個I2C接口、1個12位14通道(實際寫在代碼中可以外界相連的數(shù)目,不包括2個內(nèi)部通道)ADC、14通道的觸摸按鍵檢測模塊、RTC、電源控制器。
接下來從外設庫和提供手冊的角度分析各個外設的使用方法和特性。
GPIO
芯片一共提供了40個IO口,其中GPIOA16個,GPIOB24個,其中GPIOB中16個通道具有輸入中斷功能,其他8個不具備輸入中斷功能。
要訪問GPIO的輸入輸出數(shù)據(jù)需要借助引腳輸入寄存器:R32_Px_PIN和引腳輸出寄存器R32_Px_OUT,作為GPIO使用時,需要首先借助R32_Px_DIR寄存器寫入GPIO的方向。以上的寄存器是通過位來表征每一個IO口的輸入情況的。
PA 端口中
Demo板所用CH582片上集成DC-DC,使能后可進一步降低系統(tǒng)功耗。掃描間隔為0.5秒時,實測平均待機功耗僅約15uA。
編輯推薦廠商產(chǎn)品技術軟件/工具OS/語言教程專題
電機控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機 | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機 | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網(wǎng) | NXP | 賽靈思 |
步進電機 | SPWM | 充電樁 | IPM | 機器視覺 | 無人機 | 三菱電機 | ST |
伺服電機 | SVPWM | 光伏發(fā)電 | UPS | AR | 智能電網(wǎng) | 國民技術 | Microchip |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |