STM32CubexMX与FreeRTOS学习
目录
LED与EXTI配置
基本定时器使用
软件定时器
在HAL库中实现printf
重点--记得自己添加头文件
队列实现
二值信号量实现
计数信号量实现
DMA实现
ADC配置
RTC配置
看门狗
窗口看门狗
FreeRTOS结合MX软件开发,基础配置直接生成,我们只需要会操作即可,操作一些API函数,注意事项就是我们需要知道有哪些函数是我们写的,而哪些函数是软件自己生成的,并且我们需要知道一个外设的使用流程
LED与EXTI配置
上下拉模式和触发模式不要选择错误
对于EXTI的我们只需要操作回调函数即可,通过判断端口模式即可,再按键中我是不赞成载中断里面使用延时函数的,因此你需要学会如何避免延时函数,比如由于按键抖动我们需要多次判断,使用状态机的思维,因此我们再设置的时候,需要先关闭该中断,等检测到了真实按键按下再打开就可以了
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == WK_UP_Pin){HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); }
}
除了第一次点open之外,其余的情况点close,不然会卡,我也不知道为什么
基本定时器使用
基础定时器指:TIM6、TIM7,能完成的功能是定时、触发中断或者DMA请求(当计数器溢出产生更新事件,并且只有该事件能引起中断或DMA请求,不像其他定时器有很多中断类型。基本定时器只有更新中断) ,并且能输出触发信号TRGO---用于触发DAC同步电路
one pulse mode--表示是否使用定时器的单次定时模式,意思就是当计数器发生下一次溢出事件时,定时器就会停止计数,一般我们不使用
这里的定时时间为3.64ms--使用串口打印检测时间是否符合
定时时间计算--period * ( (1*(psc+1))/72M)
基本定时器的使用函数,其中我们使用MX创建的定时器默认是不打开的,因此我们需要手动打开一下,至于使用哪一种方式打开,取决于我们自己,常用中断工作方式
遇到的问题:我在TIM6的初始化函数中写了printf,出不来结果,原因是因为串口初始化没有完成,它在TIM6后面,因此无法在里面使用printf
HAL_TIM_Base_Start_IT(&htim6);void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint16_t count = 0;if(htim->Instance == TIM6){count++;if(count == 100) {printf("enter time6\r\n");count =0;}}
} //按理说是364ms打印一次
结果接近,因此对于基础定时器我们需要开启定时器以及知道回调函数如何写即可
软件定时器
优先级、堆栈大小,定时器指令队列长度
默认MX软件生成的定时器是没有打开的,并且并没有设置周期,因此你需要做两个操作,设置周期、打开定时器 。但是做完这些操作后,发现还是有错误,原来是头文件没有加入
#include "timers.h"xTimerChangePeriod(MyTimer0Handle,pdMS_TO_TICKS(1000),portMAX_DELAY);
xTimerStart(MyTimer0Handle,portMAX_DELAY);MyTimer0Handle---为定时器句柄
portMAX_DELAY-为阻塞时间,因为定时器的实质是使用队列完成,因此队列的接收数据和发送数据是存在阻塞时间的
在HAL库中实现printf
#include "stdio.h"//重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (uint8_t) ch; return ch; }
重点--记得自己添加头文件
队列实现
没有套路(记得加头文件),直接配置好,其余的我们只需要使用接收或者发送函数即可
if(KeyPress){KeyPress = 0;if(KeyNum == KEY0_PRESS){//装队列数据xQueueSend(myQueue01Handle,( void * )&senddata,0);printf("KEY0_PRESS\r\n");// }if(KeyNum == KEY1_PRESS){printf("KEY1_PRESS\r\n");//取队列数据,并且对比,对比成功,led灯反转xQueueReceive(myQueue01Handle,( void * )&recvdata,0);if(recvdata == 9)HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); }if(KeyNum == WK_UP_PRESS){printf("WK_UP_PRESS\r\n");} }
二值信号量实现
一开始创建的信号量本来没有,需要一开始就释放的,但是在我实验的过程中,我一开始就获取二值信号量,获取成功了
if(KeyNum == KEY0_PRESS) xSemaphoreGive(myBinarySem01Handle); if(KeyNum == KEY1_PRESS) if( xSemaphoreTake( myBinarySem01Handle, ( TickType_t ) 0 ) == pdTRUE )//获取成功printf("get suceess\r\n");elseprintf("get fail\r\n");if(KeyNum == WK_UP_PRESS)if( xSemaphoreTake( myBinarySem01Handle, ( TickType_t ) 0 ) == pdTRUE )//获取成功printf("get suceess2\r\n");elseprintf("get fail2\r\n");实验现象--按KEY1成功获取,再按一次WK,获取失败,再按KEY0释放,再按WK获取成功
计数信号量实现
定义好计数资源,直接使用函数即可
DMA实现
DMA能实现循环接收,因此在外设到存储器的时候(相当于ADC数据通过DMA传输到我们自己定义的数组中或者存储器中),我们一般希望的都是连续接收,并且这里定义了两个DMA,一个收,一个发
都是存储器到外设,我们一般是常规模式,不然会一直发送,我们这里举例了数组--串口,如果循环的话,会一直发送,陷入死循环,因此这里的memory--外设是常规模式
外设(除了内核之外的东西都是外设),除了systick、NVIC、DMA其余基本都是外设
外设到寄存器,指的就是串口或者ADC等外设的数据到我们自己定义的数组中或者存储芯片中
寄存器到外设,一般都是数组到串口然后打印出来,常用于串口
unsigned char s_buf[]="hello world\r\n";HAL_UART_Transmit_DMA(&huart1,s_buf,sizeof(s_buf));
直接使用函数进行发送,但是一般发送需要延时一会,因为有时候被其他程序占了,使用串口发送需要稍微延时一会此处一定要有延时,否则需要加入判断DMA是否传输完成的标志!!!unsigned char s_buf[]="hello world 7676775645543546789876545\r\n";HAL_UART_Transmit_DMA(&huart1,s_buf,sizeof(s_buf));while( hdma_usart1_tx.State == HAL_DMA_STATE_READY ); //获取DMA的状态,判断它是否准备好下一次,其实就是上一次有没有完成所以上面的可以封装一下,发送内容、发送的DMA、需要发送的串口
ADC配置
RTC配置
配置RTC时钟32.768KHZ
看门狗
在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,
如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)
喂狗是自己喂的,比如设置时间为50ms,那么你必须设置一个定时器,定时在50ms之前喂狗,不然系统会重启
clock prescaler是分频系数,下面的reload value是重载值
Tout=((4×2^prescaler) ×rlr) /32
Tout=((4×2^PRER) ×RLR)/LSI时钟频率
其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);
4×2^prer直接为IWDG counter clock prescaler的值
窗口看门狗
定时时间为(4096*prescaler*(window-64+1))/32M
最小值为65,最大值为127
prescaler = 2^wdgtb
wdgtb为2的时候的最小超时值--4096*2^2*(64-64+1)/36M=
在T和W之间喂狗的话,会产生复位,或者在规定的W-0X40没有喂狗就会复位
相关文章:

