FreeRTOS移植到STM32F103

发布者:暮烟微雨最新更新时间:2019-03-07 来源: eefocus关键字:FreeRTOS  移植  STM32F103 手机看文章 扫描二维码
随时随地手机看文章

1.创建工程



2.将FreeRTOS源码,拷贝到工程目录



3.删除其它架构和编译器的代码


查看portable文件夹发现


MemMang为内存管理相关文件需要保留


Commom里面有个mpu相关代码,我们不使用mpu,可以删除



我们的开发环境是keil,打开keil文件夹,提示我们参照RVDS,因此保留RVDS,其它删除



打开RVDS文件夹



STM32F103的内核为CORTEX-M3,删除其它架构相关文件



4.将FreeRTOS文件添加进工程



添加好之后,编译出现错误,缺少FreeRTOSConfig.h文件



5.添加配置文件


从FreeRTOS的demo程序中,将FreeRTOSConfig.h文件拷贝过来



重新编译,无错误无警告



6.修改异常向量入口


我们知道SVC用于产生系统函数的调用请求,需要立即得到响应。SysTick用于产生系统节拍。PendSV用于悬起延迟处理。


在FreeRTOS的port.c中定义了这个三个异常的处理入口,分别为vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。


在stm32f10x_it.c中也定义了这个三个异常的处理入口,分别为SVC_Handler、PendSV_Handler、SysTick_Handler。


因此,我们需要将异常处理入口指向由原来的SVC_Handler、PendSV_Handler、SysTick_Handler改变为vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。


注释掉原来的异常处理入口函数



在FreeRTOSConfig.h中重新定义异常处理入口函数



7.测试移植是否成功,创建rcc.h、rcc.c、nvic.h、nvic.c、freertos.c五个文件。



/**

***********************************

* 文件名:rcc.h

* 作者: stone

* 版本: V0.1

* 日期: 2018-3-29

* 描述: 配置时钟源

***********************************

*/

#ifndef __RCC_H_

#define __RCC_H_

 

/* 功能: RCC时钟配置

参数: 无

   返回值:无

 */

void rcc_config(void);

 

#endif

/**

***********************************

* 文件名: rcc.c

* 作者: stone

* 版本: V0.1

* 日期: 2018-3-29

* 描述: 配置时钟源

***********************************

*/

#include "stm32f10x.h"

#include "stm32f10x_flash.h"

#include "rcc.h"

 

/* 功能: RCC时钟配置

参数: 无

   返回值:无

 */

void rcc_config(void)

ErrorStatus HSEStartUpStatus;

 

/* RCC寄存器设置为默认配置 */

RCC_DeInit();


/* 打开外部高速时钟 */

RCC_HSEConfig(RCC_HSE_ON);

/* 等待外部高速时钟稳定 */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) 

/* 设置HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* 设置PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* 设置PCLK1 = HCLK / 2 */

RCC_PCLK1Config(RCC_HCLK_Div2);


/* 设置FLASH代码延时 */

FLASH_SetLatency(FLASH_Latency_2);

/* 使能预取址缓存 */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


/* 设置PLL时钟源为HSE倍频9 72MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* 使能PLL */

RCC_PLLCmd(ENABLE);

/* 等待PLL稳定 */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);


/* 设置PLL为系统时钟源 */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* 等待系统时钟源切换到PLL */

while(RCC_GetSYSCLKSource() != 0x08);

 

/* 设置系统节拍器时钟源为FCLK */

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

}

}

/**

***********************************

* 文件名: nvic.h

* 作者: stone

* 版本: V0.1

* 日期: 2018-3-29

* 描述: 设置中断控制器

***********************************

*/

#ifndef __NVIC_H_

#define __NVIC_H_

 

/* 功能: 中断嵌套控制器配置

   参数: 无

   返回值:无

 */

void nvic_config(void);

 

#endif

