完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
标签 > ch582
CH582为RISCV架构的32位微处理器,集成开发环境使用基于Eclipse的MounRiver集成开发环境,官方为CH582提供了标准的库函数,位于“。/EVT/EXAM/SRC”。
CH582集成BLE无线通讯的32位RISC-V内核微控制器。片上集成2Mbps低功耗蓝牙BLE通讯模块、2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC、触摸按键检测模块、RTC等丰富的外设资源。
CH582为RISCV架构的32位微处理器,集成开发环境使用基于Eclipse的MounRiver集成开发环境,官方为CH582提供了标准的库函数,位于“。/EVT/EXAM/SRC”。
接下来聚焦提供的标准库和TRM。
连接命令文件和系统存储资源
按照官方给的器件手册,该开发板应当包含4段Flash区域,但是连接命令文件中仅仅启用了两个,即RAM(32k),和FLASH(448k),这些资源足够应付绝大多数的应用场景。另外两个没有写明在连接命令文件中的项目分为为:
24KB 系统引导程序存储区BootLoader
8KB系统非易失配置信息存储区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段的代码和数据
__attribute__((section(“.infoflash”))) // 用来修饰需要保存在InfoFlash段的数据
这些代码保留待用。后面的具体实现过程中可能需要。
另外在连接命令文件中提供了一些常量,将来可能供汇编代码使用。(可以看完下一节之后看这里,_highcode_vma_start常量等都是通过直接在这里通过PROVIDE关键字导出的)。
另外我们需要关注到,通过“用户级非易失配置信息”配置可以使能bootloader。在使能之后才会默认从bootloader段代码开始执行。
CFG_BOOT_EN = 1; // 使能BootLoader
片上外设也分配了相应的地址,但是在连接命令文件中并没有分配相应的存储空间,这与我平时使用ti公司的相关DSP产品实现方式不同。可以从源代码中找到实现,以TMR0为例,我们可以找到下面的代码:
#define R32_TMR0_CONTROL (*((volatile unsigned long)0x40002000)) // RW, TMR0 control
可以看到源代码中也是通过直接使用volatile关键字实现对于特定外设进行配置的,但是并没有在连接命令文件中写明,也就是直接使用了宏模式,而不是使用连接命令文件绑定的变量模式。
评注:我在最开始学习TI-DSP的时候,也是通过volatile关键字直接绑定地址空间的方式来直接对外设的配置寄存器直接实现读写的。这种方法上手快,容易理解。但是TI选择使用绑定某一个外设变量和一段地址空间这种实现方式的优势在于DSP将特定的外设的一组寄存器编址在一起,可以容易地通过结构体实现访问。
初始化启动代码
接下来可以找到初始化启动代码“startup_CH583.S”,可以简单粗略地观察一下其中的布置。都是熟悉的配方,下面通过伪代码简单概括一下框架,然后逐个详细分析。
_start: // .init
jmp _handle_reset
_vector_base: // .vector
// 这里写明了所有的中断类型
// 为所有的中断函数声明了weak标识符修饰的函数
handle_reset: // .handle_reset
// 构建堆栈框架
// 将必要的代码、数据地址加载到寄存器中,
// 初始化全局变量段
// 启用芯片功能:流水线控制位 & 动态预测控制位;打开嵌套中断、硬件压栈功能; 配置向量表模式为绝对地址模式
// 将程序的控制权交给main函数
la t0, main
csrw mepc, t0
mret
与其他类型的芯片启动过程相似。如果有其他朋友需要研究其中的内容,可以仔细分析一下连接命令文件,其中提供了各类代码的加载地址。
评注:简单,明快,清晰,值得学习。
汇编-C接口
如果考虑仔细研究芯片的具体性能和芯片的一些具体实现,就需要关注RVMSIS文件夹中的两个文件。两个文件都提供了一些封装好的汇编语句,方便用户直接调用从而实现对于特定功能的使能、关闭、检测。
在core_riscv.h中提供了一系列的内联函数,主要是针对PFIC(Programmable Fast Interrupt Controller)的相关设置,东西比较细碎,不做更深入的阅读,用到再说,直接继续。
标准外设库
接下来到最关键也是作为用户最应关注的部分——外设库。接下来将逐步分析芯片具有的各类外设。
首先是片上总硬件资源汇总:2Mbps 低功耗蓝牙BLE 通讯模块、2 个全速USB主机和设备控制器及收发器、2 个SPI、4 个串口(UART)、1个I2C接口、1个12位14通道(实际写在代码中可以外界相连的数目,不包括2个内部通道)ADC、14通道的触摸按键检测模块、RTC、电源控制器。
接下来从外设库和提供手册的角度分析各个外设的使用方法和特性。
GPIO
芯片一共提供了40个IO口,其中GPIOA16个,GPIOB24个,其中GPIOB中16个通道具有输入中断功能,其他8个不具备输入中断功能。
要访问GPIO的输入输出数据需要借助引脚输入寄存器:R32_Px_PIN和引脚输出寄存器R32_Px_OUT,作为GPIO使用时,需要首先借助R32_Px_DIR寄存器写入GPIO的方向。以上的寄存器是通过位来表征每一个IO口的输入情况的。
PA 端口中
Demo板所用CH582片上集成DC-DC,使能后可进一步降低系统功耗。扫描间隔为0.5秒时,实测平均待机功耗仅约15uA。
编辑推荐厂商产品技术软件/工具OS/语言教程专题
电机控制 | DSP | 氮化镓 | 功率放大器 | ChatGPT | 自动驾驶 | TI | 瑞萨电子 |
BLDC | PLC | 碳化硅 | 二极管 | OpenAI | 元宇宙 | 安森美 | ADI |
无刷电机 | FOC | IGBT | 逆变器 | 文心一言 | 5G | 英飞凌 | 罗姆 |
直流电机 | PID | MOSFET | 传感器 | 人工智能 | 物联网 | NXP | 赛灵思 |
步进电机 | SPWM | 充电桩 | IPM | 机器视觉 | 无人机 | 三菱电机 | ST |
伺服电机 | SVPWM | 光伏发电 | UPS | AR | 智能电网 | 国民技术 | Microchip |
开关电源 | 步进电机 | 无线充电 | LabVIEW | EMC | PLC | OLED | 单片机 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 蓝牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太网 | 仿真器 | RISC | RAM | 寄存器 | GPU |
语音识别 | 万用表 | CPLD | 耦合 | 电路仿真 | 电容滤波 | 保护电路 | 看门狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 阈值电压 | UART | 机器学习 | TensorFlow |
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 |