STM32开发之移植FreeRtos

一、新建STM32工程项目

(1)打开keil新建工程文件夹

 (2)选择芯片型号

 接下来会弹出来一个新建工程的小助手,我们关闭就好,接下来我们的工程就创建好了,但是工程还是空的

二、添加STM32的相关固件

2.1 启动文件

(STM32的程序就是从启动文件开始执行的)

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

 2.2 STM32的外设寄存器描述文件与配置时钟相关文件

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

1.stm32f10x.h就是STM32的外设寄存器描述文件,它的作用就是和51单片机的头文件REGX52.H一样,是用来描述STM32着哪些寄存器和它对应的地址的

2.这两个system文件是用来配置时钟的;STM32主频72MHz,就是system文件里的函数配置的

 2.3 内核的寄存器描述文件

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport

 

 因为这个STM32是内核和内核外围的设备组成的,而且这个内核的寄存器描述和外围设备的描述文件不是在一起的,所以我们还需要添加一个内核寄存器的描述文件;这两个cm3(Cortex-M3)文件就是内核的寄存器描述,当然他还带了一些内核的配置函数,所以就多了个.c文件

 2.4 工程文件Start文件夹

 (1)新建Start文件夹

在新建的工程中新建一个Start文件夹将上述文件复制到Start文件夹中

 (2)将需要的文件添加到Start组中

 (3)添加Start文件夹的路径

 2.5 工程文件User文件夹

(1)新建文件夹

 (2)新建组

 (3)添加main.c文件进去

 (3)编译看看是否报错

 2.6 修改字体编码格式

(1)使用utf-8格式

 (2)修改代码的字体

 2.7 工程文件Library文件夹

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver

 (1)把这个文件夹下的.c和.h文件全部添加到Library文件夹下

 (2)新建Library组

 2.8 向User文件夹中添加conf.h和中断相关的文件

STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

stm32f10x_conf.h:用来配置库函数头文件的包含关系(还有个用来参数检查的函数定义)

两个it文件:是用来存放中断函数的

(1)工程文件夹中添加文件

 (2)keil工作组中添加文件

(3)添加宏定义

 编译没有问题

至此新建一个STM32的工程文件夹结束 

 三、使用dap-Link进行烧录

 代码下载成功

 STM32的LED开始闪烁

 四、移植FreeRtos文件

4.1 精简官方源码

(1)下载官方源码

 (2)对官方源码进行精简

 4.2 将官方源码移植到Keil工程

(1)新建组

 (2)向组内添加文件

 (3)添加头文件路径

 (4)进行编译,查看是否有问题

 (5)添加FreeRtosConfig.h文件

 (6)只留一种内存管理方式

 (7)修改FreeRtosConfig.h文件

 (7)修改中断文件将几个函数给注释掉

 最终通过上面系列操作移植成功

 五、仿真调试

(1)我们在进行仿真时会出现如下的问题

 这里我们需要点击魔术棒去配置对应的选项

Dialog DLL改为  DARMSTM.DLL

Parameter改为   -pSTM32F103ZE(此项根据具体型号而定)

 程序烧录到开发板通过串口工具打印

 

 六、全部代码

