![](https://img-blog.csdnimg.cn/20200215203139474.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
STM32
文章平均质量分 82
STM32
Dokin丶
嵌入式码农
展开
-
嵌入式消息订阅发布模式软件框架
消息的定义如下,一条消息由消息ID和携带的数据构成,如果消息很简单没有数据,那么数据可以为空。rt_msg仅仅是对针对用户开放的一个定义,实际上SoftBus.c中还定义了**_rt_msg**,_rt_msg是在rt_msg的基础上进行了扩展,可以认为他们之间存在一种继承关系。rt_msg msg;/* 消息实体 *//* 消息类型 *//* 源服务ID *//* 发送方的应答处理函数或动态订阅处理函数 *//* 同步消息指针,用于接收同步消息 *//* 指向下一_rt_msg节点 */原创 2022-06-14 00:47:54 · 4330 阅读 · 86 评论 -
压缩算法在单片机升级中的应用
在项目开发过程中,难免会遇到需要在线升级的情况,而升级包过大会导致升级所需久,影响产品性能和用户体验,因此我们可以将需要升级的程序压缩,然后在bootloader中解压。差分升级实际上就是对比出两个升级包的差异,然后再对差异进行压缩。这里我们不讲差分,只讲压缩。 压缩算法有很多,QuickLZ是比较适合单片机的一种轻量级无损压缩算法。QuickLZ是一个号称压缩速度最快的压缩库,以下是几种较流行的压缩库的压缩率和速度对比。虽然QuickLZ的压缩率没有Zlib高,但压缩率相差无.........原创 2022-05-14 01:28:02 · 4766 阅读 · 7 评论 -
STM32低速时钟频率校准方法
RT-Thread的PM组件利用LPTIM来实现低功耗唤醒和系统tick补偿,而LPTIM的时钟源一般会选择LSI。LSI这玩意儿功耗虽然只有几百nA,但是频偏非常大,例如STML051手册上就说LSI的频率在26kHz ~ 56kHz之间,典型值为38kHz(HAL库里面是37kHz),如下图所示。 在一些对时间要求稍高的低功耗应用场景,LSI的精度无法满足需求。例如某设备需要每30秒唤醒一次,如果LSI的时钟偏高,那么设备的唤醒的周期肯定会小于30秒。虽然对LS......原创 2020-09-03 00:13:36 · 3781 阅读 · 1 评论 -
STM32 PVD的使用(掉电检测)
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检测器。通过PVD我们可以设定一个基准电压,当芯片的供电电压高于或低于该基准电压时便产生PVD中断,我们可以在PVD中断里做一些处理。本文以STM32L051为例,来说明PVD的使用。以下是STM32L051用户手册中对PVD的描述,根据这张图我们可以知道,PVD中断在内部是连接在中断线16的,软件上可以配置原创 2020-07-27 01:21:58 · 18868 阅读 · 5 评论 -
STM32无法进入STOP模式的解决方法
最近在使用RT-Thread的PM组件时遇到了一奇怪的现象,发现居然进不去,调用HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI)函数会直接跳过里面的__WFI函数,以下是出问题的代码段。static void _drv_pm_enter(struct rt_pm *pm){ rt_uint32_t mode; mode = pm->current_mode; switch (mode) { case PM_RUN原创 2020-06-26 20:58:29 · 4940 阅读 · 7 评论 -
STM32查看当前中断信息的方法
在开发STM32时,我们经常会遇到一些需要知道系统当前中断信息的情况,比如某个中断是否被使能、是否pending、是否正在执行该中断等。如果是在调试环境,那么可以直接查看中断信息,KEIL中的操作方法如下。所有中断的Enable状态、Pending状态(已经发生但是还没有执行到中断)、Active状态(正在执行中断)、中断优先级等信息都一目了然。图1 KEIL调试时查看NVIC信息如果想在非调试环境下获取中断信息,那么可以通过NVIC和SCB两个寄存器来查看。官方提供的库中有对这两个寄存器做简..原创 2020-06-26 20:33:52 · 10783 阅读 · 5 评论 -
SPI主从机DMA通信
目录1.硬件方案2.SPI通信问题3.DMA超时检测机制4.半双工通信5.从机部分代码6.注意事项1.硬件方案由于项目中单片机的串口资源不够,所以使用SPI来代替串口,通信双方分别是Hi3516EV300和STM32L051,前者作为SPI主机,后者作为SPI从机。硬件连接关系如下图所示。SPI主从机硬件连接关系SPI通信需要由主机发起,也就是由主机产生CLK,从机被动应答,那么当从机需要主动发送数据的时候怎么办呢?办法就是用额外的引脚来告知主机来取数据,这个引脚在原创 2021-01-10 02:43:14 · 5178 阅读 · 14 评论 -
单片机实现自动初始化
仿照RT-Thread的自动初始化机制,写了一个自动初始化的模块,整个代码仅52字节。好处:可以实现自动初始化,不用在外部显式地调用。缺点:初始化逻辑较显式调用的方式模糊,容易引入BUG。以下是对应的头文件和源文件,初始化顺序分为9级,LOADER_BOARD_EARLY_EXPORT最早,LOADER_APP_LATE_EXPORT最迟。使用方法可以看最后面的Demo。#ifn...原创 2020-03-27 22:23:06 · 2347 阅读 · 6 评论 -
STM32实现固件分区
一、技术背景以前我用过一款庆科的WiFi模组——EMW3162,它由一块STM32F205RG芯片 + SDIO接口的射频芯片组成,有趣的是官方将这颗STM32芯片内部Flash做了很多块的划分,如下图所示。EMW316x FLASH分配情况可以看到1MB的Flash被分割成了5部分,分别是:1. Bootloader,一段引导代码,一般用于更新APP程序。2. 信息区,存放...原创 2020-02-20 17:48:00 · 3374 阅读 · 12 评论 -
STM32链接脚本详解
程序的编译分为四个步骤:预处理、汇编、编译、链接。在开发STM32时,我们只要在IDE中点击编译就能一次性完成这4个步骤,实际上IDE也是要经过这些步骤的,只不过IDE为我们屏蔽了很多细节。首先我们需要了解一个image文件的构成。image即编译的产物,我们编译STM32生成的bin文件此处称之为image。一个image文件由RO段和RW段组成,RO段包含只读的代码段和常量,RW段包含可读...原创 2020-02-18 17:11:20 · 7735 阅读 · 1 评论 -
STM32启动流程详解
STM32的启动流程大致可分为以下几步:1、设置堆栈2、跳转到Reset_Handler3、Reset_Handler调用SystemInit完成时钟、中断向量偏移的初始化工作,然后跳转到__main,__main函数会完成RW、ZI数据段的重定位工作,即将ROM中的RW数据拷贝到RAM中,将ZI段清零,然后跳转到_rt_entry进行Stack和Heap的初始化。4、跳转到真正的main函数。ST官方给我们提供了启动文件,我们可以通过启动文件来详细地分析STM32的启动流程。原创 2020-02-17 23:56:16 · 10306 阅读 · 7 评论 -
STM32低功耗模式下的三种串口通信方式
在嵌入式设备中,常涉及到低功耗下的串口通信,本文以STM32L4作为硬件平台,讲解3种低功耗下的串口通信,希望对做低功耗的嵌入式开发者有所启发或帮助。笔者才疏学浅,难免有错误或遗漏之处,望读者能不吝指正。下文所涉及的低功耗模式都是指STM32的停机模式,在该模式下PLL停止工作,仅LSI和HSI继续运行(进休眠前已经打开的话),所有IO状态、内部RAM数据保持不变,所有外部IO中断、内部RTC...原创 2020-02-01 14:57:40 · 7819 阅读 · 6 评论