STM32
文章平均质量分 76
嵌入式ARM
昊月光华
大道三千,以代码能证我的道吗?
展开
-
基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)
STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期.原创 2023-06-06 22:31:24 · 2902 阅读 · 4 评论 -
Clion结合CubeMX以Makefile编译和构建STM32以及OPENOCD调试&嵌入式的优雅开发
先说说Keil,keil有强大的编译器,但其编辑器万年不变,对于开发人员的代码编写不能起到一个及时反馈的作用。比如说,一个报错在修改后,还得等过几十秒,Keil的编辑器才消除警告。是一个真正意义上的开发工具。这是工具上的革新带给你的,这也是一个好的IDE带给开发人员不一样的优雅体验。上图的stm32G431.cfg的内容(STM32G431是控制器的芯片类型)定义烧录器的类型,比如DAPLINK ,FlashSize根据芯片来选择。每新建源文件需要添加到makefile文件中,新加的头文件目录也给出。原创 2023-05-20 22:55:55 · 1336 阅读 · 0 评论 -
STM32中使用类“51”中的位bit做标志——节约资源之道
而我在LCD屏幕刷新时,需要记录变量是否改变再刷新,做判断的时间总比做刷新的时间短的多!1:用习惯了51的位bit,像二进制信号量一样只有0和1两种状态,我认为这两种状态还是利用得最为广泛的两种状态,就比如说WIFI的连接状态。2:早些接触时就念念不忘51里的bit,接触32因为其资源丰富我也不也怎么管,变量,全局变量使劲造就完事了。省,实在是省,一个16位的数据拆分为16个二值flag(0和1) ,这是我本篇文章中所说的。3:为保持勤俭节约的中华民族的美德,于是就有了本篇文章,以此不忘。原创 2023-03-15 17:19:21 · 593 阅读 · 1 评论 -
STM32整合ATK-01-LORA模块实现定向传输实现三点组网(一主加二从)案例
应物联网无外网的环境要求,需要使用Lora模块进行组网以此传输数据,本来用了正点原子的Lora模块,以正点的强大资料支持,我本应该非常熟悉这些组网操作了,但硬件调试实在是让我差不多很苦恼,一方面需要不断的去排查接线问题,一方面又要去关注软件代码是否已经发送了数据。Clora:地址615(16位 0-65535) 信道为15(最大信道为32,越好的LORA模块,信道数量越多,受相邻信道干扰的可能性越小!这里在我测试的时候,有时成功后过一段时间再次进行测试则又连不上,也许是因为接线的问题(这是硬件调试的通病)。原创 2023-03-09 19:00:08 · 2249 阅读 · 3 评论 -
单片机和嵌入式(物联网开发方向)学习路线年终总结
通过加入实验室,组队打比赛是最好的学习的方式。首先学会C语言,在硬件里,不会涉及到太过于复杂的算法,它更关注于底层。掌握常用的数据结构如顺序表,链表,栈。重点掌握指针和结构体的工作过程。推荐课程:C语言(118小时课程)c语言编程 C语言入门 c语言(C语言程序设计教程 c语言视频教程 c语言零基础入门教程 学习c语言 c语言视频教程 c语音 C语言教程 C语言编程项目 C语言哔哩哔哩bilibili从51单片机开始。第一件事,买一块开发板学习,可以通过开发板的配套视频进行。学习掌握外设:LED灯 ,数码管原创 2022-12-07 15:51:57 · 3247 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之两类中断解析
( Free-RT-OS里有任务的优先级,优先级设置地越大则优先级越高),而Free RT OS里的中断与裸机一样,设置的数字越小则优先级越高,以前我习惯性地把裸机开发的那些中断(比如硬件定时器,串口,DMA,系统滴答定时器产生的中断等这些中断)称为硬件中断。中断从设计之出是为了解决及时性情况而创造出来的,作为一个开源免费的操作系统,它不希望承担任何责任,比如汽车的临时刹车中断,Free RTOS说明请用户在更高优先级的中断中使用自己的代码,而不是它的api。上下文切换 不能在中断中进行,会导致中断延期。原创 2022-11-17 11:03:05 · 908 阅读 · 1 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程
因为软件定时器的回调函数都依赖于守护任务去处理实现其回调函数,在软件定时器的回调函数中阻塞则意味在守护任务中阻塞,守护任务将无法继续管理所有的软件定时器。答:Free RT OS创建了一个管理软件定时器的任务,叫做DaemonTask 也被称为守护任务,由它处理软件定时器的定时回调函数。软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器。同理,停止某个软件定时器,调整软件定时器的定时周期也是通过写命令队列的方式实现。(创建定时器命令队列,创建当前定时器链表和超时定时器链表。原创 2022-11-16 20:39:35 · 983 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之事件集(event-group)
用cubemx使用事件集时只有使用了cmisis v2 才能使用事件集这个数据结构。创建一个事件集的高8位不用,低24位用做标记(事件位)。每一个位可相当于裸机开发时的flag,同时,每一位都可以当做二值信号量使用。不同的是,事件集可以判断每一个事件(每一位)的与成立或成立1.等待若干事件位一个成立就算成功 2.等待若干事件位同时成立都成立才算成功。原创 2022-11-15 19:46:46 · 521 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之信号量与互斥量
FREE RT OS的信号量与互斥量,主要理解互斥量的优先级继承原创 2022-11-15 17:29:38 · 856 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之消息队列
CMSIS_V1与CMSIS_V2两个API接口,除了前者无法用到,其余都一样。其数据部分紧跟队列的结构体。这个队列与RT_Thread中的邮箱简直是非常相似,不同在于RT-Thread中的邮箱的邮件必须是32位的整形,而Free -RT-OS的队列的成员类型可以是自定义类型。在时:初始化队列 :读数据的位置 =ptr(读数据的指针)++%队列总长度Length(这创建开始已定义)写数据的位置=ptr(写数据的指针) ++ %队列总长度(Length)原创 2022-11-14 19:18:36 · 587 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之任务调度
在阻塞后,该任务的会从就绪列表中移除并放入阻塞列表中,比如常见的阻塞API函数 OS_Delay(),它会等待tick中断唤醒。----------------------------------------> 高优先级链表(同一优先级的任务)先向尾部遍历。Free RT OS使用抢占式的任务调度,高优先级的任务抢占低优先级的任务执行。若该优先级的任务和空闲任务IDLE的优先级相同(也就是为0),则按创建任务的顺序执行。在同等优先级的情况下,若该任务的优先级大于0则后创建的任务会先执行。原创 2022-11-13 13:38:17 · 749 阅读 · 0 评论 -
基于STM32结合CubeMX学习Free-RT-OS的源码之任务创建
在这里它们都是内存RAM的部分,任务栈从系统设定的总的堆大小上分配出来一块区域(一块数组)作为栈。504=4*96+其他属性信息所占内存大小(比如说任务的入口函数地址,任务的名字,任务的优先级大小,任务的任务栈大小等等)裁剪出用户自定义的一些配置(比如OS的心跳(systick的中断函数,idle的钩子函数,定时器的最大深度等等)),其中就包括所定义的总的堆大小。创建任务有两种方式,与RT-Thread一样,动态创建和静态创建两种,它们的区别在于每个任务(线程)所分配的任务栈是。所做的正是插入链表的算法。原创 2022-11-13 12:35:20 · 819 阅读 · 0 评论 -
C/C++中#和##的宏以及进行“花里胡哨“的命名及其应用
最近依然在嵌入式遨游,以及加深对free rt os 源码以及内核的理解。以及为了解决学习工作中分布式设备的命名问题。于是就想到了#和##这两个宏。原创 2022-11-11 10:26:49 · 653 阅读 · 0 评论 -
基于STM32的Free-RT-OS的两种时基的认识以及重写ms,us级延时
在STM32的裸机开发中,没有操作系统这个概念,特别是在用CUBEMX配置生成项目时,默认都是选择了systick做为hal的时基。而当用了FREE RT OS时则强行绑定了systick做为其任务调度的时基。在操作系统中,时基被用做计数,systick是1ms一个脉冲,vTaskDelay使若任务挂起等若干内核级的函数用的就是这个。(内核封装了很多层,最终可以找到systick的中断回调就是为OS提供)原创 2022-10-30 18:21:58 · 2221 阅读 · 0 评论 -
ESP32使用AT MQTT 固件发布主题信息返回ERROR解决
这样在串口助手打印时不会出现\ ,我们通过MQTT AT固件也就类似于我们和串口助手通信的层次关系,固件那边要区分则引号和逗号必须带个转义符。再通过sprinf注入要发送的信息则发送成功。本着在python里单引号也能被区分为字符串的缘故,试了试单引号代替 \。发现也可以,于是查了查json数据里单引号是否能区分为字符串。在代码区中 (比如STM32通过串口控制固件,与固件透传。我们知道在引号区别别的引号时需要加。当需要发布对应主题的json数据包时。于是在串口助手发送数据时,正确格式。原创 2022-10-30 17:46:22 · 2323 阅读 · 5 评论 -
基于STM32的自动重装载auto-reload preload以及影子寄存器
它的应用场景是在定时器运行并允许更新事件产生,若用户需要去改变(软件直接对寄存器的值进行读写)TIMX_PSC(预分配器),TIMX_ARR自动装载寄存器等寄存器时,是否立刻对正在运行的计数周期产生影响。自动重装载寄存器是预加载的,每次读写自动重装载寄存器时,实际上是通过读写预加载寄存器实现。根据TIMx_CR1寄存器中的自动重装载预加载使能位(ARPE),写入预加载寄存器的内容能够立即或在每次更新事件时,传送到它的影子寄存器。原创 2022-10-28 12:53:04 · 8705 阅读 · 7 评论 -
ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布
ESP32的MQTT AT固件下载以及stm32对接ESP32,以AT指令完成订阅和发布。原创 2022-10-18 15:57:22 · 5234 阅读 · 14 评论 -
[RT_Thread]内核中线程间的同步与通信(事件集与邮箱的记录)
本次写线程间的通信,熟悉与stm32裸机开发时,经常有很多问题,比如:在多个外设的使用同一的PIN引脚时怎么避免冲突?突然来一个事件能否及时得到处理?一系列事件发生需要有一定逻辑条件,如严格的先后顺序,几个事件同时发送引发其他事件发生,如何同步?以前我只能做许许多多的标记来进行判断,比如互斥,就得定义一个全局变量,当一个资源使用时修改全局变量的值表示封锁,事件的中断不能访问。这种做标记显得逻辑繁杂且乱。于是,试着上操作系统看能不能把问题变简洁。原创 2022-10-16 13:51:50 · 1303 阅读 · 0 评论 -
[RT_Thread]在RT thread Studio中main启动过程
启动过程分析原创 2022-10-15 11:41:32 · 934 阅读 · 0 评论 -
基于STM32的F1的RTC实时时钟+CUBEMX实时获取时间戳实现断电跨天同步时间戳
实现断电跨日期同步时间戳原创 2022-10-08 22:34:22 · 3569 阅读 · 3 评论 -
基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据
在CUBEMX配置时,默认是把DMA的中断打开的,无论是adc的dma还是串口,它们的完成中断都是打开的,为了避免不必要的进入中断,一般我把ADC的DMA中断关闭,把串口的以DMA接受数据的中断也关闭.为什么使用DMA,DMA可以为外设和内存提供一条数据通道,使得数据的复制不需要CPU去参与,减低CPU的负担,在实时性的工作时显得格外重要。在这里,DMA接受数据的DMA中断关闭,发送数据的DMA中断使能。串口一配置DMA发送和DMA接受(这里以DMA加空闲中断的方式)这里串口发送用到的是DMA1通道4。原创 2022-10-07 19:17:02 · 18578 阅读 · 9 评论 -
Clion编译stm32提示DEPRECA [0mTED! use ‘adapter driver‘ not ‘interface‘
在选择下载器第二行改成adapter driver,则屏蔽提示。原创 2022-10-06 14:08:34 · 501 阅读 · 0 评论 -
基于STM32的TM1638的按键控制以及数码管和LED灯的动态扫描
趁着国庆这几天想着做个与硬件的控制,于是就需要交互,LCD屏幕可以用来显示数据,而输入我想到了以前用过的矩阵键盘但奈何gpio太多。在网上看了很多博文,唉,一言难尽啊,驱动都是一样的,TM1638是一种类似于iic的时序但又不是iic时序,它的好处就是用三个引脚同时控制LED灯和数码管的动态扫描容易实现,按键按理也简单,第一次用这个本着以跑起来为主的目的在网上看了看别人怎么做的,结果,按键方面的控制硬是没有一个可以跑的,,大多数文章基本类似(因为驱动已经写好了)。原创 2022-10-04 22:42:02 · 11812 阅读 · 0 评论 -
STM32基于Flash对结构体读写暨再认识结构体内存分配
关于stm32中结构体的读写原创 2022-09-29 08:00:23 · 2722 阅读 · 0 评论 -
STM32基于HAL库的读写FLASH
FLASH,也就是闪存,在stm32里通常被用来放程序代码,而剩余的空间就可以被用户手动去读和写。基于STM32F103ZET6 正点原子的大容量产品,512K的FLASH,共256页,每页2K,比起以前用过的51不知道高了多少倍。以下摘抄自正点原子团队的文档STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。原创 2022-09-26 21:43:42 · 9116 阅读 · 0 评论 -
正点原子LORA模块ATK-01固件升级与断电不丢失设置参数
最近学32,天天和正点原子的售后服务聊,有问题就直接转技术服务,嘿嘿,果然不愧是售后服务, 解决了很多问题。。。。。哈哈哈。。。正如图,这是,。由于很多模式都要求配置信道和地址,本着以配置好再直接当做无线串口用的目的,我并不想在连上stm32还发AT指令给lora模块,能配置再用当然是最为简单的。这个时候,我发现我的两个模块,一个可以断电保存参数,而一个不可以。原创 2022-09-18 15:37:58 · 1596 阅读 · 0 评论 -
STM32正点原子TFT-LCD1.3寸(240x240)液晶显示屏移植
记录本篇的目的是为了我换了更大的屏幕,为了以后需要特此记录。原创 2022-09-17 21:12:33 · 878 阅读 · 0 评论 -
STM32串口通信不停接受到垃圾数据的问题及其解决
stm32进行串口通信,(F103),结果在接一根杜邦线后,(杜邦线的一端接32的RX端,而另一端不接线,则它会不断的发送垃圾信息),原因在于esp32外接其他电源与esp32没有共地,而rx端是浮空输入电平不稳定,再加上杜邦线产生的电磁干扰,从而使得参考电压不一样,而让rx端不停的接受到垃圾数据,此问题若不是使用了不同的开发板进行通信是非常难想到的,因为平时都是连板子上,而单独供电时未共地而难以发现。2:串口接受代码中未添加 '\0' 导致数组越界访问了。1:波特率不匹配,串口协议不一致(这个问题少见).原创 2022-08-08 12:05:51 · 2695 阅读 · 2 评论 -
Not enough information to list load addresses in the image map.(STM32编译报错)
第二种变量重复定义,重复定义指全局作用域下重复定义。这种错误常发生在自己忘记了已经定义过了这个变量或者是引入别的源文件出现全局变量命名一致。第一种只有函数声明,缺少函数定义,缺少源文件引入进工程。...原创 2022-07-29 16:52:54 · 14663 阅读 · 8 评论 -
STM32基于HAL库的串口接受中断和空闲中断
在通信方面。UART由于全双工通信,可以同时接受数据和发送数据而被广泛使用。而接受数据则又有很多种方法比如根据结束符判断,数据是字符串形式,所以一般串口接受的接受符就是定时器中断,设计"喂狗信号量"也就是串口空闲的时间,在串口接受后的定时器里不断递减,减到零则判断接受完毕,接受数据则喂狗刷新递减时间。(这也是单片机常见的串口接受思路)STM32有很多种方式,前两种在某些情况都很可以用。但是第一种只适用于判断结束符。...原创 2022-07-26 22:46:44 · 7314 阅读 · 1 评论 -
STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决
配置时单字dma转移,uint32_t类型定义缓存。配置时半字dma转移,uint16_t类型定义接受缓存。httpshttpshttpshttpshttpshttps。原创 2022-07-23 22:55:25 · 7072 阅读 · 8 评论 -
STM32基于HAL库的非DMA的轮询ADC单通道与多通道的采样
目录单通道(连续转换模式)单通道(单次转换模式) 非DMA的多通道采样扫描模式失能,间断模式失能,连续转换模式使能规则模式使能 对于F1系列的芯片F4则不需要,已经自动进行了校准在while前只需启动一次ADC定时读取adc 串口读取 而单次转换每次转换都要启动adc这个问题困扰了我很久,轮询模式(单次加间断)我也试过了,多通道测试的时候数据不准,比如两个通道的引脚外接0或3.3v的电压,要么就都是0要么就都是3.3但经过测试又读出来不一样两个通道的电压值又不一样 参考stm32cu原创 2022-07-20 22:09:22 · 2861 阅读 · 4 评论