#include "stm32f10x.h"                  // Device header
#include "FreeRTOS.h" 
#include "task.h"
/* Standard includes. */
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
/* Library includes. */
#include "stm32f10x_it.h"
#include "USART.h" 
#include "semphr.h"/*
任务目的:任务一执行使PC13端口的LED灯闪烁并且在串口打印
任务二:在串口打印任务二信息
*//*************************全局变量****************************/
static SemaphoreHandle_t xSemphoreuMutexsart;//这里的全局变量使用static表示只在本文件中使用,更加规范
/******************任务句柄***************************/
TaskHandle_t xtask1TCB;
TaskHandle_t xtask2TCB;/******************任务追踪变量***************************/int task1flagrun=0;int task2flagrun=0;int task3flagrun=0;
/******************任务一***************************/
void mytask1(void*para){while(1){task1flagrun = 1;task2flagrun = 0;// 切换 LED 状态  GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));  // 延时 1 秒  vTaskDelay(pdMS_TO_TICKS(1000)); // 修改为1000ms  xSemaphoreTakeRecursive(xSemphoreuMutexsart, portMAX_DELAY);printf("task 1 is running\r\n");xSemaphoreGiveRecursive(xSemphoreuMutexsart);vTaskDelay(pdMS_TO_TICKS(1)); // 阻塞1ms,之前单位未明确,这里假设是ms }
}
/******************任务二***************************/
void mytask2(void*para){while(1){task1flagrun = 0;task2flagrun = 1;xSemaphoreTakeRecursive(xSemphoreuMutexsart, portMAX_DELAY);printf("task 2 is running\r\n");xSemaphoreGiveRecursive(xSemphoreuMutexsart);vTaskDelay(pdMS_TO_TICKS(1));}
}/*************为空闲任务创建对应的栈和堆******************/
StaticTask_t xIdelTaskTCB ;  
StackType_t xIdleTaskStack[100];  
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )  
{  *ppxIdleTaskTCBBuffer = &xIdelTaskTCB;  *ppxIdleTaskStackBuffer = xIdleTaskStack;  *pulIdleTaskStackSize = 100;  
}
int main(void){#ifdef DEBUGdebug();#endifUsart_Init();/*初始化GPIO*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 修正GPIO端口配置错误  GPIO_Init(GPIOC, &GPIO_InitStructure);  GPIO_SetBits(GPIOC, GPIO_Pin_13);  /************1.使用递归锁*************///实现互斥锁xSemphoreuMutexsart=xSemaphoreCreateRecursiveMutex();//在创建好之后就可以take了//在Take和Give时都要加上Recursive/************2.创建三个任务*************/xTaskCreate(mytask1,"task1",100,NULL,1,&xtask1TCB);xTaskCreate(mytask2,"task2",100,NULL,1,&xtask2TCB);/* Start the scheduler. */vTaskStartScheduler();//在这里创建空闲任务// 如果vTaskStartScheduler返回,则表示有错误  while (1) {  }  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建 Web 群集Haproxy

案例概述 Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如 LVS 和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xf…

【C++】模版详解

1、概念 C模版分两类&#xff1a;函数模版和类模版 1&#xff09;函数模板的格式 template <class 形参名&#xff0c;class 形参名&#xff0c;......> 返回类型 函数名(参数列表) {函数体 }例如&#xff1a; template <class T> void swap(T& a, T& b…

机器人主板维修|ABB机械手主板元器件故障

【ABB机器人电路板故障原因诊断】 针对上述故障现象&#xff0c;我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因&#xff1a; 1. 元器件老化或损坏&#xff1a;ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题&#xf…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…

NC 矩阵的最小路径和

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个 n *…

【漏洞复现】某赛通数据泄露防护(DLP)系统 NetSecConfigAjax SQL注入漏洞

0x01 产品简介 某赛通新一代数据泄露防护系统&#xff08;简称 DLP&#xff09;&#xff0c;以服务企事业单位进行数据资产梳理、数据安全防护为目标。系统采用平台化管理&#xff0c;将终端DLP、网络DLP、邮件DLP、存储扫描DLP、API 接口DLP 进行统一管理&#xff0c;模块化控…

LVS详解

目录 一、LVS简介 LVS 官网: 二、LVS 负载均衡模式 2.1 LVS-NAT模式&#xff1a; 2.1.1 简介 2.1.2 工作流程图&#xff1a; 2.1.3 说明&#xff1a; 2.1.4 LVS-NAT的优缺点&#xff1a; 2.2 LVS-DR模式&#xff1a; 2.2.1 简介 2.2.2 工作原理&#xff1a; 2.2.3 工作…

Android----Depth Anything尝鲜 小米手机部署

题目要求&#xff1a;了解Depth Anything (以及Depth Anything v2)基本原理&#xff0c;创新点。 Depth Anything 论文&#xff1a;Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data 参考代码&#xff1a;Depth-Anything-Android GitHub 分析&#xff1a; …

应急响应:D盾的简单使用.

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 D盾功…

【算法】最短路径算法思路小结

一、基础&#xff1a;二叉树的遍历->图的遍历 提到搜索算法&#xff0c;就不得不说两个最基础的思想&#xff1a; BFS&#xff08;Breadth First Search&#xff09;广度优先搜索 DFS&#xff08;Depth First Search&#xff09;深度优先搜索 刚开始是在二叉树遍历中接触这…

【vue+mathjax】mathjax的使用

方法一、引用外网的地址 第一步&#xff1a;在public/index.html中引入地址 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1" /><metaname…

力扣刷题-环形链表判断是否有环

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 首先&#xff0c;我们先来看一下这段代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool …

延时队列与redis and rabbitmq

延时队列是什么 延时队列&#xff08;Delay Queue&#xff09;是一种特殊的消息队列&#xff0c;它允许你在添加消息时设置一个延时时间&#xff0c;消息只有在延时时间到达后才能被消费。这种机制在分布式系统中非常有用&#xff0c;常用于处理需要在指定时间后执行的任务&am…

力扣面试经典算法150题:多数元素

多数元素 今天的题目是力扣面试经典150题中的数组的简单题: 多数元素 题目链接&#xff1a;https://leetcode.cn/problems/majority-element/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个大小为 n 的数组 nums&#xff0c;其中包含 n 个…

算法 二

求中点 LR&#xff0c;可能溢出 除以2&#xff0c;等同于右移一位 递归、递归的时间复杂度 母问题的规模 子问题的规模&#xff0c;且都相等 调用次数 不用展开看&#xff0c;就看一层。 归并排序 时间复杂度降低的原因&#xff1a;没有浪费比较。比如选择排序&#xff…

财务会计与管理会计(一)

文章目录 销售业绩统计图表OFFSET函数在制作图表数据中的应用 自动计算分项合计1、IF函数2、SUM函数3、SUMPRODUCT函数 自动打印快递邮寄单OFFSET函数在逐行获取数据中的应用 销售业绩统计图表 OFFSET函数在制作图表数据中的应用 B150FFSET($A$2,$M$1,COLUMN(B1)-1) B150FFSE…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]include

题目&#xff1a; 随便传入一个file 因为存在include_once函数&#xff0c;可以使用php伪协议获取flag.php源码&#xff0c;再通过base64解码得到flag。 php:// 访问各个输入/输出流&#xff0c;常用php://filter和php://input&#xff0c;php://filter用于读取源码&#xff…

LLC数字控制TMS320F28034,4-DSP的epwm配置介绍

LLC数字控制TMS320F28034&#xff0c;4-DSP的epwm配置介绍 1 TMS320F280341.1 概述1.2 PWM详细介绍 2 TMS320F28034 PWM功能框图2.1 ePWM功能模块2.2 ePWM功能寄存器框图 3 TMS320F28034 PWM初始化流程4 结合项目设计5 代码设计5.1 PWM初始化程序5.2 工程代码 6 总结 配套代码示…

Linux/C 高级——shell脚本

1. shell脚本基础概念 1.1概念 shell使用方式&#xff1a;手动下命令和脚本 脚本本质是一个文件&#xff0c;文件里面存放的是特定格式的指令&#xff0c;系统可以使用脚本解析器翻译或解析指令并执行&#xff08;它不需要编译&#xff09;。 shell脚本本质&#xff1a;shell命…