STM32F10x SPL V3.6.2 集成 FreeRTOS v202112
STM32F10x SPL 集成 FreeRTOS
在整理 GCC Arm 工具链的Bluepill代码示例, 常用外设都差不多了, 接下来是 FreeRTOS, 网上查到的基本上都是基于旧版本的集成, STM32 SPL版本3.5.0, FreeRTOS版本9.x或者10.x, 不如自己用新版本集成一下. 顺便做个笔记.
转载请标明出处: https://www.cnblogs.com/milton/p/16740075.html
软件版本
STM32F10x_StdPeriph_Driver V3.6.2
上一个版本V3.6.1发布于2012年, 因为HAL的存在, 都以为SPL不会再更新了, 但是没想到在时隔九年后, 2021年又发布了V3.6.2.
FreeRTOSv202112.00
这个版本也发布了好一阵了, 一直没见新的版本, LTS是202012.05, 比这个还早一年, 先用这个吧.
GCC Arm 11.2-2022.02
使用的 gcc-arm-11.2-2022.02-x86_64-arm-none-eabi, 次新的版本.
集成的要点
前提
已经有可以使用 GCC Arm 工具链编译的基于 SPL V3.6.2 的项目模板
需要复制的文件
从 https://www.freertos.org/下载 FreeRTOS 202112.00 , 文件比较大, 但是实际上需要的文件很少. 解开后到 FreeRTOS/Source 目录下, 复制以下的文件到项目目录下
- FreeRTOS/Source/include 整个目录, 这些是头文件
- FreeRTOS/Source 下的所有C文件
- FreeRTOS/Source/portable/GCC/ARM_CM3 目录, 这是针对 STM32F103 的适配文件
- FreeRTOS/Source/portable/MemMang 目录, 里面包含一些现成的内存管理实现
放到项目下, 目录结构是这样的
FreeRTOS
├── include
│ ├── atomic.h
│ ├── croutine.h
│ ├── deprecated_definitions.h
│ ├── event_groups.h
│ ├── FreeRTOS.h
│ ├── list.h
│ ├── message_buffer.h
│ ├── mpu_prototypes.h
│ ├── mpu_wrappers.h
│ ├── portable.h
│ ├── projdefs.h
│ ├── queue.h
│ ├── semphr.h
│ ├── stack_macros.h
│ ├── StackMacros.h
│ ├── stdint.readme
│ ├── stream_buffer.h
│ ├── task.h
│ └── timers.h
├── portable
│ ├── GCC
│ │ └── ARM_CM3
│ │ ├── port.c
│ │ └── portmacro.h
│ └── MemMang
│ ├── heap_1.c
│ ├── heap_2.c
│ ├── heap_3.c
│ ├── heap_4.c
│ └── heap_5.c
├── croutine.c
├── event_groups.c
├── list.c
├── queue.c
├── stream_buffer.c
├── tasks.c
└── timers.c
需要准备的文件: FreeRTOSConfig.h
可以直接使用 FreeRTOS/Demo/CORTEX_STM32F103_Keil/ 这个例子的 FreeRTOSConfig.h, 如果要避免编译中的warning, 需要加一行
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 0
里面几个可调节的项
- configMINIMAL_STACK_SIZE 最小栈尺寸, 默认为128, 需要占用的内存为 128 * 4 = 512 bytes
- configTOTAL_HEAP_SIZE 声明的堆尺寸, 默认的
( ( size_t ) ( 17 * 1024 ) )会恰好将STM32F103C8的20K内存用完
需要修改的代码: 中断处理
选项一: 替换 startup 中的中断处理函数
如果项目固定启用 FreeRTOS, 则直接在 startup 代码中修改, 对于代码中的函数名直接替换
- SVC_Handler -> vPortSVCHandler
- PendSV_Handler -> xPortPendSVHandler
- SysTick_Handler -> xPortSysTickHandler
选项二: 使用宏定义编译时替换
这个方式便于切换 FreeRTOS 和 Non-FreeRTOS 模式, 在 FreeRTOSConfig.h 中, 最后一个#endif之前添加以下代码就可以了
/* Use MACRO to replace the handlers without changing startup file */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
测试代码
以上步骤就已经完成了 FreeRTOS 的集成, 可以使用以下代码检测结果. 对于 Bluepill 板载 LED PC13 的亮灯测试.
需要注意的是, 如果使用了 FreeRTOS, 就不要再调用 SysTick_Config() 方法, 会和 FreeRTOS 冲突.
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
void vTaskFunction(void *pvParameters)
{
(void)(pvParameters); // Suppress "unused parameter" warning
while (1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
}
}
void LED_Config(void)
{
// GPIO structure for port initialization
GPIO_InitTypeDef GPIO_InitStructure;
// enable clock on APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* configure port PC13 for driving an LED
* Use GPIO_Pin_All if you want to drive the whole port
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // output push-pull mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // highest speed
GPIO_Init(GPIOC, &GPIO_InitStructure); // initialize port
}
int main(void)
{
BaseType_t xReturned;
/*
* Don't use Delay_Init(), which conflict with FreeRTOS tick handling
*/
LED_Config();
xReturned = xTaskCreate(
vTaskFunction, // Task function point
"TaskLED", // Task name
configMINIMAL_STACK_SIZE, // Use the minimum stack size, each take 4 bytes(32bit)
NULL, // Parameters
2, // Priority
NULL); // Task handler
if (xReturned != pdPASS)
{
while (1);
}
/* Start the scheduler. */
vTaskStartScheduler();
/* Will only get here if there was not enough heap space to create the idle task. */
return 0;
}
参考
- 快速上手 https://www.freertos.org/FreeRTOS-quick-start-guide.html
- 如何集成, 需要哪些文件 https://www.freertos.org/Creating-a-new-FreeRTOS-project.html
- FreeRTOS 作者 Richard Barry 的演讲,2013年 https://www.youtube.com/watch?v=1oagM_tEyeA
STM32F10x SPL V3.6.2 集成 FreeRTOS v202112的更多相关文章
- AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- Unity 下集成第三方原生 SDK,以极光厂商通道为例
Unity中集成三方SDK有两种方式: Unity 项目开发中时常有集成 Android 第三方 SDK 的需求,比如接入第三方推送,分享等功能.而第三方 SDK 的集成文档提到的往往是基于原生 An ...
- GUNS后台管理框架部署与发布
一.GUNS介绍 Guns基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl + flowable!Gun ...
- 2017 年度码云新增项目排行榜 TOP 50,为它们打“call”
2017 年度码云新增项目排行榜 TOP 50 正式出炉 !2017 结束了,我们来关注一下这一年里码云上新增的最热门的开源项目吧.此榜单根据 2017 年在码云上新增开源项目的 Watch.Star ...
- 2017 码云最火爆开源项目 TOP 50,你都用过哪些
本文转自:https://share.html5.qq.com/fx/u?r=JdjvzwC 2017 年度码云热门项目排行榜 TOP 50 出炉啦!我们根据所有开源项目在码云的用户关注度.活跃度.访 ...
- WordPress免费清新响应式博客/杂志/图片三合一主题Nana
WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...
- 码云最火爆开源项目 TOP 50,你都用过哪些?
前 20 名预览 排名软件排名软件 1zheng11AOSuite 2JFinal12Spiderman 3t-io13AG-Admin 4guns14renren-security 5hutool1 ...
- 极光推送Jpush(v3)服务端PHP版本集成(V3版本只调用推送API)
因为版本升级,极光推送的API也有了V3,功能也更丰富了,但是对于我们有的用户来说,我们还是只需要调用推送的API就够了. 下载了一份PHP服务端的SDK(下载地址:http://docs.jpush ...
- AEAI ESB V3.5.4开源发布,应用集成平台
AEAI ESB 应用集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将ESB管理控制台项目开源,目的在于满足客户与伙伴的OEM需求,以及为广大IT爱好者的集成工具提供多一种选择,多一种便利 ...
随机推荐
- JavaScript进阶内容——DOM详解
JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...
- Python常用基础语法知识点大全
记得我是数学系的,大二时候因为参加数学建模,学习Python爬虫,去图书馆借了一本Python基础书,不厚,因为有matlab和C语言基础,这本书一个星期看完了,学完后感觉Python入门很快,然后要 ...
- 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示
产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...
- 基于CentOS的IB网卡驱动安装
一.准备步骤 1.查看centos版本 cat /etc/issue或者cat /etc/redhat-release 2.查看linux版本 cat /proc/version或uname -a或 ...
- mysql玩法
如何字段名查找所在的表名 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '字段名字' select sys ...
- 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???
1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Fiddler 能捕获Android 和 Windows Phone 等 ...
- BZOJ1305/Luogu3153 [CQOI2009]dance跳舞 (network flow)
#define T 1001 #define S 0 struct Edge{ int nxt,pre,w; }e[500007]; int cntEdge,head[N]; inline void ...
- ABP vNext系列文章03---依赖注入
一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...
- Linux 03 用户管理
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 Linux ...
- html页面嵌套其他网站页面的方法
直接上代码:html页面嵌套其他网站页面的方法 <div> <!--第一种:使用object标签--> <object type="text/html" ...