
STM32
文章平均质量分 73
~狂想家~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
解决STM32使用J-Link可以擦除和读取但是无法烧录问题
使用J-Link烧录模组固件,出现可以读取和擦除,但是无法烧录的问题,使用STM32CubeProgrammer更改选项字节中的Read Out Protection解决。原创 2024-08-22 18:02:24 · 1521 阅读 · 0 评论 -
STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略
线程安全问题并不只存在于基于RTOS的应用程序中;裸机应用程序中也存在这个问题。C库函数可以进行不那么明显的调用(隐式调用)导致类似的问题。例如,printf()可以调用malloc()。使用STM32cubeMX生成工程时,可选的线程安全策略有五种,如果选择Default,不直接制定,那么裸机应用会自动选择策略2,RTOS应用会自动选择策略4。原创 2024-08-15 22:53:18 · 1208 阅读 · 2 评论 -
LiteOS使用不当导致软件定时器无响应问题
软件定时器被错误地删除或释放导致无响应。原创 2024-06-16 20:51:55 · 324 阅读 · 0 评论 -
STM32使用QUADSPI读写外部Nor Flash(以W25Q64为例)
STM32使用QUADSPI读写外部Nor Flash(以W25Q64为例),通过QUADSPI三种模式(间接模式,轮询模式和内存映射模式)的使用来操作W25Q64。原创 2023-06-13 18:35:35 · 3939 阅读 · 0 评论 -
基于Keil生成外部Nor Flash下载算法,并使用J-Flash直接烧录(以W25Q64为例)
基于Keil生成外部Nor Flash下载算法,并使用J-Flash直接烧录(以W25Q64为例),包括参考文档介绍,下载算法实现过程,避免踩坑。原创 2023-05-10 23:55:39 · 7582 阅读 · 6 评论 -
分别使用软件和硬件SPI驱动1.28寸LCD屏幕刷新时间对比(驱动IC为GC9A01)
分别使用软件和硬件SPI驱动1.28寸LCD屏幕刷新时间对比(驱动IC为GC9A01)原创 2023-04-24 18:40:59 · 3637 阅读 · 2 评论 -
CmBacktrace库在工程中的添加和应用
CmBacktrace库在工程中的添加和应用,包括断言和故障的使用,全局变量的打印,故障函数的修改,串口和软件看门狗的处理等。原创 2023-04-19 22:02:26 · 1439 阅读 · 1 评论 -
使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目
使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目避坑。原创 2023-04-11 11:36:29 · 2771 阅读 · 2 评论 -
STM32定时器的编码器接口模式
STM32定时器的编码器接口模式,计数器计数方向及编码器旋转方向判断。原创 2023-03-07 13:16:39 · 2871 阅读 · 0 评论 -
基于STM32L431+Liteos的串口空闲中断加DMA循环接收
串口空闲中断加DMA循环接收。原创 2023-02-17 16:04:34 · 1553 阅读 · 0 评论 -
(二)基于STM32L431的Liteos低功耗Runstop模式的实现优化(退出stop2模式后任务相关Tick补偿优化)
基于STM32L431的Liteos低功耗Runstop模式的实现优化(退出stop2模式后任务相关Tick补偿优化),描述了Liteos的任务延时和调度相关的原理。原创 2022-10-21 14:50:34 · 1478 阅读 · 0 评论 -
(一)基于STM32L431的Liteos低功耗Runstop模式的实现
使用Liteos的develop版本,基于STM32L431的Liteos低功耗Runstop模式的实现,stop2模式下功耗2.8uA。原创 2022-10-19 21:58:57 · 2761 阅读 · 5 评论 -
基于STM32L431的Liteos低功耗Tickless模式的使用
Liteos的Tickless模式通过在执行空闲任务时改变Systick的Reload值来改变systick的中断时间,以此来拉长MCU进入睡眠模式的时间。文中包括相关部分源码的解析(个人理解)。原创 2022-10-12 17:11:32 · 1837 阅读 · 0 评论 -
Liteos静态内存管理的使用
Liteos静态内存管理的使用,包括申请、清除和释放内存。可以通过计算来合理分配内存池的大小,写入数据时不能超过内存块的大小。原创 2022-10-08 17:57:25 · 12195 阅读 · 0 评论 -
Liteos信号量的使用
Liteos使用计数信号量时需要注意最大可用信号量的个数。原创 2022-09-29 16:47:12 · 588 阅读 · 0 评论 -
国民技术N32G45x双ADC规则同步模式配置
双ADC为主从模式,ADC1(主)和 ADC2(从),ADC3(主)和 ADC4(从)可以组成双 ADC 模式,一共有6种模式,还可以组合使用6种模式。原创 2022-08-17 18:43:15 · 2294 阅读 · 0 评论 -
国民技术N32G45X低功耗问题之更改全局变量和栈在RAM中的地址
最近项目中用的MCU是国民技术的N32G45X,MCU的资源很丰富,RAM也很大,配套的库和例程也比较全,用起来还是不错的,但是在调试低功耗的时候还是费了不少劲。首先由于项目低功耗需要,只能选择停机模式2(STOP2)。根据数据手册的描述,在此模式下外部低速时钟开启, RTC运行, R-SRAM保持,所有I/O状态保持,独立看门狗处于关闭状态,25℃的条件下电流为10个微安。用的这款MCU的RAM是144KB,分为SRAM(128KB)和R-SRAM( Retention SRAM – 16KB),如果原创 2022-05-30 17:23:22 · 1934 阅读 · 0 评论 -
STM32Nucleo-64-P板子配置使用HSE时钟
最近拿了一个Nucleo-L433RC-P的板子,板子如下:板子使用Micro USB供电,板子上半部分是ST-Link,可以通过CN2两个跳线帽的状态,来选择是给下方的L433烧写程序还是给外部的MCU用烧写程序,移除跳线帽就可以给外部MCU烧写使用。使用前要先安装ST-LINK驱动。驱动下载地址上电后保持板子的初始状态,会发现LD4闪烁,可以下载一下其他官方例程测试一下。此时的板子还不能使用外部时钟,只能使用HSI和MSI。本来以为使用外部时钟需要自己增加晶振,结果从用户手册中发现如果不增加晶振原创 2021-11-21 21:23:08 · 1245 阅读 · 0 评论 -
STM32用SW下载提示T-bit of XPSR is 0 but should be 1. Changed to 1/Could not start CPU core.(ErrorCode:-1)
最近使用SW模式对STM32L431下载程序时,出现以下三种情况的报错:①:***JLink Error: Could not start CPU core. (ErrorCode: -1)***JLink Error: Can not read register 15 (R15) while CPU is running**JLink Warning: CPU could not be halted***JLink Error: Could not read memory location 0x原创 2021-11-15 15:05:42 · 4861 阅读 · 1 评论 -
解决STM32因字节对齐问题导致读写Flash失败进入HardFault的问题
背景:项目中使用的MCU是STM32L431,在进行升级时需要往Flash中写数据,其他业务代码都是可以正常读写,但是在写升级数据时进入HardFault_Handler,程序跑飞。由于项目需要,获取升级包的文件所有结构体采用一字节对齐,解析升级包采用指针偏移的方式。进入Flash未进行擦除操作前的参数如下:要写入的长度和地址都是没问题的,但是buf指针的在RAM中的地址为0x200053D2,在此状态下擦除和写操作一定会进入HardFault_Handler。计算后发现0x200053D2不是4字原创 2021-10-22 14:35:50 · 5406 阅读 · 0 评论 -
解决STM32进行IAP升级跳转至APP后无法进中断问题
最近碰到STM32在进行IAP升级时跳转至APP后无法进入中断,导致程序无法运行。正常情况下STM32进行IAP升级时,在跳转至APP程序之前,应该关闭外设,关闭中断。BootLoader中跳转程序如下: typedef void (*pFunc)(void);//定义 __set_FAULTMASK(1); pFunc pApp; pApp = (pFunc)(*(__IO uint32_t*)(APP_DEFAULT_IMAGE_ADDR + 4)); __set_MSP(*(原创 2021-10-18 18:18:44 · 10546 阅读 · 5 评论 -
STM32L431获取复位源
在进行软件调试时,可能会碰到莫名其妙复位,这个时候就有必要看一下是什么原因导致的复位STM32L431的复位标志在RCC_CSR寄存器中,一共有8种。获取复位源时可以用__HAL_RCC_GET_FLAG()函数实现,代码如下。#define RCC_BORRST (1<<0) /* 欠压复位*/#define RCC_OBLRST (1<<1) /* 选项字节加载器复位*/#define RCC_PINRST (1<<2) /* NR原创 2021-10-15 15:08:07 · 2215 阅读 · 0 评论 -
STM32L431断开jlink后程序无法运行,需要短复位电容才可以
使用STM32CubeMX配置时钟源为MSI,配置系统时钟为80MHz,生成的代码只运行点灯程序和外设初始化时是正常的。加入业务代码后,在连接jlink的情况下可以运行,不然的话就需要短一下复位电容才行。开始怀疑是复位电容的问题,更换之后还是一样,而且在调试状态下也有可能进入HardFault_Handler,在Call Stark+Locals里面进入HardFault_Handler之前的内容为0x00000000。在更换时钟源为HSI后,程序正常运行,确定了问题出在系统时钟配置上(还没研究使用MS原创 2021-10-15 14:56:09 · 1026 阅读 · 0 评论 -
使用C语言sscanf函数解析AT指令
C语言sscanf函数作用是用一字符串(buffer)来格式化输入数据。头文件为<stdio.h>。函数原型为:int sscanf(const char *buffer,const char *format, [ argument ] ... ); 其中buffer为格式化输入数据的来源。在AT指令返回的字符串中,会有不同类型的数据,比如十进制数,十六进制字符串,字符串等,要根据数据类型来解析。假设要解析的AT指令中其中6为十进制数,Hello_World位置为不定长字符串,-77原创 2021-09-27 17:27:46 · 2356 阅读 · 0 评论 -
uCOS-III下定义浮点型变量进入硬错误
现象:在定义float类型变量后,哪怕不对该变量进行操作,程序也会进入HardFault_Handler。MCU使用的是STM32L431,包含浮点运算单元。最后发现是在移植uCOS-iii时官方的移植版本不支持FPU浮点运算,如果需要使用浮点类型数据,需要对startup_stm32l431xx.s文件中的Reset_Handler进行修改不需要浮点运算:Reset_Handler PROC EXPORT Reset_Handler原创 2021-08-03 10:19:25 · 979 阅读 · 1 评论 -
解决STM32串口溢出中断问题(一直进中断服务函数)
现象:MCU为STM32L431,使用uCOS-III作为实时操作系统,使用串口接收升级数据包后,不能进行任务调度,发现程序没有跑飞,而是一直进入串口中断。串口的ISR寄存器如下:串口中断服务函数的判断条件是:```c if( SET == __HAL_UART_GET_IT_SOURCE(&huart[BLE_UART], UART_IT_RXNE)) { }但是没有数据的情况下,也能进入,查看手册中串口中断描述:,不过同样的跳转方式在boot和app都是裸机的情况下是没有问题的。网上百度了许多都是说在跳转前没有处理好中断,有使用的外设没有处理或者栈顶指针的问题。以下是可以使用的代码:void Jump_To_App(uint32_t app_address){ typedef void (*原创 2021-04-28 15:06:42 · 2076 阅读 · 8 评论 -
STM32局部变量过大导致栈溢出
最近项目调试中发现只要使用memset函数对一个局部数组赋值时,就会导致其他全局变量值被更改,接着就进入HardFault错误。后来发现局部变量和全局变量地址重叠。Data_Write结构体为全局变量,OTA_Data为局部数组。看了启动文件startup_stm32f10x_hd.s中栈Stack_Size设置的是0x00000800,而OTA_Data大小为2K,函数中还有其他的数组,所以导致栈溢出,使用memset函数操作时就出现了HardFault错误。栈溢出程序编译时不会有异常,需要自己原创 2021-03-16 10:40:03 · 2721 阅读 · 0 评论 -
STM32使用库函数初始化AD采集IO口参数不全影响其他IO口状态
在项目中发现正常初始化的IO口PB2,在进入低功耗模式时,会有90微安左右的漏电流。原因是在初始化AD采集IO口PB1时,传入的结构体参数不全,改变了PB2的状态。MCU为STM32L151,使用的库函数版本如下:库函数中初始化IO口函数为:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct){ uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;原创 2020-09-05 17:59:47 · 1265 阅读 · 0 评论 -
STM32的IAP升级方式
IAP是In Application Programming的首字母缩写,即在应用中编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。以下所说的IAP升级方式均指的是对全部固件包进行升级,不包含差分升级。通常在进行IAP升级时要先考虑实际的存储空间大小,比如片上Flash空间大小,有没有外部存储空间等,然后再考虑升级方式及如何对Flash进行分区。方式一:如果MCU的内部Flash比较小,只够放一个Bootloader和一个App程序,并且没有外部存储时,就只能选原创 2020-07-31 13:54:52 · 837 阅读 · 0 评论 -
笔记:STM32的ADC参考电压与参照电压(电源监测)
STM32的ADC 电压输入范围为: VREF- ≤ VIN ≤ VREF+。一般设计的时候会把VREF-和地相连, VREF+和VDDA相连。若MCU供电电压为3.3V,则ADC输入电压范围为0~3.3V。此时ADC模块的参考电压即为MCU供电电压。系统如果使用电池供电,想要使MCU供电电压稳定,就要加LDO等对系统电源进行处理。如果直接使用电池供电,那么MCU的供电电压会随着电池的电量损耗而降低,此时ADC模块的参考电压已经改变,那么通过AD转换求出来的电压值也就不准确了,此时就达不到对系统电源监测的原创 2020-05-23 11:36:13 · 37207 阅读 · 5 评论 -
笔记:关于#ifdef xxx_GLOBALS语句的用法
语句格式:#ifdef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#endif语句说明:定义全局变量,避免在.c和.h文件中重复定义。1.若在.c文件中有如下定义:#define xxx_GLOBALS则编译器在处理该文件时,强制xxx_EXT为空,所以会给每个全局变量分配内存空间。2.在处理其他.c文件时,xxx_GLOBALS未定义,则xxx_EXT被定义为extern,这种情况下不产生内存分配,任何.c原创 2020-05-22 11:46:28 · 1253 阅读 · 0 评论 -
笔记:STM32中寄存器地址与指针的转换
1.STM32中的存储器映射地址(查STM32F429数据手册)/*片上外设基地址*/#define PERIPH_BASE ((unsigned int)0x40000000) /*AHB1总线基地址*/#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) /*GPIOB基地址*/#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)2.原创 2020-05-22 11:16:51 · 4244 阅读 · 2 评论