/**

***********************************

* 文件名: nvic.c

* 作者: stone

* 版本: V0.1

* 日期: 2018-3-29

* 描述: 设置中断控制器

***********************************

*/

#include "stm32f10x.h"

#include "nvic.h"

 

/* 功能: 中断嵌套控制器配置

   参数: 无

   返回值:无

 */

void nvic_config(void)

{

/* 选择中断分组4 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

}

/**

***********************************

* 文件名: main.c

* 作者: stone

* 版本: V0.1

* 日期: 2018-3-29

* 描述: 主文件

***********************************

*/

#include "stm32f10x.h"

#include "rcc.h"

#include "nvic.h"

#include "FreeRTOS.h"

#include "task.h"

 

/* 硬件初始化 */

static void prvSetupHardware(void);

/* freertos初始化 */

void freertos_init(void);

 

/* 主函数 */

int main(void)

{

/* 硬件初始化 */

prvSetupHardware();


/* freertos初始化 */

freertos_init();


/* 启动调度器 */

vTaskStartScheduler();

}

 

/* 硬件初始化 */

static void prvSetupHardware(void)

{

/* 时钟配置 */

rcc_config();


/* 中断嵌套控制器配置 */

nvic_config();

}

/**

***********************************

* 文件名: freertos.c

* 作者: stone

* 版本: V0.1

* 日期: 2019-2-25

* 描述: 系统对象创建

***********************************

*/

#include "FreeRTOS.h"

#include "task.h"

 

/* 测试任务1 */

void test1Task(void *argument);

/* 测试任务2 */

void test2Task(void *argument);

 

/* 功能: freertos初始化

参数: 无

   返回值:无

 */

void freertos_init(void)

{

/* 创建测试任务1 */

xTaskCreate(test1Task, "test1", 128, NULL, 3, NULL );


/* 创建测试任务2 */

xTaskCreate(test2Task, "test2", 128, NULL, 3, NULL );

}

 

/* 功能: 测试任务1

参数: 创建时传入

   返回值:无

 */

void test1Task(void *argument)

{

/* 主循环 */

  for(;;)

  {

/* 延时1秒 */

    vTaskDelay(1000);

  }

}

 

/* 功能: 测试任务2

参数: 创建时传入

   返回值:无

 */

void test2Task(void *argument)

{

/* 主循环 */

  for(;;)

  {

/* 延时1秒 */

    vTaskDelay(1000);

  }

}

使用j-link调试,在任务1和任务2中分别打上断点,系统调度正常

移植成功。


关键字:FreeRTOS  移植  STM32F103 引用地址:FreeRTOS移植到STM32F103

上一篇:stm32F4XX之AD采样 HAL库
下一篇:STM32之SDIO例程

推荐阅读最新更新时间:2024-03-16 16:25

U-Boot在基于ADSP BF533的嵌入式Linux系统上的移植
1 引言 Boot Loader(内核引导程序)是在操作系统内核运行之前运行的一段自举程序,用于初始化硬件设备、改变处理器运行模式、重组中断向量和建立内存空间映射图,从而将系统的软硬件带到一个合适的状态或者用户定制的特定状态,以便为最终加载操作系统内核准备好正确的环境 。 嵌入式Linux系统常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全称Universal Boot Loader)是当前比较流行的遵循GPL条件的开放源码项目。U-Boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持种引导方式;具有功能强大
[嵌入式]
【Linux高级驱动】触摸屏驱动的移植
触摸屏驱动的移植 流程 注意:看框架图 1.添加input.c组件 Device Drivers --- Input device support --- Generic input layer (needed for keyboard, mouse, ...) 2.添加evdev.c组件 Device Drivers --- Input device support --- * Event interface 3.添加s3c2410_ts.c触摸屏驱动 修改driver/input/touchscreen/Kconfig config TOUCHSCREEN_S3C2410 tristate Samsun
[单片机]
μC/OS-II在几种处理器上的移植介绍
  μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效紧凑的特点。它执行效率高,占用空间小,可移植性强,实时性能良好且可扩展性强。采用μC/OS-II实时操作系统,可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应;采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。μC/OS-11非常适合应用在一些小型的嵌入式产品应用场合,在家用电器、机器人、工业控制、航空航天、军事科技等领域有着广泛的应用。   单片机、ARM、FPGA与μC/OS-II操作系统相结合,实现一些具体功能,是目前嵌入式应用中比较常见的。在这些应用中,基础性的工作就是操作系统的移植。本文选取使
