(资料图片)
前言
感谢由芯源半导体提供的物料与技术支持CW32是武汉芯源半导体生产的高性能低成本MCU,欢迎大家多多使用国产芯片,支持国产!!!开发者扶持计划由CW32生态社区与立创EDA共同合作发起,更多详细内容:开发者扶持计划-电子发烧友站内搜索 (elecfans.com)本次移植使用的硬件为官方CW32F030小蓝板,最终效果为点亮PC13的LED1,Free-RTOS源码下载
Free-RTOS源码链接进入后点击 Get Updates;等待一会就自动下载了下载解压后检查文件是否齐全一定要有这个文件,后面的移植也主要用到这个文件进去后会有四个文件夹,案例,库,源文件,测试文件2,建立文件夹
文件夹新建在你的工程里,与User同级新建一个RTOS文件夹,并添加 include protable source3,copy系统源码进入新建的工程文件
一,FreeRTOS\\Source\\include :这个文件路径里的所有 .h文件复制进新建的include文件夹中。**二,在 FreeRTOS\\Demo这个路径中寻找到关于STM32F1 系列的 Keil文件。三,在该路径中寻找到FreeRTOSConfig.h的文件,并将他复制进之前新建的include的文件夹中四,在 FreeRTOS\\Source\\portable\\MemMang路径下寻找到heap文件,并将™全部复制进 新建的peotable文件中。五, 在 reeRTOS\\Source\\portable\\RVDS\\ARM_CM0该路径下寻找到port文件,复制进新建的portble文件中六,将在该路径下出现的 .c文件都移动进新建source文件夹内。
移动后的效果
4,Keil的工程配置
下面是需要新建的组,以及添加的文件RTOS/sourceRTOS/port5,添加工程路径
选择将 RTOS下的source路径添加入内。6,修改RTOS配置
#define INCLUDE_xTaskGetCurrentTaskHandle 1#define xPortPendSVHandler PendSV_Handler#define vPortSVCHandlerSVC_Handler//#definexPortSysTickHandlerSysTick_Handler#define configUSE_PREEMPTION1#define configUSE_IDLE_HOOK0#define configUSE_TICK_HOOK0#define configCPU_CLOCK_HZ( ( unsigned long ) 48000000 )#define configTICK_RATE_HZ( ( TickType_t ) 1000 )#define configMAX_PRIORITIES( 5 )#define configMINIMAL_STACK_SIZE( ( unsigned short ) 128 )#define configTOTAL_HEAP_SIZE( ( size_t ) ( 4 * 1024 ) )#define configMAX_TASK_NAME_LEN( 16 )#define configUSE_TRACE_FACILITY0#define configUSE_16_BIT_TICKS0#define configIDLE_SHOULD_YIELD1
在中断文件interrupt_cw32f030.c内屏蔽以下函数,并添加:头文件#include "main.h"#include "interrupts_cw32f030.h"#include "cw32f030_gpio.h"#include "cw32f030_adc.h"#include "cw32f030_gtim.h"#include "FreeRTOS.h"#include "task.h"
SysTick_Handler(void)void SysTick_Handler(void){#if (INCLUDE_xTaskGetSchedulerState)if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){#endif xPortSysTickHandler();#if (INCLUDE_xTaskGetSchedulerState)}#endif}
屏蔽以下两个函数7,测试代码
注意:因为CW32F030.h内可以没有包含管脚等的.h文件,因此新建了一个mian.h 文件
**文件main.h**
#ifndef __MAIN_H#define __MAIN_H#include "base_types.h"#include "cw32f030.h"#include "system_cw32f030.h"#include "interrupts_cw32f030.h"#include "cw32f030_gpio.h"#include "cw32f030_rcc.h"#include "cw32f030_systick.h"#include "interrupts_cw32f030.h"#include "system_cw32f030.h"#endif /* __MAIN_H */
**文件main.c**
#include "CW32F030.h" // Device header#include "FreeRTOS.h"#include "main.h"#include "task.h"#include "queue.h"//code 代码空间 ro-data 常量空间 rw-data 已全局变量 zi-data 未全局变量等//**********************************// 宏定义#define LED_TASK_NVIC2//任务优先级#define LED_TASK_Size 50//任务堆栈大小TaskHandle_t LED_Task_Handler;//句柄//*******************************//函数申明void LED_task(void *pvParameters);void LED_init(){ GPIO_InitTypeDef GPIO_InitStruct;__RCC_GPIOC_CLK_ENABLE();PC13_AFx_GPIO();GPIO_InitStruct.IT = GPIO_IT_NONE;//控制脚初始化GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pins = GPIO_PIN_13;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOC, &GPIO_InitStruct);}void LED1(void *pvParameters){ int i; while(1) { PC13_SETLOW(); vTaskDelay(100);PC13_SETHIGH();vTaskDelay(100); }}int main(){ LED_init();PC13_SETLOW(); xTaskCreate(LED1, "LED1", 128, NULL, 1, &LED_Task_Handler); /* 启动调度器 */ vTaskStartScheduler(); /* 如果程序运行到了这里就表示出错了, 一般是内存不足 */ return 0;}
工程下载链接:正在审核