历史上的今天
返回首页

历史上的今天

今天是: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中分别打上断点,系统调度正常

移植成功。


推荐阅读

史海拾趣

柯爱亚(ceaiya)公司的发展小趣事

在稳固国内市场的同时,柯爱亚积极寻求海外市场的发展机会。公司不仅参加了多个国际电子展览会,还与国际知名企业建立了合作关系。此外,柯爱亚还通过投资、并购等方式,不断拓展业务范围,实现了多元化发展。这些举措使柯爱亚在国际市场上的影响力逐渐增强。

Capar Components Corp公司的发展小趣事

随着电子行业的快速发展,Capar Components Corp意识到只有不断创新才能在市场中立足。于是,公司加大了对研发的投入,引进了一批高素质的技术人才。经过数年的努力,公司成功研发出了一种新型的高性能集成电路,这一创新不仅提升了产品的性能,还降低了生产成本,使公司在市场上获得了更大的竞争优势。

EVERLIGHT公司的发展小趣事

在电子产品领域,品质是企业生存和发展的关键。EVERLIGHT一直将品质管理放在首位,建立了严格的质量控制体系。公司从原材料采购到生产过程,再到产品出厂,都进行严格的品质检测和监控,确保每一颗LED都符合高标准的质量要求。这种对品质的坚持让EVERLIGHT在市场上赢得了良好的口碑,也为企业赢得了更多客户的信任。

珠海艾派克(APEXMIC)公司的发展小趣事

成立于2004年的珠海艾派克微电子有限公司,在创业初期便致力于集成电路芯片设计领域的探索。公司凭借着对CPU设计技术、多核SoC专用芯片设计技术、安全芯片设计技术等核心技术的深入研究,逐步在行业内积累了良好的口碑。这一时期,艾派克坚持以市场需求为导向,不断优化产品性能,为公司的长远发展奠定了坚实的基础。

电连(ECT)公司的发展小趣事

为了进一步扩大市场份额,ECT积极推进国际化战略。截止2022年初,公司在全球共设立23个分支机构,覆盖了中国台湾、中国香港、韩国、日本、泰国、越南、美国等国家和地区。通过国际化战略的实施,ECT不仅成功将产品推向全球市场,也提升了公司的国际影响力和竞争力。

Feller US公司的发展小趣事

在经历了多年的发展后,菲斯克逐渐意识到品牌的重要性。为了进一步提升品牌价值和市场影响力,公司决定进行品牌重塑。通过重新设计品牌形象、加强品牌宣传以及推出更具吸引力的产品和服务,菲斯克成功吸引了更多消费者的关注和喜爱。同时,公司还积极拓展市场渠道和合作伙伴网络,通过多元化的营销策略和灵活的渠道策略,成功打开了多个新的市场领域。这些努力不仅提升了公司的市场份额和盈利能力,还为公司的长期发展奠定了坚实的基础。

请注意,以上故事均基于虚构的情境和假设,旨在解释和描述菲斯克(FSR.US)公司可能的发展情况。实际的发展过程可能因各种因素而有所不同。

问答坊 | AI 解惑

德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012(五)

正文:2009年春暖花开之时,TI果然毫不迟疑的推出了能支持H.264 720P30压缩的DM365达芬奇处理器,该处理器可以认为是DM355的完善版本,除了更新了ISP之外,DM365使用了和DM355相同的 ARM926E-JS内核,使用了DM355的MJCP硬件加速器,这个加速器可以 ...…

查看全部问答>

嵌入式怎么入门,哪条路比较好走?

这个问题很多人问过了,但还是要问一下,因为和他们情况不太相同。。。 我是一名二本大三的学生,计算机专业,学过C C++ 数据结构等,也用VC做过一些程序,现在想转到嵌入式软件方面,但已经快大四了,不知道时间够不够? 第二个问题,嵌入式软件 ...…

查看全部问答>

读512M nand flash 的ID顺序颠倒的问题求助

读ID的代码如下 ;set timing value         ldr        r0,        =(7…

查看全部问答>

智能设备调试问题

大家好!请大家指点一下。 我操作的过程: 1. vs2005开发环境,开发pocket pc程序。 2. 把一些源码使用wince500 sdk工具编译成一个可独立使用的静态库,没有输出符号文件。 3. 接着我在vs2005中新建了一个智能设备解决方案平台pocket pc(wm6.0 ...…

查看全部问答>

只能看到扫描线而看不到波形

示波器正常,能看到到扫描线,但是观察被测信号时,只能看到扫描线而看不到波形,这是为什么呢?…

查看全部问答>

美科研人员制成超级电容,瞬间可完成充电

转载:http://www.powersystems.eet-china.com/ART_8800623749_2400002_NT_51116982.HTM 美国科研人员制成了一种新型超级电容(DLC,double-layer capacitors),只需200微秒的时间即可完成充电,并在交流电路的测试中获得了成功。(人类每次眨眼的时 ...…

查看全部问答>

松翰单片机sn8f2288 MSP接口做I2C通信求助

论坛里松翰单片机资料貌似很少。本人最近在用松翰单片机sn8f2288 的MSP(main series port)接口做I2C通信,从陀螺仪中读取数据,折腾了两个礼拜,还没弄出来。分析了很久我认为是MSP速率发生器设置的问题,资料中就是往MSPADR寄存器中写一个数据, ...…

查看全部问答>

鉴相检波问题

两个同相位正弦波信号通过乘法芯片AD633混频后的波形肯定有直流分量吧,怎么把直流分量给分离出来呢?用环形二极管混频电路得到的也是一个不规则的波形,那怎么把直流分量分离呢。因为如果是两个同相位郑玄波相乘的话是有一个直流分量的,另一个为 ...…

查看全部问答>

100分

得了100分,真的会有礼品吗?好几次都没机会啊,再试一下吧!!!…

查看全部问答>

modelsim如何观察内部信号

在网上查了查,未果 举个例子来说: 这里面,每个输入时钟周期CLK_counter自增1,但是我觉得有问题,想观察一下这个信号.quartus自动生成的TestBench如下: 并没有这个内部信号,在modelsim中object里面也没有这个信号,用add vawe会报错,应该是找不 ...…

查看全部问答>