[单片机]
μC/OS-II在几种处理器上的<font color='red'>移植</font>介绍
U-BOOT移植心得
最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。 参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。 U-BOOT的两个阶段启动过程:(2010.06经典版来说) 第一阶段:start.S的路径位于archarmcpuarm920t这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到
[单片机]
STM32F103C8T6+温湿度传感器DHT11实现温湿度采集
通信原理 单总线通信 DHT11器件采用简化的单总线通信。单总线只有一根数据线,主从机之间的数据交换、控制命令等均由单总线完成。在单总线系统中,只有当主机呼叫从机时,从机才能应答。 挂载于单总线上的设备,必须通过一个漏极开路或三态端口连接至该数据线,以允许设备在不发生数据时能够释放总线。单总线通常要求外接一个4.7kΩ的上拉电阻,这样,当总线闲置时,总线上始终是高电平 传输数据位定义 一次传送40位数据,高位先出。数据格式位: 8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位。 注:其中湿度小数部分为0。 校验位的数据定义: “8bit湿度整数数据+8bit
[单片机]
<font color='red'>STM32F103</font>C8T6+温湿度传感器DHT11实现温湿度采集
STM32HAL库移植中景园库函数代码
为电赛做准备,随手练习移库,在监测电压的基础上,移植中景园的库到 hal库 里面 视频参考这个: 0xA1-OLED-STM32CubeMx配置 I2C并移植OLED驱动程序(基于ssd1306) 说的特别棒! 没基础看这个: 单片机stm32第14课(跨单片机移植tm1638程序) 下面是我移植前面的代码(固件库): main.c: // //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //中景园电子 //店铺地址:http://shop73023976.taobao.com/?spm=2013.1.0.0.M4PqC2 // // 文 件 名 : main.c // 版 本 号 :
[单片机]
STM32HAL库<font color='red'>移植</font>中景园库函数代码
将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题
移植fatfs遇到了诸多问题,很是苦恼啊,移植成功思来之不易,特分享一下经验。硬件是STM32F103RBT6内存只有20kB,Flash只有128KB,考虑到内存有限,就不能支持长文件名了,在原子论坛上下载的所以要改动,在此感谢原子论坛给我带来的帮助还有安富莱论坛 http://bbs.armfly.com/read.php?tid=3601 给我带来的启示。另外硬件还有一个大的相机的SD卡,网上买的模块当然也可以自己焊接一个,采用SPI接口,SPI1和SPI2都行,看图 移植前做了大量准备,在网上尤其是原子论坛翻看各种其他人移植的心得,去fatfs的官方网站下载0.10版本的程序,看各种相关的移植心得,文档版本众多,眼花缭
[单片机]
将FATFS<font color='red'>移植</font>STM32RBT6遇到的挂载不成功和返回值问题
linux 2.6.32 在arm9(s3c2440)平台的移植 - LCD背光驱动
LCD背光是通过 CPU的 LCD_PWR引脚来控制的, 当LCD_PWR输出1, 亮 , 输出0则灭. 以下的代码均参考mini2440的移植手册 (1)新建/drivers/video/mini2440_backlight.c #include linux/errno.h #include linux/kernel.h #include linux/module.h #include linux/slab.h #include linux/input.h #include linux/init.h #include linux/serio.h #include linux/delay.h #include
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved