![](https://img-blog.csdnimg.cn/20190917145439186.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
STM32
文章平均质量分 73
利用STM32外设,驱动硬件设备
顶点元
你当像鸟飞往你的山!
展开
-
STM32 MAP文件结合固件文件分析
MAP 文件分析可以参考之前的文章程序代码在未运行时在存储器空间内称为加载域,在运行时在存储器空间内称为运行域。在这里我们根据加载域的描述可以知道加载域的空间结束位置应该为0x08020000+0x00010978=0x08030978的位置。从下面的固件我们可以知道固件的实际结束位置应该是0x080305E8。这里的俩个位置并不一致是什么原因呢?我们继续往下逐步分析。上图内容的最后一行:结束地址为0x080304e0+0x20=0x08030500,和第一行中的描述一致。根据类型和属性可以知道这一部分原创 2024-05-24 20:14:31 · 1052 阅读 · 0 评论 -
Keil MDK map文件学习笔记
从flash的0x08030500位置开始加载数据,加载大小为0x000069b0大小的数据到RAM空间(上图最后一行0x200049b0+0x2000=0x200069b0)。这里要注意的是并非直接从0x08030500直接向后复制0x000069b0大小的数据到RAM中,实际是根据FLASH空间中的0x08030500后面的部分数据和之前的分散加载表等内容在RAM中生成的0x69b0空间。上面两个红框中的内容分别对应于全局函数和全局变量,并显示了所在执行域空间的位置和大小。原创 2024-05-24 15:52:17 · 896 阅读 · 0 评论 -
基于STM32看Cotex-M内核中断向量表重定向
正常的执行过程为,启动时先执行Boot程序中的Reset_Handler函数然后经过分散加载,初始化堆栈,初始化C库后跳转到用户main函数执行,其中监测到不许要升级则通过跳转函数(设置主栈指针,将App中Reset_Handler函数的地址作为执行地址)跳转到App程序中的Reset_Handler函数,然后再经过分散加载,初始化堆栈,初始化C库等操作后跳转到用户main函数中执行,在main函数开始位置首先要修改VTOR的值,则后续的中断触发都会跳转到App代码中对应的中断服务函数中。原创 2024-05-24 13:25:54 · 996 阅读 · 0 评论 -
基于STM32看Cortex-M内核相关的一些底层知识
向量表位于存储器的开头部分,它的头两个字为主栈指针(MSP)的初始值,以及代表复位处理起始地址的复位向量(参考本书图4.26和4.5.3节)。细心的你可以能已经发现了,这里固件中存储的向量表的地址和map文件中对应的函数地址不完全一致,差了1,这是因为向量表的LSB位必须置1以表示Thumb状态(Cortex-M处理器不支持ARM状态)从上面的map文件中我们可以看出程序的栈顶地址就是0x200069b0,从下面的固件中我们可以看出起始地址存放的就是栈顶指针的值。复位函数是系统上电后第一个执行的程序。原创 2024-05-23 17:39:45 · 454 阅读 · 1 评论 -
STM32笔记---CAN采样点设置和报错
这里我们可以在HAL库的CAN中断处理的部分找到依据,ERRIE中断使能后出错时会将主状态寄存器(MSR)中的ERRI位置位,然后再依次判断有哪些分开关管理的错误中断触发了。之前使用CAN总线一直没详细搞清楚,使能的错误中断都具体对应的是什么,使用的时候一下把所有的CAN错误中断都使能上,正好今天遇到的CAN总线的一些问题,详细看了下。再同步补偿宽度(SJW)的设置范围位1-4TQ,相当于CAN总线的采样点可以根据实际情况在1-4个TQ范围内进行调整,这个值大可以增大CAN波特率的容错范围。原创 2024-04-12 19:37:23 · 1686 阅读 · 0 评论 -
STM32 HAL库 串口使用问题记录
多数应该出现在未开启DMA模式使用中断方式接收数据的情况,程序比较容易触发ORE错误引起频繁进入串口中断导致的假死现象。解决方法:在串口错误中断中清除错误标志后,要重新开启串口中断接收。对于该种情况可以参考。原创 2024-03-02 15:07:08 · 627 阅读 · 0 评论 -
STM32F4 HAL库串口死锁问题调试记录
STM32F4 HAL库串口死锁问题调试记录原创 2024-03-02 13:57:29 · 952 阅读 · 0 评论 -
Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题
Keil环境下CANopenNode移植到STM32问题记录原创 2023-07-07 18:56:27 · 1538 阅读 · 1 评论 -
vscode+makefile开发STM32---支持C++开发
vscode+makefile开发STM32---支持C++开发原创 2022-11-18 10:47:53 · 1236 阅读 · 0 评论 -
vscode开发STM32(四)--- 技巧篇
vscode开发STM32(四)--- 技巧篇原创 2022-11-18 10:13:56 · 847 阅读 · 0 评论 -
vscode+makefile开发STM32(二)---下载
vscode+makefile开发STM32原创 2022-11-17 20:35:15 · 1340 阅读 · 0 评论 -
STM32+GCC编译问题记录
STM32 使用GCC编译问题记录原创 2022-11-17 13:47:46 · 309 阅读 · 0 评论 -
STM32F407 USB虚拟双串口
STM32F407 USB 虚拟双串口文章目录STM32F407 USB 虚拟双串口准备工作代码修改端点配置修改描述符修改数据处理准备工作通过STM32CubeMX生成一份标准的USB VCP例程.代码修改端点配置修改增加第二个虚拟串口用到的端点配置,一个虚拟串口需要用到3个非0端点(2个bulk和一个interrupt)设置增加端点的FIFO注意 : 这里的FIFO大小的设置有一定的讲究,否则会导致一些异常,如将端点1和端点3的FIFO大小都设置为0x80则会导致某一个虚拟串口的原创 2021-08-16 20:31:43 · 3234 阅读 · 10 评论 -
STM32CubeMX知识点
STM32CubeMX知识点文章目录STM32CubeMX知识点System CoreRCCSYSSystem CoreRCC高速外部时钟(HSE)选择:旁路时钟源(BYPASS Clock Source) : 也就是外部时钟源石英/陶瓷 晶振(Crystal/Ceramic Resonator)SYSSYS模块主要为调试选项Serial Wire : 通过SWD协议下载调试JTAG : 通过JTAG协议下载调试Trace Asynchonous Sw : SWD协议追踪功能原创 2021-08-16 12:56:11 · 647 阅读 · 0 评论 -
STM32驱动AS5600磁性旋转位置传感器模块
文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料简介AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。引脚定义I2C接口7位设备地址为0x36(二进制表示为0110110)支持标准模式和原创 2021-07-21 17:04:23 · 10035 阅读 · 15 评论 -
STM32看门狗
STM32 看门狗STM32具有两个看门狗外设:独立看门狗(IWDG)和窗口看门狗(WWDG)。独立看门狗号称宠物狗,窗口看门狗号称警犬。两个看门狗均可用于检测并解决由软件错误导致的故障。当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。IWDG适用于那些需要看门狗作为一个主程序之外,能够完全独立工作,并且对时间精度要求比较低的场合。WWDG适用于那些要求看门狗在精确计时窗口起作用的应用程序独立看门狗独立看门狗一般用于避免程序跑飞或出现死循环的情况。独立看门狗通俗一原创 2021-04-17 09:21:47 · 651 阅读 · 0 评论 -
keil MDK AC5向AC6迁移后如何重定向printf
从AC5向AC6迁移,已经有很多人给出了迁移的教程,AC6的编译速度着实非常有吸引力,我也尝试根据网上的教程从AC5向AC6迁移,但程序执行到printf的时候便会有问题。有问题的重定向代码:/* ------------------通过重定向将printf函数映射到串口1上-------------------*/#if !defined(__MICROLIB)#pragma import(__use_no_semihosting)void _sys_exit(int x) //避免使用半主机原创 2020-12-03 16:23:33 · 3579 阅读 · 6 评论 -
STM32 HAL+PWM+DMA方式驱动WS2812灯珠波形分析
通过示波器观察PWM+DMA的方式驱动WS2812灯珠的波形及分析对应的现象文章目录1. 在DMA传送完PWM波形后不关闭PWM的DMA输出2. 在DMA传送完PWM波形后,在PWM传输完成后回调函数中关闭PWM的DMA输出3. 在DMA传送完PWM波形后,在DMA中断函数中关闭PWM的DMA输出分析1. 在DMA传送完PWM波形后不关闭PWM的DMA输出灯珠显示效果:灯珠会错乱显示(没有按正常设定的颜色显示)示波器显示如下:2. 在DMA传送完PWM波形后,在PWM传输完成后回调函数中关闭P原创 2020-11-11 18:48:15 · 3098 阅读 · 2 评论 -
STM32 BUG记录
STM32 BUG 记录STM32F429芯片的PA1和PA2引脚无法输出PWM波PA1: TIM2_CH2 TIM5_CH2PA2: TIM2_CH3 TIM5_CH3 TIM9_CH1HAL库和标准库都进行了测试,配置成以上可以配置的定时器和通道都不能够输出PWM波。将TIM2_CH2和TIM2_CH3分别映射到PB3和PB10引脚便可以正常输出PWM波。...原创 2020-11-10 16:22:56 · 510 阅读 · 0 评论 -
STM32 HAL 详述串口收发的所有方式
STM32 HAL 详述串口收发的所有方式文章目录STM32 HAL 详述串口收发的所有方式串口收发方式串口发送轮询发送中断发送DMA发送串口接收轮询接收中断接收中断+IDLE接收DMA+IDLE接收正常DMA循环DMA附注串口收发方式串口收发的使用无外乎下面这些使用方式#mermaid-svg-4J50cdASYQdah8Pb .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-famil原创 2020-10-31 10:32:33 · 897 阅读 · 0 评论 -
stm32 bootloader启动正常,APP程序会在时钟配置出错原因分析
实验环境STM32F411芯片HAL库利用CubeMX生成的Bootloader和APP工程现象描述将Bootloader和APP程序分别下载到板子上,发现程序会死在Error_Handler()的while(1)循环中。具体调试发现程序是在执行HAL_RCC_OscConfig()函数的PLL 配置部分检测到当前PLL已经被配置为了系统时钟而返回了HAL_ERROR的返回值导致进入了Error_Handler()。分析网上搜索了一下,发现了一种说法:PLL在启动之后便不能够重新配置。为原创 2020-09-24 13:59:24 · 2982 阅读 · 7 评论 -
KeilMDK不支持二进制表示解决方法
在移植WS2812FX库时遇到了一些报错,最终的报错指向了一些定义的二进制表示的宏,还以为是那个地方语句写错了,上网搜了一下竟然是Keil MDK不支持二进制表示。这里直接从Arduino库里复制了一份binary.h文件到自己的工程中便很好的解决了这个问题。在此记录一下,方便后面遇到类似问题时可以快速解决。binary.h/* binary.h - Definitions for binary constants Copyright (c) 2006 David A. Mellis. Al原创 2020-09-21 13:51:53 · 3482 阅读 · 3 评论 -
WS2812灯珠(六)---移植WS2812FX库
移植WS2812FX库该库实现了比Adafruit_NeoPixel库更丰富的显示效果,且该库的实现是建立在Adafruit_NeoPixel库的基础上实现的。这里的移植是基于STM32 Keil MDK实现的(其他平台未测试)。移植原则移植需要用到的变量,这里全部声明为static,外部函数需要使用其变量时必须通过函数的方式访问。为所有向外提供使用的函数统一添加Adafruit_NeoPixel_的前缀,既便于识别又不会和其他文件函数产生重名冲突。当函数存在重载情形时将重载函数的不一致参数组合原创 2020-09-21 13:43:34 · 6017 阅读 · 4 评论 -
WS2812灯珠(五)---移植Adafruit_NeoPixel库
将Adafruit_NeoPixel库移植为C版本Adafruit_NeoPixel库为实现WS2812类似系列的灯珠实现非常酷炫的效果提供了各种接口函数,应用层可以很方便的利用这些接口函数实现各种丰富的显示效果。Adafruit_NeoPixel库提供的example中包含了很多炫酷效果的例程,实现更加丰富效果的WS2812FX库便是利用Adafruit_NeoPixel库的基础上实现的。这里将其移植为C语言版本可以更广泛的应用到嵌入式平台上,也为后续移植WS2812FX库打下铺垫。移植原则:移原创 2020-09-21 13:20:16 · 8788 阅读 · 7 评论 -
STM32使用过程中的踩坑记录
STM32使用过程中的踩坑记录原创 2020-07-27 15:52:11 · 2451 阅读 · 0 评论 -
I2C学习笔记---基于手册一步步实现软件I2C
I2C学习笔记文章目录I2C学习笔记一、学习《I2C总线规范》I2C总线特征:重要知识点数据传输二、实现软件I2C实现1. 预处理2. `i2c_init()`3. `i2c_start()`4.`i2c_stop()``5.i2c_ack() i2c_nack()`6. `i2c_waitACK()`7.`i2c_writeByte()`8.`i2c_readByte()`测试总结一、学习《I2C总线规范》I2C总线特征:两条总线:一条串行数据线(SDA);一条串行时钟线(SCL)传输速率:原创 2020-07-18 16:03:07 · 3654 阅读 · 1 评论 -
彻底搞清printf在STM32上的使用
彻底搞清printf在STM32上的使用文章目录彻底搞清`printf`在`STM32`上的使用重定向`printf`ARMCC版本(keil MDK)ARMGCC版本(GCC)重写`printf`重定向printfARMCC版本(keil MDK)下面这段代码,在实现串口发送一个字节的函数后,可以在勾不勾选”微库“的情况下都可以正常使用printf函数。__MICROLIB是勾选微库后会...原创 2020-03-13 17:20:38 · 6510 阅读 · 5 评论 -
STM32F407_HAL_TIM_DMA驱动WS2812
STM32F407_HAL_TIM_DMA驱动WS2812初始化函数可以通过CubeMX配置,这里直接通过原码记录:芯片外设层驱动tim.h#ifndef __TIM_H#define __TIM_H#include "stm32f4xx.h"extern TIM_HandleTypeDef htim3;void HAL_TIM_MspPostInit(TIM_Handl...原创 2020-03-10 18:20:14 · 3035 阅读 · 4 评论 -
STM32HAL库串口处理---中断收发
STM32HAL库串口处理—中断收发文章目录STM32HAL库串口处理---中断收发Arduino串口机制的接口函数代码实现编写硬件层MSP支持代码定义新的串口结构体接口函数实现实例化对象`serial_init()``serial_available()``serial_peek()``serial_read()``availableWrite()``serial_flush``serial_...原创 2020-03-05 21:57:39 · 4752 阅读 · 0 评论 -
STM32HAL库微秒延时函数的实现---DWT和SysTick
文章目录STM32 HAL库微秒延时函数的实现利用SysTick再实现微秒延时函数利用DWT(数据观测点)实现微秒延时函数`dwt.h`文件`dwt.c`文件`delayMicroseconds()`函数结论在这里插入图片描述结论STM32 HAL库微秒延时函数的实现天下苦STM32 HAL库微秒延时久已。不占用其他定时器资源又不使用循环的方式就不能实现微秒延时函数了吗?答案是否定的,我们还有...原创 2020-03-05 08:59:30 · 7052 阅读 · 1 评论 -
stm32 u8g2移植笔记
STM32 u8g2 移植笔记前言当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,ram为2k的arduino uno上都不会报空间不足,却在flash为512k,ram64k的stm32zet6上报错空间不足?这是由编译器导致的,arduino使用的是avr-gcc编译器在编译的时...原创 2019-12-15 18:40:08 · 2559 阅读 · 1 评论 -
STM32 SysTick秒用
STM32 SysTick妙用 这里针对的是无操作系统的情况下的使用。之前一直想利用systick既实现记录系统运行时间又能够精确实现微秒延时的功能,如果将SysTick的定时器的定时中断时间设置为1us,这在有些情况下会导致死机的问题。这样的话就无法利用systick来实现us延时函数了。 利用SysTick实现1ms定时中断,us延时函数可以利用SysTic...原创 2019-10-28 11:44:54 · 613 阅读 · 0 评论 -
基于STM32指纹识别模块(TFS-M64)的学习
之前的同学想用指纹模块做个东西,便让我帮他看看。收到之后了解了一下,最终是通过串口做通信的。这款产品是深圳十指科技的指纹模块,不过两年前就已经停产了。现在的新版的模块通信方式是完全一样的(串口通信),通信协议的变动也很少,不管是新模块还是老模块操作方式还是兼容的。 开始的时候用STM32的板子和它通信,...原创 2018-08-15 08:12:47 · 13341 阅读 · 0 评论 -
STM32F407(CubeMX+HAL+USB(vcp))移植rosserial和ROS通信
前言之前尝试过移植好rosserial的stm32通过串口和ROS系统建立通信,但无奈在类似于发布IMU类似的数据量很大的消息或消息的发布频率较高时经常会出现一些问题(发布频率达不到设定要求,启动rosserial的终端会报一些警告和错误),在一般的学习中还可以,但在实际的应用中基本达不到使用要求。写道这想说明一点:我对整个rosserial内部的通信机制也不是很了解,类似于通信速度达到多少可...原创 2019-07-31 12:15:39 · 3134 阅读 · 0 评论 -
WS2812灯珠(三)-- STM32 PWM+DMA方式驱动
WS2812灯珠(三)-- STM32 PWM+DMA方式驱动文章目录WS2812灯珠(三)-- STM32 PWM+DMA方式驱动一、理论二、代码实践一、理论PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装载寄存器ARR的值决定,占空比由比较寄存器CCR的值决定。由WS2812规格书可知:WS2812灯珠的通信速度为800Kbit/s。数据传输时间(T...原创 2019-08-15 15:42:08 · 19326 阅读 · 30 评论 -
ESP8266(二)---工作模式&AT指令
工作模式:ESP8266模块支持STA/AP/STA+AP 三种工作模式STA(Station) 模式: ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。AP(Access Point) 模式: ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。STA+AP 模式: 两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便...原创 2019-05-15 17:24:05 · 4725 阅读 · 1 评论 -
keil MDK使用过程中遇到的问题及解决办法(更新)
keil MDK使用过程中遇到的问题及解决办法1. 程序卡死在 BX R0(汇编卡死在 BEAB BKPT 0xAB)处原因:程序中可能使用了printf()函数而没有勾选使用微库(或未定义printf函数就直接使用了)解决方法:如果需要微库的方式实现的printf()函数,把微库勾选上若不需要printf()函数,将程序中的printf()函数清除。 List item...原创 2019-04-16 22:54:40 · 4995 阅读 · 1 评论 -
STM32驱动多个超声波模块(只用一个定时器)
用STM32单片机成功驱动一个超声波模块后,接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢?(驱动一个超声波模块可以参考:stm32驱动超声波模块测距)超声波模块型号为HC-SR04,模块驱动方式选择利用外部中断的方式驱动(具体细节可参见上面链接)。经过一个下午的思考实验发现了两种驱动多个超声波模块的方法:分时测量同时测量1.分时测量:通过类似于实现流水灯的方法,多个超...原创 2019-03-11 23:01:06 · 9728 阅读 · 13 评论 -
STM32使用虚拟示波器
STM32使用虚拟示波器在调试过程中.,经常会有需要看到数据实时变化的情况,这时候便需要用到虚拟示波器。如:制作平衡车时,需要了解拟合角度跟随加速度计和陀螺仪的动态变化情况;做电机PWM调速时需要了解速度的变化曲线等。对于虚拟示波器的选择,由于之前参加过飞思卡尔,用过是山外的多功能调试助手中的虚拟示波器,感觉还不错。现在想用stm32制作一个平衡车,需要用到虚拟示波器,现在把使用方法分享...原创 2019-01-12 10:49:02 · 9777 阅读 · 9 评论 -
STM32驱动MAX6675读取K型热电偶温度
MAX6675 进行热电偶冷端补偿和数字化 K 型热电偶信号。输出 12 位分辨率、 SPI 兼容、只读的数据。转换器的精度为 0.25℃,最高可读+1024℃,如果使用数据的 8LSB 则温度范围为 0℃到+700℃。 MAX6675模块的原理图:从网上看到max6675模块并不便宜,正好手头又有MAX6675的芯片于是自己便根据原理图在洞洞板上搭建了一个测试模块 ...原创 2018-08-16 08:02:17 · 23903 阅读 · 14 评论