STM32CubexMX与FreeRTOS学习
目录 LED与EXTI配置 基本定时器使用 软件定时器 在HAL库中实现printf 重点--记得自己添加头文件 队列实现 二值信号量实现 计数信号量实现 DMA实现 ADC配置 RTC配置 看门狗 窗口看门狗 FreeRTOS结合MX软件开发,基础配置直接生成,我们只…...
Master Slave 主从同步错误 Slave_IO_Running:NO/Slave_SQL_Running: No
Master Slave 主从同步错误 Slave_IO_Running:NO Slave_SQL_Running:Yes #在Slave库上查看状态 mysql> show slave status\G Slave_IO_Running: No Slave_SQL_Running: Yes #重启master库:service mysqld restart mysql> show master status; ------------…...

JavaScript函数之prototype原型和原型链
文章目录1. 原型2. 显式和隐式原型3. 原型链3.1 访问顺序4. instanceof4.1 如何判断1. 原型 函数的prototype属性 每个函数都有一个prototype属性,它默认指向一个Object空对象(即:原型对象)。原型对象中有一个属性constructor&a…...

从上海分时电价机制调整看转供电用户电能计费
安科瑞 耿敏花2022年12月16日,上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制,一般工商业及其他两部制、大工业两部制用电夏季(7、8、9月)和冬季…...
TypeScript类型体操:获取数组中元素对象属性的值作为新类型
title: TypeScript类型体操:获取数组中元素对象属性的值作为新类型 date: 2023-03-03 20:58:24 categories: TypeScript类型体操 tags: TypeScript类型体操TypeScript 首先先说获取数组中元素对象属性的值作为新类型的解决方案 使用 as const 强调不可变数组使用 …...
npm,yarn和pnpm
npm扁平的node_modules结构比如项目依赖了A 和 C,而 A 和 C 依赖了不同版本的 B1.0 和 B2.0,D也依赖B1.0, node_modules 结构如下:node_modules ├── A1.0.0 ├── B1.0.0 └── C1.0.0└── node_modules└── B2.0.0C依赖的B2.0因为版…...
【算法】【数组与矩阵模块】在排好序的矩阵中找数,时间复杂度O(M+N)
目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...

