STM32
文章平均质量分 75
暖暖的纠结
ECIT
展开
-
STM32 DMA 清除传输完成标志错误导致的问题
STM32 DMA 清除传输完成标志错误导致的问题原创 2022-09-26 15:43:36 · 3854 阅读 · 3 评论 -
stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案
参考博文Invalid ROM Table原因及解决办法STM32芯片锁死问题概述在调试STM32时,出现如下的现象:软件写好之后首次下载程序至芯片时成功,但程序未能正常运行,之后再下载程序时便报错:Invalid ROM Table原因出现该现象的原因为板子外部晶振为25M,而程序软件上以8M为输入晶振频率,导致芯片超频锁死,无法连接、下载解决方案断电,将芯片原来通过10k电......原创 2020-04-13 14:08:23 · 5284 阅读 · 4 评论 -
定时器加状态转移图方式实现DS18B20
我们知道,DS18B20 是单总线时序通讯,采用严格的信号时序,以保证数据的完整性。因此如果采用操作系统,逻辑读取DS18B20为了避免时序被操作系统的任务调度,或者其他中断打乱,我们都会采用临界区的形式保护时序。正常情况下,DS18B20通信的时间并不长,也就几十us。时间长的是18b20的转换过程(750ms)。那么我们可以再和18B20通讯时关闭中断,通讯完毕立马开启中断,转换的过程可以不用管(时序要求再通讯部分)。这样就可以既不影响18b20数据的读取,一起不影响任务的调度。但是这样的话,我原创 2022-04-23 10:07:26 · 1845 阅读 · 1 评论 -
STM32 CmBackTrace 移植与使用
前言:在使用STM32 开发时,避免不了各种异常导致进入hardfault。通常如果进入hardfault 的错误容易复现好解决,直接debug调试即可。就怕hardfault 需要几天才能复现,这个时候总不能一直接连电脑debug等着它复现吧,因此需要一个工具能够定位 hardfault 错误,将进入while(1)循环之前将现场的环境保存下来,并且将这些数据通过串口打印或者存储到内部flash,后面在读取出来。HardFault 产生原因常见产生HardFault产生的原因大概有如下几类:数组原创 2022-04-08 10:08:10 · 3192 阅读 · 1 评论 -
FreeRTOS 简要介绍说明书
转载 2021-11-29 13:43:47 · 293 阅读 · 0 评论 -
STM32定时器系列-比较输出产出PWM波应用
硬件平台:STM32F4库类型:标准库有关于比较输出的原理部分,可以参考之前的博文:STM32定时器系列 - STM32定时器输出比较在这里只是做了一个应用:使用PWM比较输出产生PWM波形,并且PWM与DAC同步输出。PWM为低,DAC输出0,PWM为高,输出固定电压。在输出比较模式下,ARR 设置为最大0xFFFF,禁用预装载寄存器,并且开启比较输出中断,再中断中,修改占空比。/** ****************************************************原创 2021-07-07 13:23:34 · 631 阅读 · 4 评论 -
STM32 DAC + DMA + TIM 输出正弦波,三角波,方波信号
硬件平台:STM32F4库类型:标准库。参考:【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现DAC输出阻抗的问题:DAC集成了2个输出缓存,可以用来减少输出阻抗,无须外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭,如果带载能力还不行,后面就需要接一个电压跟随器,选择运放一定要选择电流大的型号。DAC使能输出缓冲后,DAC的最小输出电压为0.2V。最大电压为Vref±0.2(会造成削顶问题)。而未使能输出缓冲则可达到0V原创 2021-03-30 16:25:02 · 24878 阅读 · 15 评论 -
裸机开发利器:超精简的软件定时器multi_timer ---- 使用、代码分析和修改
一、概述:项目的仓库地址:https://github.com/0x1abin/MultiTimer参考文章:MultiTimer | 一款可无限扩展的软件定时器在裸机开发中,经常要使用定时器来实现某些定时功能,面对需要比较多定时器的场合,以前都是使用一个吻硬件定时器作为提供时间基准,然后使用计数器+标志位的方法来实现,其实就是采用时间片的方法。比如:while(1){ // 2ms执行 软件时钟系统 if(1 == sys_var._1msFlag) { sys._1m转载 2021-03-26 16:54:17 · 757 阅读 · 1 评论 -
STM32 特殊引脚作为普通IO口使用的问题
开发平台:Keil5硬件平台:STM32F103RCT6之前有有弄过的东西,因为没有记录忘记了,所以还得重新找资料寻找答案,所以说,博客还是得写啊,不然搞过的东西,又得重新再来一遍。(-_-||)1. OSC_IN 引脚接有源晶振,OSC_OUT 做普通IO口使用原理图如下:原理图中,我们将 OSC_IN 引脚接了有源晶振,OSC_OUT引脚需要采集DS18B20数据(也就是做普通IO使用),那么我们需要如何配置:在手册中,由讲解到:注意,再这里提到过,“当不适用主振荡器HSE时,P原创 2021-03-12 08:56:07 · 9404 阅读 · 0 评论 -
STM32实现扫频功能
简介我们都知道,在信号发生器中,有一个扫频模式:指信号发生器在指定的扫描时间内从起始频率到终止频率变化输出,扫频模式支持线性扫频、对数扫频、和步进扫频三种方式。起始频率和终止频率起始频率和终止频率是频率扫描的频率上限和下限。信号发生器总是从起始频率扫频到终止频率,然后又回到起始频率。 当起始频率< 终止频率,信号发生器从低频向高频扫描。 当起始频率> 终止频率,信号发生器从高频向低频扫描。 当起始频率= 终止频率,信号发生器以固定频率输出。修改“起始频率”或“终止频率”后,信原创 2021-02-06 10:07:03 · 15361 阅读 · 5 评论 -
STM32以太网通信-STM32F407与 DP83848 RMII硬件接口参考与注意事项
主要参考:STM32F407和DP83848芯片RMII模式硬件电路图参考常用元器件使用方法13:物理层接口芯片DP83848的使用方法分享一下STM32F407和DP83848芯片RMII模式硬件电路图电路原理图如上图所示,其中DP83848芯片的40脚是RMII_CRS_DV引脚,但我看到网上有好多原理图是把RMII_CRS_DV接到了DP83848芯片的39脚上,查了下芯片手册发现39脚是模式选择引脚,40脚才是CRS_DV引脚。在 常用元器件使用方法13:物理层接口芯片DP8384原创 2021-01-14 10:27:09 · 14160 阅读 · 1 评论 -
C语言中一些常用函数的使用记录
将整数转换为字符串类似 C语言<stdlib.h> 库中的 itoa() 函数。/** - @brief 将整数转换为字符串 - @param str: 字符串 - @param intnum: 要转换的整数 10位数 - @retval None */void Int2Str(uint8_t* str, int32_t intnum){ uint32_t i, Div = 1000000000, j = 0, Status = 0; for (i = 0; .原创 2020-12-22 15:13:24 · 600 阅读 · 0 评论 -
STM32定时器系列 - STM32定时器输出比较
STM32 定时器除了基本计数定时功能外,还对外扩展了输入、输出通道,从而可以实现输入捕获、比较输出功能。比较输出[Compare Output]功能:定时器通过对预设的比较值与定时器的值做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般来说,STM32的通用定时器和高级定时器都具有比较输出功能,不同的定时器可能通道数量上有差异。或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。因为比较输出的基本特征是计数器CNT的值与比较寄存器CC原创 2020-10-23 13:59:27 · 9606 阅读 · 0 评论 -
STM32 --通用定时器输入捕获功能
问题:开始的时候没有搞清楚 定时器时基 于 定时器溢出中断导致在计算的时候一直有问题。开始并没有怀疑是配置有问题,因为之前接触过定时器输入捕获功能,靠着自己的记忆配置了一下,认为 捕获功能 的定时是通过定时器设置的定时溢出频率来计算的(真心抽自己两巴掌)。结果导致问题的发生。真的是这些东西最好是通过博客的方式记录下来,方便自己,方便他人。现在然我们重新回顾一下这个功能:通用定时器输入捕获。内部定时器结构在 STM32定时器系列 - STM32常规定时器时基与时钟源 这篇博文中,我们讲述过,定时器原创 2020-06-11 10:38:39 · 8886 阅读 · 0 评论 -
STM32内部ADC测量时产生噪声的原因与消除的方法
首先让我们来看一张实际项目过程中,测试发现的问题:原创 2020-04-07 19:52:32 · 6257 阅读 · 3 评论 -
STM32 C语言使用 memset清空结构体 导致改变其他结构体数据的问题
首先,在C语言中,清空结构体的方法,我们一般会采用 memset函数。其原型是:void * memset ( void * ptr, int value, size_t num );函数功能: 填充内存块将ptr指向的内存块的前num个字节设置为指定值 value(解释为unsigned char).函数参数:ptr: 指向要填充的内存块的指针。value:要设置的值。该值以i...原创 2020-01-19 09:47:00 · 6639 阅读 · 0 评论 -
STM32配置外设时,外设结构体寄存器缺省带来的后果。
今天在调试定时器,PWM输入捕获的功能时,奇怪的发现,在某一处多添加一句语句导致改变了定时器模式的配置。正常情况下,我们配置外设的时候,都会采用这样的方式:static void TIM_PWM_Input_Config(void){ // bug 这里定义局部变量,会导致初始化的时候结构体数组不为0,使得寄存器初始化出错。 TIM_TimeBaseInitTypeDef TIM...原创 2020-01-15 10:25:01 · 1958 阅读 · 0 评论 -
STM32定时器系列 - STM32常规定时器时基与时钟源
常规定时器包括:基本定时器、通用定时器和高级定时器。基本定时器没有任何对外输入/输出,主要用作时基计数、定时。通用定时器:除了基本定时器的时基功能外,还可对外做输入捕捉、输出比较以及连接其它传感器接口【编码器和霍尔传感器】。高级定时器:此类定时器的功能最为强大,除了具备通用定时器的功能外,还包含一些与电机控制和数字电源应用相关的功能,比方带死区控制的互补信号输出、紧急刹车关断输入。...原创 2019-12-27 11:06:45 · 6426 阅读 · 7 评论 -
STM32 IAP Ymodem
STM32 IAP采用Ymodem协议升级固件公司最近软件需要通过IAP来升级所有板卡的固件,其中板卡有2块,一块主控板卡,一块子控板卡。其中,主控板卡与子控板卡之间采用RS485通信,PC与主控板卡采用RS232通信。具体框架:一、PC端与主控板卡首先,PC端与主控板卡之间的升级采用常规的 Ymodem 协议传输,IAP 升级。可以参考ST官方的IAP工程另外安福莱硬汉哥进行了整理可...原创 2019-11-12 14:49:43 · 1526 阅读 · 0 评论 -
STM32 DWT
本文介绍一种Cortex-M内核中的精确延时方法前言为什么要学习这种延时的方法?很多时候我们跑操作系统,就一般会占用一个硬件定时器——SysTick,而我们一般操作系统的时钟节拍一般是设置100-1000HZ,也就是1ms——10ms产生一次中断。很多裸机教程使用延时函数又是基于SysTick的,这样一来又难免产生冲突。很多人会说,不是还有定时器吗,定时器的计时是超级精确的。这点我不否认...转载 2019-10-31 20:22:13 · 7648 阅读 · 4 评论 -
VSCode 搭建 STM32开发环境
首先附上一张VS Code图.一直都喜欢这种,黑色主题感觉高大上。。因为公司准备上市,所以不能使用Keil开发了。在这之前有在Linux上开发过STM32。于是想着在Windows上也搭建一个。这样方便跨平台。于是决定搭建一个用VSCode + 开源 arm 工具链 + OpenOCD开发STM32的环境。一、需要的软件和工具。(VS Code)[https://code.visual...原创 2019-07-27 22:49:34 · 43194 阅读 · 9 评论 -
STM32学习笔记:CAN总线的过滤器
STM32 CAN控制器,提供了28个可配置的筛选器组(F1仅互联型才有28个,其他的只有14个), STM32 CAN控制器每个筛选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。根据位宽不同,每个筛选器组可提供: ● 1个32位筛选器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位 ● 2个16位筛选器,包转载 2016-09-29 10:06:38 · 3124 阅读 · 1 评论 -
STM32学习笔记:SysTick时钟
SysTick时钟,俗称“嘀嗒定时器”,它能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 它是由HCLK/8得到的,也就是:72MHz/8=9MHz。 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看原创 2016-09-22 15:14:48 · 3486 阅读 · 0 评论 -
STM32学习笔记:串口一键下载电路(CH340)的理解
如图:为原子的串口下载电路 在CH340的数据手册上有引脚的介绍以及作用: 这两个引脚:DTR#和RTS#都是 输出类型, MCUISP(一键下载工具),会控制CH340这两个引脚的高低电平状态,通过控制DTR#和RST#这两个引脚的高低电平状态,从而控制STM32的BOOT0 和 RESET. 用万用表测量可知,DTR#、RST#初始状态的时都是高电平,在启用下载的时候,DTR#维原创 2016-10-10 14:35:44 · 15993 阅读 · 5 评论 -
MOS管驱动电路——电机干扰与防护处理
此电路分主电路(完成功能)和保护功能电路。MOS管驱动相关知识:1、跟双极性晶体管相比,一般认为使MOS管导通不需要电流,只要GS电压(Vbe类似)高于一定的值,就可以了。 MOS管和晶体管向比较 c ,b ,e —–> d (漏), g(栅) , s (源)。 2、NMOS的特性,Vgs大于一定的值就会导通,适合用于源极接地时的情况(低端驱动), 只要栅极电压达到4V或10V就可以了。转载 2016-08-22 14:01:46 · 12926 阅读 · 1 评论 -
STM32学习笔记:adc采样得到的电压值用485发送给pc
采用adc1的通道10,将采集到的电压值用485发送给PC显示, 先上原理图, 源代码见附件, 这里想说的是几个要注意的问题: 1,ad输入的电压经过了R42和R44进行分压,所以pc显示的电压值将会减半, 2、采用这个函数进行发送数据的时候,每次都是发送一个8位的数据(即一个字节),也就是最大值为256,。超过1个字节默认发送地位,即你要发送的数据位0x0145,只会发送45,具原创 2016-07-21 09:20:22 · 9573 阅读 · 1 评论 -
STM32串口收数据的几种不同方式
引用:http://www.51hei.com/bbs/dpj-26383-1.html 本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RX转载 2016-07-08 10:12:07 · 2717 阅读 · 0 评论 -
STM32上移植FreeRTOS
STM32 Portable the FreeRTOS首先在网上看到大部分移植FreeRTOS 都是选择修改他的启动文件,我个人感觉这样不是很好,毕竟是汇编,当你采用不同的芯片型号时,又要修改不同的xx.S文件,所以我选择修改FreeRTOSconfig.h文件。 1. 下载STM32官方源码:我的是基于V3.5的官方库(有工程模板的可以不用)。 下载FreeRTOS的源码http://原创 2016-07-08 19:14:50 · 1685 阅读 · 0 评论 -
STM32学习笔记:gps两种解码的方式
做为现在的物联网行业,手持设备中,缺少不了的就是GPS定位功能。GPS模块和STM32的串口进行通信,将GPS的数据发送给M3的串口,由M3进行GPS协议的解码。解析出来后保存在响应的结构体中。在进行显示。这里分别介绍2中解析协议的方法,第一种就是自己写解析协议函数,第二种便是采用别人写好的GPS解析协议库:NMEALIB库,将这个库移植到M3中,直接调用API函数,就可以解析出GPS信息,同样的原创 2016-07-28 08:59:30 · 22470 阅读 · 10 评论 -
nmealib代码分析
从之前的samples/parse/main.c开始。以其中的一条GPGGA语句为例。nmeaINFO结构汇总的是gps数据信息,里面包括utc时间、定位状态、质量因子、经纬度、速度、方向等信息,之所以说是汇总,那是因为这里是对所有的nmea语句进行解析,然后将相应的数据赋值到该结构中,而不仅仅是其中的一条nmea语句,因为一条nmea语句不可能包括所有的gps信息。nmeaPARSER是解析nme转载 2016-07-27 21:34:51 · 1799 阅读 · 0 评论 -
(*(volatile unsigned int *))详解
使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x00000000)然后就可以用C语言对这个内存地址进行读写操作了读:tmp = RAM_ADDR;写:RAM_ADDR = 0x55;volatile的意思是说明这个变量是可能被别的程序或者本程序的其他线程修改的,这样编译器就不能优化它,每转载 2016-12-04 16:08:18 · 541 阅读 · 0 评论 -
中断服务函数的写法
编写中断服务函数时,经常使用到2个函数:第一个函数是判断某个中断是否发生另一个是清除某个中断标志位。在这里需要注意的一点就是:中断事件发生以后,CPU的主权交给了中断控制器,进入中断执行中断服务函数,执行完中断程序后,在将CPU的主权交给主程序。在退出中断前要清除中断标志位,否则在退出中断后,标志位没有清除。会再一次进入中断,一直循环,所以:要清除中断标志位。void EXTI3_IRQHan原创 2016-12-05 09:54:30 · 11504 阅读 · 0 评论 -
STM32学习笔记:单片机按键单击、双击、长按功能实现
由于项目产品的需要,只能设置一个按键,但是需要实现短按(即单击)切换工作模式、长按开关机、双击暂停等复用功能。下图是三种情况下的按键波形。按键未按下时是高电平,按下去是低电平。按键单击时,判断时间门槛设置为50~2000ms;长按门槛为持续按下2000ms。双击可以视为时间间隔很短的俩次有效单击,从第一次单击上升沿到第二次单击上升沿延时门槛为100~500ms。 //按键按下去会出现下降沿,设置按原创 2016-12-05 16:00:13 · 14046 阅读 · 4 评论 -
STM32中485采用串口DMA发送,切换收发状态问题
参考网上分享:https://www.amobbs.com/thread-5535672-2-1.htmlRS485使用DMA发送,切换收发状态,有以下几种实现方式:开启DMA的“发送完成中断”,在DMA的发送完成中断中,切换收发的状态。但是,这会导致最后的2个字节发送不出去,这是因为:DMA的“发送完成中断”出现在刚发送倒数第二个字节的起始位置,这个时候切换485的收发,若接收端不是奇校验...原创 2019-03-06 17:28:16 · 8823 阅读 · 3 评论 -
VSCode 开发STM32记录总结
1. 在用visual studio code编码keil工程时,提示variable “uint32_t” is not a type name不是一个type类型。解决方案:在c_cpp_properties.json文件中添加相关的头文件包含和宏定义,json片段如下:注意事项:添加Keil工程头文件路径D:/Keil_v5/ARM/ARMCC/include添加宏定义__CC_...原创 2018-12-14 08:45:17 · 7150 阅读 · 7 评论 -
STM32外部晶振不起振
芯片:STM32F429开发平台:Keil问题:STM32外部晶振不起振,选择了内部16MHZ,从而导致延时函数、波特率、定时器等等有问题。有源晶振和无源晶振的区别有源晶振一般4个脚,一个电源,一个接地,一个信号输出端,一个NC(空脚)。有个点标记的为1脚,按逆时针(管脚向下)分别为2、3、4。无源晶振有2个引脚,需要借助于外部的时钟电路(接到主IC内部的震荡电路)才能产生振荡信号,...原创 2018-10-11 11:24:29 · 26552 阅读 · 8 评论 -
STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题
1.问题描述产品在运行过程中需要保存一些断电不丢失的数据,为此将数据保存在STM32内部的flash中。但是测试人员在测试的过程中,修改了数据参数,直接断电重启机器,并没有等待flash的操作时间,导致原有的数据丢失。2. 原理分析本产品硬件平台是基于STM32F429,采用HAL库开发。在操作内部flash这部分中,查看数据手册得知: 对于操作128KB的扇区擦写32位数据...原创 2018-06-12 11:11:08 · 18364 阅读 · 8 评论 -
STM32学习笔记:ADC理解
ADC 简介12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 主要特性可配置 12 位、10 位、8 位或 6 位分辨率 ● 在转换结束、注入转换结束以及发...原创 2018-07-31 17:06:31 · 4380 阅读 · 1 评论 -
STM32采用普通的IO口来测量PWM的频率
STM32测量外部输入信号的频率的方法有很多:采用内部定时器输入捕获功能。采用普通的IO口设置外部中断+定时器的当时测量PWM信号的频率。 这两种方式比较推荐使用第一种,比较使用内部的资源可以节省CPU资源的利用, 当然当内部资源不够使用的时候,或者是说,硬件电路设计的时候没有连接相应的应引脚只能使用第二种方式了。本次由于硬件电路设计的不足,导致需要测量PWM输入信号的引脚没有接到相应的通道上原创 2017-10-28 22:01:46 · 11702 阅读 · 4 评论 -
STM32学习笔记:读写内部Flash。
首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失, RAM可以理解为内原创 2017-08-29 14:49:03 · 50517 阅读 · 6 评论