打印
[单片机芯片]

【CH32V317W-R0开发板】移植FreeRTOS

[复制链接]
790|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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
  • 实现vPortSetupTimerInterrupt():配置系统定时器(如使用CH32V317的SysTick或通用定时器)。
  • void vPortSetupTimerInterrupt(void) {
        // 示例:使用SysTick(需确认CH32V317是否支持)
        SysTick_Config(SystemCoreClock / configTICK_RATE_HZ);
        NVIC_SetPriority(SysTick_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
    }
    3. 配置FreeRTOSConfig.h
    在工程中创建FreeRTOSConfig.h,定义关键参数:
  • #define configCPU_CLOCK_HZ          (SystemCoreClock)  // 实际时钟频率
    #define configTICK_RATE_HZ          (1000)             // 1ms tick
    #define configMINIMAL_STACK_SIZE    ((unsigned short)128)
    #define configTOTAL_HEAP_SIZE       ((size_t)(8 * 1024)) // 堆大小
    #define configMAX_PRIORITIES        (5)
    #define configUSE_PREEMPTION        1
    #define configUSE_IDLE_HOOK         0
    #define configUSE_TICK_HOOK         0
    #define configSUPPORT_DYNAMIC_ALLOCATION 1
    4. 中断与异常处理
    • 中断向量表:确保FreeRTOS的中断入口(如vPortSysTickHandler)正确链接到硬件向量表。
      • 在启动文件(如startup_ch32v317.s)中,将SysTick_Handler重定向到FreeRTOS的处理函数:
      • .weak SysTick_Handler
        .set SysTick_Handler, vPortSysTickHandler

    5. 内存保护
  • 如果使用MPU(内存保护单元),需在FreeRTOSConfig.h中禁用或配置:
  • #define configENABLE_MPU 0
    6. 测试
    WCH 的 MounRiver Studio 使用 RISC-V GCC 工具链,需确保链接脚本(.ld)保留 FreeRTOS 所需的内存区域(如栈、堆)。
    中断向量表可能需手动对齐。
  • 初始化硬件:在main()中先初始化时钟和外设,再启动FreeRTOS调度器:


  • #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 为硬件定时器。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

粉丝