沁恒 CH32V208: CH32V208 运行FreeRTOS示例的说明
Posted Milton
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了沁恒 CH32V208: CH32V208 运行FreeRTOS示例的说明相关的知识,希望对你有一定的参考价值。
目录
- 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置
- 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟
- 沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置
- 沁恒 CH32V208(四): CH32V208 网络DHCP示例代码分析
- 沁恒 CH32V208(五): CH32V208 运行FreeRTOS示例的说明
硬件部分
- CH32V208WBU6 评估板
- WCH-LinkE 或 WCH-Link
软件部分
本节以沁恒的FreeRTOS示例项目为例进行说明.
示例代码位于 CH32V20xEVT 压缩包的 EVT/EXAM/FreeRTOS 目录.
对应 GCC 环境的项目代码位于 https://github.com/IOsetting/ch32v208-template/tree/main/Examples/FreeRTOS/Task/Blink
青稞V4的手册下载地址 https://www.wch.cn/downloads/QingKeV4_Processor_Manual_PDF.html
编译和烧录
这里只介绍 GCC & Makefile 环境的编译和烧录. 参考上一节进行 GCC 环境的配置
- 修改 Makefile 中的
USE_FREERTOS
选项, 设置为USE_FREERTOS ?= y
, 打开这个选项, 在编译时会包含 FreeRTOS 库相关文件 - 修改 Makefile 中的
AFILES := Libraries/Startup/startup_ch32v20x_D8W.S
, 将其替换为AFILES := Libraries/Startup/startup_ch32v20x_D8W_RTOS.S
后者禁用了硬件堆栈, 禁用了机器模式下的中断, 如果不禁用, FreeRTOS 无法正常工作 - 清空 User 目录, 将 FreeRTOS/Task/Blink 目录下的文件复制到 User 目录, 运行
make
编译项目 - 连接好 WCH-Link 和 CH32V208 评估板, 运行
make flash
烧录
运行示例
将 PA0, PA1 分别连接到 LED1 和 LED2, 观察两个GPIO任务的输出.
将评估板的串口输出连接到 WCH-Link, 在PC端使用串口工具, 波特率115200打开 /dev/ttyACM0 观察两个GPIO任务的printf输出
运行时, 除了 LED1 间隔半秒 和 LED2 间隔一秒闪烁外, 串口会打印以下内容(忽略其中的时间戳部分)
SystemClk:96000000
FreeRTOS Kernel Version:V10.4.6
task2 entry
task1 entry
32:33.611 task1 entry
32:34.611 task2 entry
task1 entry
32:35.611 task1 entry
32:36.610 task2 entry
task1 entry
32:37.611 task1 entry
32:38.611 task2 entry
task1 entry
32:39.611 task1 entry
涉及的代码改动
中断处理变动
CH32V20x 运行 FreeRTOS 时不支持硬件压栈, 中断只能使用软件压栈
在无系统场景时的中断处理
void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
就要换成不带WCH-Interrupt-fast
的中断处理
void NMI_Handler(void) __attribute__((interrupt()));
void HardFault_Handler(void) __attribute__((interrupt()));
Startup 文件变动
在 startup 文件中需要禁用硬件堆栈, 并在机器模式下禁用中断,
在无系统场景时的 0x804 和 mstatus 设置
/* Enable nested and hardware stack */
li t0, 0x3
csrw 0x804, t0
/* Enable interrupt */
li t0, 0x88
csrs mstatus, t0
就要替换为下面的设置
/* Enable nested stack, no hardware stack */
li t0, 0x2
csrw 0x804, t0
/* Machine mode, no interrupt */
li t0, 0x1800
csrs mstatus, t0
804寄存器
CSR 0x804地址对应的是 INTSYSCR, 中断系统控制寄存器. 青稞V4手册第13页.
位 | 名称 | 读写 | 描述 | 复位值 |
---|---|---|---|---|
1 | INESTEN | RW | 中断嵌套使能, 0:关闭, 1:开启 | 0 |
0 | HWSTKEN | RW | 硬件压栈使能, 0:关闭, 1:开启 | 0 |
运行 FreeRTOS 时, 需要关闭硬件压栈使能, 因此上面对 0x804 写入了 0x2.
mstatus寄存器
mstatus 是 机器模式状态寄存器, 青稞V4手册第30页, 每一位的定义为
位 | 名称 | 读写 | 描述 | 复位值 |
---|---|---|---|---|
[31:15] | -- | |||
[14:13] | FS | RW | 浮点单元状态, 00:OFF, 01:Initial, 10:Clean, 11:Dirty | 00 |
[12:11] | MPP | RW | 进中断前特权模式 | 00 |
[10:8] | -- | |||
[7] | MPIE | RW | 进中断之前中断使能状态 | 00 |
[6:4] | -- | |||
[3] | MIE | RW | 机器模式中断使能 | 00 |
[2:0] | -- |
- FS
用于描述和维护浮点单元状态, 所以该域只有在含有硬件浮点功能的青稞 V4F 微处理器上才有意义. 当其值为 0 时, 表示浮点单元为关闭状态, 且如果此时使用浮点指令, 将触发异常;若其值为 1 或 2, 当执行了浮点指令后, 该域会被更新为 3. 若用户在使用 V4F 微处理器时, 不期望使用硬件浮点功能, 可在机器模式下, 手动清除该两位, 以关闭硬件浮点并降低功耗. - MPP
用于保存进入异常或中断前的特权模式, 用于退出异常或中断后的特权模式恢复 - MPIE
用于保存进入异常或中断前的中断使能状态(MIE的值), 用于退出异常或中断后中断使能状态恢复 - MIE
全局中断使能位, 当进入异常或中断时, MPIE 的值被更新为 MIE 值, 需要注意的是青稞 V4 在最后一级嵌套中断前 MIE 不会被更新为 0, 以保证机器模式下的中断嵌套继续执行.
当退出异常或中断后, 处理器恢复为 MPP 保存的机器模式, MIE 恢复为 MPIE 保存的使能状态.
运行FreeRTOS时, 需要将 mstatus 设为 0x1800:
- 仅工作在机器模式, 把 MPP 设置为 0x11 (对应[12,11]), 使其返回后始终保持在机器模式.
- 在机器模式禁用中断使能, MIE (对应[3]) 设为 0
LD 脚本
需要增加 __freertos_irq_stack_top
锚定栈顶地址
.stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
PROVIDE( _heap_end = . );
. = ALIGN(4);
PROVIDE(_susrstack = . );
. = . + __stack_size;
PROVIDE( _eusrstack = .);
__freertos_irq_stack_top = .;
>RAM
运行 FreeRTOS 任务
这部分就是正常的 FreeRTOS 调用了
xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
vTaskStartScheduler();
参考
国产沁恒CH32F103C8T6使用指南
国产沁恒CH32F103C8T6使用指南
前言:
CH32F103芯片是由南京沁恒电子产品公司推出的国产ARM芯片,与STM32F103系列芯片相比,不仅管脚和寄存器全部兼容,而且还增强了USB功能,有2个USB,一个Host,一个Device,但在flash下载算法和内部BootLoader上和ST公司的兼容性有差别。不能使用ST的下载软件,只能使用沁恒官方提供的软件下载,可以用串口和USB两种方式,USB方式速度更快,不需要开发额外的BootLoader。另外,最突出的是,它是所有同类型芯片中价格相对最低的。
产品特点
Cortex-M3内核,72MHz系统主频;
单周期乘法和硬件除法;
20KB SRAM,64KB CodeFlash;
供电范围:2.7V-5.5V,GPIO同步供电电压;
多种低功耗模式:睡眠/停止/待机;
上电/断电复位(POR/PDR);
可编程电压监测器(PVD);
7通道DMA控制器;
12位模数转换ADC,1us转换时间;
16路TouchKey通道检测;
12位数模转换DAC;
7个定时器;
1个USB2.0 FullSpeed主机/设备接口(全速和低速);
1个USB2.0 FullSpeed设备接口(全速和低速);
1个CAN控制器(2.0B主动);
2个I2C接口(支持SMBus/PMBus);
3个USART接口;
2个SPI接口(支持Master和Slave模式);
51个I/O口,所有IO口都可以映射到16个外部中断;
CRC计算单元,96位芯片唯一ID;
串行单线调试(SWD)接口;
封装形式:LQFP64M、LQFP48、QFN48。
选型指南
下面详细介绍开发和下载的过程
CH32F103C8T6共有三种程序下载方式,分别为:ST-LINK下载,串口下载与USB下载
(一)通过ST-link(SW等仿真工具)下载
1.1开发板连接ST-link
接法与STM32芯片完全相同。
1.2 在keil工程中下载
以GPIO_PC13LED工程(工程范例见Tony的CH32私家开发包)为例:
(1)安装器件库,在“Tony的私家开发包”中找到器件库文件(必须安装才能找到器件) Keil.WCH32F1xx_DFP.1.0.0.pack,打开并安装。
(2)打开GPIO_PC13LED工程文件
(3)打开工程文件后,如下图选择器件,这里选择103C8。
(4)连接STlink后,再配置选项中的Debug项选择仿真下载器,如下图。选择好SW后,能够看到内核数值,表示硬件连接正确,否则需要检查硬件连接。
(5)添加算法文件,如图,选择flash download选项页,在该页面内选择add,增加算法,算法选择CH32F1xx Flash,然后确定。
(6)下载
程序编译成功后,点击工具栏的load工具,即可完成下载。如果下载成功,在输出栏会有下载完成提示。
(二)串口下载
(1)硬件连接:
Rx—>A9
Tx---->A10
GND–>G
VCC–>3.3
跳线boot0设置为高电平
(2)软件配置:
1.安装软件:
使用串口下载时要安装官方的专用下载软件WCHISPTool(在“Tony的私家开发包”中可以直接安装),注意ST公司的下载软件不能使用,因为内部BootLoader目前不兼容。
2.配置过程
①选择串口–>②如果usb有上拉电阻可去掉此处------>③选择下载串口号------>④选择要下载的HEX或者bin文件------->⑤下载
(三)USB下载
(1)USB连接
CH32F103有2个USB口,一个是主机usb,一个是设备usb。分别对应的管脚为:
HUSB:PB7------>D+
PB6------>D-
USB:PA12----->D+
PA11----->D-
跳线boot0设置为高电平
软件默认下载使用HUSB,因此可以用一个USB转Dip的小模块和开发板连接。
(2) 软件设置
软件设置过程
①选择USB端口–>②解除读保护------>③看到usb设备------>④选择要下载的HEX或者bin文件------->⑤下载
总结
当初入手CH32其实是因为x宝购货走眼了,以为是STM32,买回来才发现不是。不过既然买了,不能浪费啊,笔者就去官网和参考其他博主的文章进行学习,学了之后发现CH32其实也还行,在这个价位已经很不错了,国货牛x。(郑重声明:不是打广告)
特别感谢以下这篇文章的帮助!
https://blog.csdn.net/weixin_41565556/article/details/111619741
以上是关于沁恒 CH32V208: CH32V208 运行FreeRTOS示例的说明的主要内容,如果未能解决你的问题,请参考以下文章
沁恒 CH32V208: CH32V208的储存结构, 启动模式和时钟