【Java|基础篇】计算机中数据的存储规则
文章目录前言:1.计算机中的数据2.二进制的介绍二进制的运算规则常见的进制3.字符的存储4.汉字的存储5.图片的存储6.音频的存储总结:前言: 本篇文章只是为了科普 计算机中数据的存储规则 1.计算机中的数据 计算机的数据大致分为三类:文本数据,图片和音频 注:视频是图片和音频…...

RestTemplate使用HttpClient连接池
文章目录RestTemplate使用HttpClient连接池ClientHttpRequestFactorySimpleClientHttpRequestFactorySimpleClientHttpRequestFactory 设置超时时间HttpURLConnection的缺点HttpComponentsClientHttpRequestFactoryPoolingHttpClientConnectionManager配置连接池HttpClient总结…...

Python 操作Redis
在 Python中我们使用 redis库来操作 Redis数据库。Redis数据库的使用命令这里就不介绍了。 需要安装 redis库。检查是否安装redis: pip redis 如果未安装,使用 pip命令安装 redis。 pip install redis #安装最新版本 一、Redis连接 Redis提供两个类 Re…...

CEC2020:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解CEC2020(提供MATLAB代码
一、鱼鹰优化算法简介 鱼鹰优化算法(Osprey optimization algorithm,OOA)由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出,其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…...
词对齐 - MGIZA++
文章目录关于 MGIZAgiza-py安装 MGIZA命令说明mkclsd4normhmmnormplain2sntsnt2coocsnt2coocrmpsnt2plainsymalmgizageneral parameters:No. of iterations:parameter for various heuristics in GIZA for efficient training:parameters for describing the type and amount o…...

GUI 之 Tkinter编程
GUI 图形界面,Tkinter 是 Python 内置的 GUI 库,IDLE 就是 Tkinter 设计的。 1. Tkinter 之初体验 import tkinter as tkroot tk.Tk() # 创建一个窗口root.title(窗口标题)# 添加 label 组件 theLabel tk.Label(root, text文本内容) theLabel.p…...

【软件测试】性能测试面试题都问什么?面试官想要什么?回答惊险避坑......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 1、你认为不同角色关…...
后端开发基础能力以及就Java的主流开发框架介绍
前言:java语言开发转后端,必须了解后端主流的一些东西,共勉。 后端开发需要具备以下基础能力: 1.编程语言:熟练掌握至少一门编程语言,如Java、Python、Ruby、PHP、C#等。 2.数据结构和算法:具…...

H2数据库连接时用户密码错误:Wrong user name or password [28000-214] 28000/28000 (Help)
H2数据库连接时用户密码错误: 2023-03-03 08:25:07 database: wrong user or password; user: "SA" org.h2.message.DbException: Wrong user name or password [28000-214]出现的问题配置信息原因解决办法org.h2.message.DbException: Wrong user name or password …...

青岛诺凯达机械盛装亮相2023济南生物发酵展,3月与您相约
BIO CHINA生物发酵展,作为生物发酵产业一年一度行业盛会,由中国生物发酵产业协会主办,上海信世展览服务有限公司承办,2023第10届国际生物发酵展(济南)于2023年3月30-4月1日在山东国际会展中心(济…...

【JAVA程序设计】【C00111】基于SSM的网上图书商城管理系统——有文档
基于SSM的网上图书商城管理系统——有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架开发的网上在线图书售卖商城项目,本项目分为三种权限:系统管理员、卖家、买家 管理员角色包含以下功能: 用户信息管理、权限管理、订…...

基于卷积神经网络CNN的三相故障识别
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN手写体识别 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活,为节能减排,减少电能损…...

Java工厂设计模式详解,大厂的Java抽象工厂模式分享!
我是好程序员-小源!本期文章主要给大家分享:Java工厂设计模式。文中使用通俗易懂的案例,使你快速学习和轻松上手!一、什么是Java抽象工厂模式1. Java抽象工厂是23种设计模式中创建型模式的一种,Java抽象工厂是由多个工…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...