【CW32移植Free-RTOS】CW32开发者扶持计划

电子说

1.2w人已加入

描述

前言

  • 感谢由芯源半导体提供的物料与技术支持
  • CW32是武汉芯源半导体生产的高性能低成本MCU,欢迎大家多多使用***,支持国产!!!
  • 开发者扶持计划由CW32生态社区与立创EDA共同合作发起,更多详细内容:开发者扶持计划-电子发烧友站内搜索 (elecfans.com)
  • 本次移植使用的硬件为官方CW32F030小蓝板,最终效果为点亮PC13的LED

1,Free-RTOS源码下载

CW32

  • 下载解压后检查文件是否齐全
  • 一定要有这个文件,后面的移植也主要用到这个文件

CW32

  • 进去后会有四个文件夹,案例,库,源文件,测试文件

CW32

2,建立文件夹

  • 文件夹新建在你的工程里,与User同级
  • 新建一个RTOS文件夹,并添加 include protable source

CW32

3,copy系统源码进入新建的工程文件

  • 一,FreeRTOS\\Source\\include :这个文件路径里的所有 .h 文件复制进 新建的include文件夹中。**

CW32

  • 二,FreeRTOS\\Demo 这个路径中寻找到关于STM32F1 系列的 Keil文件

CW32

  • 三,在该路径中寻找到FreeRTOSConfig.h的文件,并将他复制进之前新建的include的文件夹中

CW32

  • 四,FreeRTOS\\Source\\portable\\MemMang 路径下寻找到heap文件,并将™全部复制进 新建的peotable文件中

CW32

  • 五, reeRTOS\\Source\\portable\\RVDS\\ARM_CM0 该路径下寻找到port文件,复制进新建的portble文件中

CW32

  • 六, 将在该路径下出现的 .c文件都移动进新建source文件夹内。

    移动后的效果

CW32

4,Keil的工程配置

  • 下面是需要新建的组,以及添加的文件
  • RTOS/source
  • RTOS/port

CW32

CW32

5,添加工程路径

  • 选择将 RTOS下的source路径添加入内。

CW32

6,修改RTOS配置

#define INCLUDE_xTaskGetCurrentTaskHandle 1

#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler	SVC_Handler
//#define	xPortSysTickHandler	SysTick_Handler



#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#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_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1
  • 在中断文件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
}
  • 屏蔽以下两个函数

CW32

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_NVIC		2				//任务优先级
#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;

}

工程下载链接:正在审核

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分