本帖最后由 abner_ma 于 2025-7-26 17:55 编辑
沁恒单片机CH32V307EVT开发板的资料SDK非常清晰的,资料详实。从官方网站下载下来,资料架构:
文件目录
|
|-- CH32V30x:RISC-V内核微控制器
| |-- EVT: CH32V30x 评估板和CH32V30x CH32V317相关例程
| | |-- PUB:
| | | |-- CH32V30x评估板说明书.pdf:CH32V30x评估板说明及工程创建说明
| | | |-- CH32V30xSCH.pdf:CH32V30x评估板原理图
| | | |-- SCHPCB: CH32V30x评估板原理图和PCB原文件
| | |-- EXAM:
| | | |-- SRC
| | | | |-- Core:内核系统头文件
| | | | |-- Debug:延时函数、串口调试源文件及头文件
| | | | |-- Ld:ld文件
| | | | |-- Peripheral:基本外设驱动源文件及头文件
| | | | |-- Startup:启动文件。针对用户使用芯片型号包含下列相应的启动文件,同时在ch32v30x.h文件中选择匹配芯片型号定义
| | | | | |-- startup_ch32v30x_D8.S:适用于CH32V303系列
| | | | | |-- startup_ch32v30x_D8C.S:适用于CH32V307-CH32V305-CH32V317系列
| | | |-- ADC
| | | | |-- ADC_DMA:ADC使用DMA采样例程
| | | | |-- AnalogWatchdog:模拟看门狗例程
| | | | |-- Auto_Injection:自动注入模式例程
| | | | |-- Discontinuous_mode:间断模式例程
| | | | |-- DualADC_AlternateTrigger:双ADC交替触发采样例程
| | | | |-- DualADC_Combined_RegInjectionSimul:双ADC混合同步规则+注入采样例程
| | | | |-- DualADC_FastInterleaved:双ADC快速交叉采样例程
| | | | |-- DualADC_InjectionSimul:双ADC同步注入采样例程
| | | | |-- DualADC_RegSimul:双ADC同步规则采样例程
| | | | |-- DualADC_SlowInterleaved:双ADC慢速交叉采样例程
| | | | |-- ExtLines_Trigger:外部触发ADC转换例程
| | | | |-- Internal_Temperature:内部温度传感器例程
| | | | |-- Temperature_External_channel:温度传感器_外部通道交替注入例程
| | | | |-- TIM_trigger:定时器触发ADC转换例程
| | | |-- APPLICATION
| | | | |-- WS2812_LED
| | | | | |-- WS2812_LED:通过SPI\PWM操作WS2812例程
| | | |-- BKP
| | | | |-- BKP:BKP例程
| | | |-- CAN
| | | | |-- Networking:CAN例程:正常模式,标准帧和扩展帧数据收发
| | | | |-- TestMode:测试模式,包括静默模式、回环模式、回环静默模式
| | | | |-- Time-triggered:时间触发通信模式
| | | |-- CRC
| | | | |-- CRC_Calculation:CRC例程
| | | |-- DAC
| | | | |-- DAC_DMA:DAC使用DMA转换例程
| | | | |-- DAC_Exit_9_Trig:外部触发DAC转换例程
| | | | |-- DAC_Noise_Generation:噪声波形输出例程
| | | | |-- DAC_Normal_OUT:正常输出例程
| | | | |-- DAC_Timer_Trig:定时器触发DAC转换例程
| | | | |-- DAC_Triangle_Generation:三角波形输出例程
| | | | |-- DualDAC_SineWave:双DAC输出正弦波例程
| | | | |-- DualDAC_Triangle:双DAC输出三角波例程
| | | |-- DMA
| | | | |-- DMA_MEM2MEM:储存器到储存器模式例程
| | | | |-- DMA_MEM2PERIP:储存器到外设模式、外设到储存器模式例程见各外设子例程
| | | |-- DVP ——仅适用于CH32V30x_D8C
| | | | |-- DVP_TFTLCD:DVP操作OV2640摄像头视频模式在LCD显示图像例程
| | | | |-- DVP_UART:DVP操作OV2640摄像头JPEG模式例程
| | | |-- ETH ——仅适用于CH32V30x_D8C
| | | | |-- 1_Tool_Doc:例程相关文档及配置软件
| | | | |-- 8_UART_Server:8串口网络服务器演示例程
| | | | |-- DHCP:演示DHCP自动获取IP,并建立TCP连接进行数据回传
| | | | |-- DNS:DHCP自动获取ip后,再请求域名解析演示例程
| | | | |-- ETH_CFG:ETH_CFG例程,创建一个UDP Server用于与上位机通信,以配置WCHNET功能,包括各项参数以及创建一个新的通信
| | | | |-- ETH_IAP:演示通过TCP数据传输,进行IAP
| | | | |-- ETH_UART:演示以太网与UART的数据透传。默认使用1000000波特率(可在bsp_uart.h中更改)进行串口数据传输
| | | | |-- IPRaw_PING:演示PING功能
| | | | |-- Mail:演示SMTP以及POP3的邮件收发
| | | | |-- MQTT:演示基于TCP/IP的MQTT协议通讯
| | | | |-- NetLib:网络协议栈库
| | | | |-- TcpClient:演示Tcp client连接服务器后接收数据再回传
| | | | |-- TcpServer:演示Tcp Server连接到客户端后接收数据并回传
| | | | |-- UdpClient:演示Udp Client接收数据并回传
| | | | |-- UdpServer:演示Udp Server接收数据并回传
| | | | |-- ETH_Filter_Multicast:演示过滤和组播发送功能
| | | | |-- WebServer: 演示通过Web浏览器配置WCHNET芯片的功能,WCHNET芯片内置web服务器 ,通过网页可以实现WCHNET的网络参数配置,以及密码管理
| | | | |-- IoCHub
| | | | | |-- Lib: IoCHub库文件夹
| | | | | |-- IoCHub_Demo: IoCHub_Demo基础例程,通过AT指令实现IoCHub在MCU上的基础功能演示
| | | |-- EXTI
| | | | |-- EXTI0:外部中断线例程
| | | |-- FLASH
| | | | |-- FLASH_Program:FLASH的擦/读/写,以及快速编程
| | | |-- FPU
| | | | |-- FPU:FPU硬件浮点运算例程
| | | |-- FreeRTOS:FreeRTOS移植例程
| | | | |-- FreeRTOS_Core:移植FreeRTOS例程
| | | |-- FSMC
| | | | |-- LCD:FSMC操作TFTLCD例程
| | | | |-- NANDFLASH:FSMC操作NANDFLASH例程
| | | | |-- SRAM:FSMC操作NOR_SRAM例程
| | | | |-- NORFLASH:FSMC操作NORFLASH例程
| | | | |-- LCD_8bit:8bit数据总线LCD例程
| | | |-- GPIO
| | | | |-- GPIO_Toggle:GPIO例程
| | | |-- HarmonyOS
| | | | |-- LiteOS_m:HarmonyOS移植例程
| | | |-- I2C
| | | | |-- I2C_7bit_Mode:7位地址模式,Master/Slave 模式收发例程
| | | | |-- I2C_10bit_Mode:10位地址模式,Master/Slave 模式收发例程
| | | | |-- I2C_DMA:I2C使用DMA,Master/Slave 模式收发例程
| | | | |-- I2C_EEPROM:I2C接口操作EEPROM外设例程
| | | | |-- I2C_PEC:使用PEC错误校验,Master/Slave 模式收发例程
| | | | |-- I2C_7bit_Interrupt_Mode:使用中断进行收发例程
| | | |-- I2S
| | | | |-- HostRx_SlaveTx:I2S主收从发例程
| | | | |-- I2S_DMA:I2S主发从收DMA例程
| | | | |-- I2S_Interupt:I2S主发从收中断例程
| | | |-- IAP:IAP升级例程-内置Hex转Bin工具和IAP升级工具
| | | | |-- USB+UART:USB+UART IAP例程
| | | |-- INT
| | | | |-- Interrupt_Nest:中断嵌套例程
| | | | |-- Interrupt_VTF:使用VTF IRQ中断例程
| | | | |-- VectorInRAM:中断向量表在RAM中运行例程
| | | |-- IWDG
| | | | |-- IWDG:独立看门狗例程
| | | |-- OPA
| | | | |-- OPA_Voltage_Follower:OPA4作电压跟随器输出例程
| | | |-- PWR
| | | | |-- Sleep_Mode:低功耗,睡眠模式例程
| | | | |-- Standby_Mode:低功耗,待机模式例程
| | | | |-- Stop_Mode:低功耗,停机模式例程
| | | | |-- Standby_RAM_LV_Mode:待机模式开启LV时,RAM 2K、30K低功耗数据保持例程
| | | | |-- Standby_RAM_Mode:待机模式不开启LV时,RAM 2K、30K低功耗数据保持例程
| | | | |-- Standby_RAM_Application:待机模式,RAM 2K、30K低功耗数据保持应用例程
| | | | |-- PVD_Wakeup:STOP模式PVD中断唤醒例程
| | | | |-- PVD_VoltageJudger:PVD电压判定例程
| | | | |-- CH32V317_LP_Mode:CH32V317低功耗例程
| | | |-- PMP
| | | | |-- PMP:物理内存保护例程
| | | |-- RCC
| | | | |-- Get_CLK:获取system-HCLK-AHB1-AHB2时钟例程
| | | | |-- MCO:MCO引脚时钟输出例程
| | | | |-- HSI_PLL_Source:HSI或HSI/2作为PLL输入时钟例程
| | | | |-- HSE_CLK:检查HSE频率例程
| | | | |-- HSI_Calibration:HSI校准例程
| | | | |-- LSI_Calibration:LSI校准例程
| | | |-- RNG
| | | | |-- RNG:随机数发生器例程
| | | |-- RT-Thread
| | | | |-- RT_Thread_Core:RT-Thread移植例程
| | | |-- RTC
| | | | |-- RTC_Calendar:日历例程
| | | | |-- RTC_Calibration:RTC校准例程
| | | |-- SDIO
| | | | |-- SDIO_SD:SDIO操作SD卡例程
| | | | |-- SDIO_SD_FATFS:FATFS文件系统(SD卡)例程
| | | | |-- SDIO_EMMC:SDIO操作eMMC卡例程
| | | | |-- SDIO_Mode:SDIO 主机/从机 模式收发例程
| | | |-- SPI
| | | | |-- 1Lines_half-duplex:单线半双工模式,Master/Slave 模式数据收发
| | | | |-- 2Lines_FullDuplex:双线全双工模式,Master/Slave 模式数据收发
| | | | |-- FullDuplex_HardNSS:硬件NSS模式,Master/Slave 模式数据收发
| | | | |-- SPI_CRC:使用CRC错误校验,Master/Slave 模式收发例程
| | | | |-- SPI_DMA:SPI使用DMA,Master/Slave 模式收发例程
| | | | |-- SPI_FLASH:SPI接口操作FLASH外设例程
| | | | |-- SPI_LCD:SPI接口操作FLASH和LCD例程
| | | |-- SYSTICK
| | | | |-- SYSTICK_Interrupt:滴答定时器例程
| | | |-- SDI_Printf
| | | | |-- SDI_Printf:调试接口SDI虚拟串口
| | | |-- TencentOS
| | | | |-- TencentOS:TencentOS移植例程
| | | |-- TIM
| | | | |-- Clock_Select:时钟源选择例程
| | | | |-- ComplementaryOutput_DeadTime:互补输出和死区插入模式例程
| | | | |-- ExtTrigger_Start_Two_Timer:外部触发同步启动两个定时器例程
| | | | |-- Input_Capture:输入捕获例程
| | | | |-- One_Pulse:单脉冲输出例程
| | | | |-- Output_Compare_Mode:输出比较模式例程
| | | | |-- PWM_Output:PWM输出例程
| | | | |-- Synchro_ExtTrigger:从模式例程,包括复位模式、门控模式、触发模式
| | | | |-- Synchro_Timer:定时器同步模式
| | | | |-- TIM_DMA:定时器使用DMA例程
| | | | |-- Encoder:定时器编码器例程
| | | | |-- TIM_INT:定时器中断例程
| | | | |-- TIM_Continuous:定时器连续模式例程
| | | | |-- PWM_Phase_shifted:定时器PWM移向例程
| | | | |-- PWM_6_Step:定时器六步PWM例程
| | | |-- TOUCHKEY
| | | | |-- TKey:TouchKey检测例程
| | | |-- USART
| | | | |-- USART_DMA:USART使用DMA,Master/Slave 模式收发例程
| | | | |-- USART_HalfDuplex:单线半双工模式,Master/Slave 模式收发例程
| | | | |-- USART_HardwareFlowControl:硬件流控制模式,Master/Slave 模式收发例程
| | | | |-- USART_Interrupt:USART中断例程,Master/Slave 模式收发例程
| | | | |-- USART_MultiProcessorCommunication:多处理器通信模式例程
| | | | |-- USART_Polling:轮询收发模式,Master/Slave 模式收发例程
| | | | |-- USART_Printf:串口打印调试例程
| | | | |-- USART_SynchronousMode:同步模式,Master/Slave 模式收发例程
| | | | |-- USART_Idle_Recv:串口使用DMA进行不定长接收例程
| | | |-- USB
| | | | |-- USBFS
| | | | | |-- DEVICE
| | | | | | |-- CH372:模拟自定义USB设备(CH372设备),端点1,3下传,2,4上传,端点1下传的数据从端点3上传,不取反,端点2下传的数据从端点4上传,取反。
| | | | | | |-- Compatibility_HID:模拟HID设备,数据通过串口上下传。
| | | | | | |-- CompositeKM:模拟键盘和鼠标,使用IO模拟按键,同时模拟数据可以通过串口2上传。
| | | | | | |-- MSC_U-Disk: 模拟简单U盘,可选使用片内Flash或外部SPI-Flash
| | | | | | |-- MSC_CD-ROM: 模拟CDROM,需要外挂SPI-Flash
| | | | | | |-- SimulateCDC:模拟一个CDC串口,使用串口2收发
| | | | | | |-- CH372_Double_Buffering:演示USB的双缓冲,以及提供了372设备速度测试例程
| | | | | | |-- SimulateCDC-HID:模拟一个CDC串口,使用串口2收发,HID中断端点下发数据取反上传。
| | | | | | |-- UAC10_Headphone:模拟一个UAC 1.0耳机设备,并通过串口传输接收到的音频数据
| | | | | | |-- UAC10_Microphone:模拟一个UAC 1.0麦克风设备,并通过串口传输接收到的音频数据
| | | | | |-- HOST_IAP
| | | | | | |-- APP: 与HOST_IAP配套使用的APP,工程修改了程序起始位置,编译后需自行将文件转化为bin文件并重命名为APP.bin
| | | | | | |-- HOST_IAP: 基于U盘读取文件例程整理的主机U盘IAP例程,从U盘内读取名称位APP.bin的文件,写入内部flash,校验后自动跳转。
| | | | | |-- HOST_KM: 主机操作键鼠,获取键鼠上传的端点的数据并打印,支持U口下1级hub
| | | | | |-- HOST_MTP_FileSystem:枚举过程的USB主机到一个支持MTP和PTP协议的设备,支持MTP和PTP协议,并读取其文件
| | | | | |-- Host_Udisk:USB主机操作U盘例程
| | | | | |-- Udisk_Lib:U盘文件系统库文件
| | | | |-- USBHS
| | | | | |-- DEVICE
| | | | | | |-- CH372:模拟自定义USB设备(CH372设备),端点1,3下传,2,4上传,端点1下传的数据从端点3上传,不取反,端点2下传的数据从端点4上传,取反。
| | | | | | |-- Compatibility_HID:模拟HID设备,数据通过串口上下传。
| | | | | | |-- CompositeKM:模拟键盘和鼠标,使用IO模拟按键,同时模拟数据可以通过串口2上传。
| | | | | | |-- MSC_U-Disk: 模拟简单U盘,可选使用片内Flash或外部SPI-Flash
| | | | | | |-- MSC_CD-ROM: 模拟CDROM,需要外挂SPI-Flash
| | | | | | |-- USB_ECM-NetWorkAdaptor: USB ECM网卡例程
| | | | | | |-- USB_NCM-NetWorkAdaptor: USB NCM网络适配器例程
| | | | | | |-- USB_RNDIS-NetWorkAdaptor: USB RNDIS网络适配器例程
| | | | | | |-- SimulateCDC:模拟一个CDC串口,使用串口2收发。
| | | | | | |-- CH372_Double_Buffering:演示USB的双缓冲,以及提供了372设备速度测试例程
| | | | | | |-- SimulateCDC-HID:模拟一个CDC串口,使用串口2收发,HID中断端点下发数据取反上传。
| | | | | |-- HOST_IAP
| | | | | | |-- APP: 与HOST_IAP配套使用的APP,工程修改了程序起始位置,编译后需自行将文件转化为bin文件并重命名为APP.bin
| | | | | | |-- HOST_IAP: 基于U盘读取文件例程整理的主机U盘IAP例程,从U盘内读取名称位APP.bin的文件,写入内部flash,校验后自动跳转。
| | | | | |-- HOST_KM: 主机操作键鼠,获取键鼠上传的端点的数据并打印,支持U口下1级hub
| | | | | |-- HOST_MTP_FileSystem:枚举过程的USB主机到一个支持MTP和PTP协议的设备,支持MTP和PTP协议,并读取其文件
| | | | | |-- Host_Udisk:USB主机操作U盘例程
| | | | | |-- Udisk_Lib:U盘文件系统库文件
| | | |-- VoiceRcgExam
| | | | |-- VoiceRcgExam:独立词语音识别例程
| | | |-- WWDG:窗口看门狗例程
| | | | |-- WWDG:窗口看门狗例程
1. 准备工作 硬件:CH32V317开发板(如CH32V317W-R0开发板)。
软件:FreeRTOS源码(从[color=var(--eb-color-info)]官网下载)
CH32V317的标准外设库或HAL库(如[color=var(--eb-color-info)]WCH提供的库
RISC-V工具链(如riscv-none-embed-gcc)
调试工具(如WCH-Link、OpenOCD)。
2. 配置FreeRTOS移植文件
FreeRTOS的移植主要涉及以下文件(位于FreeRTOS/Source/portable/目录下):
编译器/架构适配:选择RISC-V架构的移植层(如GCC/RISC-V)。
路径:FreeRTOS/Source/portable/GCC/RISC-V
portmacro.h:定义数据类型、中断控制、上下文切换等。
port.c:实现任务切换、中断处理等。
修改portmacro.h 确认RISC-V架构配置(如CH32V317是RV32IMAC):
#define portARCH_NAME "RISC-V"
#define portHAS_STACK_ALIGNMENT 4 // 对齐要求
配置中断优先级(FreeRTOS要求中断优先级≤configMAX_SYSCALL_INTERRUPT_PRIORITY):
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 3 // 根据实际调整
修改port.c 5. 内存保护
#include "debug.h"
#include "FreeRTOS.h"
#include "task.h"
/* Global define */
#define TASK1_TASK_PRIO 5
#define TASK1_STK_SIZE 256
#define TASK2_TASK_PRIO 5
#define TASK2_STK_SIZE 256
/* Global Variable */
TaskHandle_t Task1Task_Handler;
TaskHandle_t Task2Task_Handler;
void GPIO_Toggle_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure={0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void task1_task(void *pvParameters)
{
while(1)
{
printf("task1 entry\r\n");
GPIO_SetBits(GPIOA, GPIO_Pin_0);
vTaskDelay(250);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
vTaskDelay(250);
}
}
/*********************************************************************
* @fn task2_task
*
* [url=home.php?mod=space&uid=247401]@brief[/url] task2 program.
*
* @param *pvParameters - Parameters point of task2
*
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
void task2_task(void *pvParameters)
{
while(1)
{
printf("task2 entry\r\n");
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
vTaskDelay(500);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
vTaskDelay(500);
}
}
/*********************************************************************
* @fn main
*
* [url=home.php?mod=space&uid=247401]@brief[/url] Main program.
*
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf("FreeRTOS Kernel Version:%s\r\n",tskKERNEL_VERSION_NUMBER);
GPIO_Toggle_INIT();
/* create two task */
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();
while(1)
{
printf("shouldn't run at here!!\n");
}
}
-
-
关键代码修改总结
1.FreeRTOSConfig.h:配置时钟、堆大小、任务优先级等。
2.port.c:适配 RISC-V 的上下文切换和定时器中断。
3.链接脚本(.ld):确保内存布局正确。
4.中断服务函数:替换默认 SysTick 为硬件定时器。
|