历史上的今天
今天是:2025年03月07日(星期五)
2019年03月07日 | FreeRTOS移植到STM32F103
2019-03-07 来源:eefocus
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中分别打上断点,系统调度正常

移植成功。
下一篇:STM32之SDIO例程
史海拾趣
|
德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012(五) 正文:2009年春暖花开之时,TI果然毫不迟疑的推出了能支持H.264 720P30压缩的DM365达芬奇处理器,该处理器可以认为是DM355的完善版本,除了更新了ISP之外,DM365使用了和DM355相同的 ARM926E-JS内核,使用了DM355的MJCP硬件加速器,这个加速器可以 ...… 查看全部问答> |
|
这个问题很多人问过了,但还是要问一下,因为和他们情况不太相同。。。 我是一名二本大三的学生,计算机专业,学过C C++ 数据结构等,也用VC做过一些程序,现在想转到嵌入式软件方面,但已经快大四了,不知道时间够不够? 第二个问题,嵌入式软件 ...… 查看全部问答> |
|
转载:http://www.powersystems.eet-china.com/ART_8800623749_2400002_NT_51116982.HTM 美国科研人员制成了一种新型超级电容(DLC,double-layer capacitors),只需200微秒的时间即可完成充电,并在交流电路的测试中获得了成功。(人类每次眨眼的时 ...… 查看全部问答> |
|
论坛里松翰单片机资料貌似很少。本人最近在用松翰单片机sn8f2288 的MSP(main series port)接口做I2C通信,从陀螺仪中读取数据,折腾了两个礼拜,还没弄出来。分析了很久我认为是MSP速率发生器设置的问题,资料中就是往MSPADR寄存器中写一个数据, ...… 查看全部问答> |
|
在网上查了查,未果 举个例子来说: 这里面,每个输入时钟周期CLK_counter自增1,但是我觉得有问题,想观察一下这个信号.quartus自动生成的TestBench如下: 并没有这个内部信号,在modelsim中object里面也没有这个信号,用add vawe会报错,应该是找不 ...… 查看全部问答> |




