
STM32系列
ydgd118
这个作者很懒,什么都没留下…
展开
-
STM32串口printf通过DMA打印(含实测代码)
由于printf映射到串口后,打印耗时较久,特别是波特率低又有较频繁的打印时,严重影响主程序执行效率。STM32串口具有DMA功能,可以直接从RAM搬运数据到USART,解放了CPU。因此只要实现printf打印到RAM,再从RAM用DMA搬运到UASRT即可。原创 2023-09-20 09:40:13 · 1523 阅读 · 0 评论 -
STM32串口UART5进入不了接收中断
STM32串口UART5进入不了接收中断问题排查,最后发现是main函数里把中断向量表地址偏移了。原创 2023-02-01 17:58:53 · 5091 阅读 · 2 评论 -
STM32串口DMA接收253字节就死机原因排查
STM32串口DMA接收数据大于255字节死机原因排查。原创 2022-06-28 15:17:56 · 2480 阅读 · 1 评论 -
STM32结构体变量保存到FLASH的字节对齐问题解决
用巧妙办法解决结构体首地址的4字节对齐问题,实现使用32bit指针方便进行RAM数据和FLASH数据的相互存取。原创 2022-05-30 11:17:08 · 3918 阅读 · 7 评论 -
C语言格式化打印输出printf
原创 2021-09-13 14:13:43 · 258 阅读 · 0 评论 -
串口波形解析干货(一看就会)
下图为串口实测波形,设置为8N1格式,即8bit数据位,1bit停止位,无奇偶校验。绿色代表起始位,橙色代表停止位,绿色和橙色中间的是8个数据位,也就是一个字节。所以8N1格式传输一个字节需要发送10bit。要根据波形读字节的时候,首先找到停止位和起始位,在停止位和起始位的中间就是一个字节。串口收发一般都是LSB即低位优先,所以起始位后第一个bit传输的是该字节的最低位。比如传输字符’A’,也即0x41,二进制为0100 0001,起始位后第一位传输的是1,然后是0,依次是0,0,0,0,1,0,从起始原创 2021-09-05 14:49:25 · 10825 阅读 · 0 评论 -
航顺HC32F103C8T6串口通信失败问题解决
STM的MCU价格一路缺货飙涨,为降低成本使用航顺的MCU替换。HC32F103C8T6与中移M5311串口通信,波特率为115200,8N1格式。通信时发现失败的几率非常大,简单的发个“AT\r\n”有时候都识别不了。一开始怀疑是串口波形问题,示波器检查后发现HC发送数据波形完全正常,接收数据波形顶部稍微有点斜坡。如下图所示:所以考虑可能是由于斜坡导致HC32接收数据失败。原来设计是采用的2个三极管在3.3V和1.8V之间进行电平转换,为了验证是否是这个问题,直接打了样板使用专门的电平转换芯片接在HC3原创 2021-09-05 11:21:05 · 2822 阅读 · 0 评论 -
中移M5311模块MQTT协议连接阿里云物联网平台(干货)
一、准备三元组在阿里云物联网平台新建产品和设备后,平台给每一个设备自动赋予三元组。二、准备MQTT协议参数新建产品时,阿里云物联网平台会分配一个含productkey的子域名,端口号固定是1883。域名中含有阿里云物联网服务器的地理信息,如cn-shanghai,就是华东2服务器。这个不能搞错。Clinent ID是一个组合,是自己定义的ID号配上附加内容|*****|。这里是|securemode=3,signmethod=hmacsha1|,securemode=3意思是采用TCP直连方式接原创 2021-08-22 19:41:55 · 4501 阅读 · 0 评论 -
HK32F103C8T6串口DMA接收不定长数据HAL库
在将STM32F103的代码移植到HK32F103时发生问题。原来STM32使用DMA来接收串口数据,为了实现不定长接收,开启了串口IDLE中断。结果测试程序一直频繁进入IDLE中断。航顺官方给出了原因和解决办法如下,参考HK32F103 应用笔记 Rev1.0.32。按照以上流程测试发现只能进入一次IDLE中断,而且反应比较迟钝,从接收到转发数据相差1s,很不正常。在看HAL库的串口DMA相关函数时,发现一个新的库函数, HAL_UARTEx_ReceiveToIdle_DMA()/** * @原创 2021-08-06 02:08:00 · 2349 阅读 · 2 评论 -
两种常用AD转换数字滤波方法
核心思想是多次样本求平均值,在求平均值之前剔除掉干扰值。干扰值一般是最大或最小,当然还可以扩大范围,将次大次小值也进行剔除。递推中位值滤波法还可以演变成即时的,获取AD值后立即处理,不进行缓存,进一步节省空间。1、中位值平均滤波法(又称防脉冲干扰平均滤波法)/********************************************说明:采一组队列去掉最大值和最小值优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。对周期干扰有良好的抑制作用,平滑度原创 2021-07-14 17:56:45 · 1395 阅读 · 0 评论 -
双向可控硅实现单相交流电机正反转(硬开通加缓冲吸收,无过零)
单相交流电机实现正反转只需要改变电容串联的位置。如下图中的单刀双掷开关S,接1和2旋转方向正好相反:开关S可以用2个双向可控硅代替。一个可控硅接S—1,另一个可控硅接S—2,单片机控制触发脉冲让两个可控硅交替导通即可实现电机交替正反转。这里一定要注意选取合适的元件值。吸收电容不能低了,否则直接击穿导致电容失效,吸收电路无效进一步会导致可控硅击穿。为了抑制尖峰电压,并一个压敏电阻来吸收尖峰能量。压敏电阻的压敏电压要低于吸收电容和可控硅的耐压值,否则起不到作用。具体可看下面两个图波形。如果在峰值处打开原创 2021-05-29 12:39:09 · 6728 阅读 · 4 评论 -
STM32挂载SD卡记录日志
STM32挂载SD卡记录日志程序主要是在前一篇的基础上进行。使用CUBE配置STM32挂载TF卡,请看https://ydgd118.blog.youkuaiyun.com/article/details/111253588。记录日志主要是将运行中的数据转换为字符串,然后再写入到SD卡。需要解决两个问题:程序中各种格式的数据变量转换为字符串;SD卡文件关闭后再次打开继续接着写。解决第一个问题是使用函数sprintf(),函数具体定义和用法请看C标准库。“%02d”是输出2位宽度的十进制,“%.1f”是输出原创 2021-01-17 22:58:17 · 4682 阅读 · 8 评论 -
STM32+BM8563时钟芯片不走时问题解决(含配置代码)
STM32+BM8563时钟芯片不走时问题解决(含配置代码)一、寄存器BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。BM8563有16个寄存器,其中11个是BCD格式。配置是要注意值范围,不能超出。更多具体应用请看官方手册。二、晶振晶振选择非常重要。32.768不用说了,主要是ESR值,不能小了,也不能太大原创 2020-12-19 12:17:45 · 9834 阅读 · 7 评论 -
STM32F103RCT6挂载FATFS文件系统读写SD卡CUBE生成代码
STM32F103RCT6挂载FATS文件系统读写SD卡CUBE生成代码1. 配置系统时钟2.配置SDIO接口这里一定要记住配置号分频系数,36M时钟/36=1M,即为SD读写工作频率。频率建议不要太大,否则一些低速的SD卡可能无法兼容。SD卡速度分类如下图。可以看出速度差别很大,低速的才2MB每秒。为了良好兼容,建议设置分频系数使工作频率为2M以下。启用DMA,配置好中断优先级。配置好GPIO。选择4线模式后,除了检测是否有卡的引脚,其他CUBE会自动配置好。3.配置FATFS,选SD卡原创 2020-12-16 12:33:17 · 2570 阅读 · 8 评论 -
STM32软复位(软重启)函数
干货:void Sys_Soft_Reset(void)// 软重启{SCB->AIRCR =0X05FA0000|(u32)0x04;}void SoftReset(void){ __set_FAULTMASK(1); // 关闭所有中端NVIC_SystemReset(); // 复位}原创 2020-12-02 18:28:15 · 17861 阅读 · 5 评论 -
STM32F0F1F4内部flash擦写时间和寿命
STM32f0301. FLASH擦写时间2. FLASH擦写次数和数据保存年限只能擦写1000次,有点少。非必要,不要擦写。比如记忆流水号之类,经常变动的数据,最好使用EEPROM。STM32F103x8, STM32F103xB1. FLASH擦写时间和电流2. FLASH擦写次数和数据保存年限擦写1万次,保存20年。STM32F427xx STM32F429xx1. FLASH擦写电流2. FLASH擦写时间编程32bit只要16us,速度提高了近4倍。3. 使用VPP擦原创 2020-09-18 23:32:11 · 18789 阅读 · 0 评论 -
STM32F429 双通道AD转换采集纯软件查询非中断和DMA方式
非中断和非DMA方式可以用于特殊场景,比如其它外设占据DMA负担比较重而CPU又比较清闲的时候。1. STM32F429的AD转换最高12bit12位分辨率意味着我们采集电压的精度可以达到:Vref /4096。采集电压 = Vref * ADC_DR / 4096;Vref:参考电压ADC_DR:读取到ADC数据寄存器的值一般使用3.3V为参考电压,则采集到的电压 = ADC_DR*3.3/4096 。2. STM32F4的ADC转换不需要做程序校准。这在HAL库里也可以看出来,官方没有H原创 2020-09-12 23:27:56 · 1506 阅读 · 0 评论 -
SP3232EEN输入输出波形
一块板子232串口通信始终不对,于是用示波器测量一下输入输出,波形居然类似一个积分波形。如下图:蓝色为输入波形,数据正常。红色为输出波形,成了积分了。怀疑芯片损坏,于是更换max3232芯片,波形正常,如下图。测试设备232通信也正常。从图上看,3232芯片把数据反相了一下,幅度提升约4倍。图上波形为示波器探头*10档测得,可以看出红色通道幅度约12V,蓝色通道为输入信号,幅度约3.3V。...原创 2020-09-11 15:16:43 · 2573 阅读 · 0 评论 -
串口发送数组和单数据波形
发送单个数据是低位先发,发送一个数组是地址小的字节先发,然后依次发完,每个byte都有独立的开始位0、停止位1。所以如果使用8N1格式,那就是发送1个字节需要10bit,而不是8bit。波特率115200 = 115200 (位/秒),也就是1s最大发送115200/10=11520个字节,发送一个字节需要约86.8us。1/11520=86.805555555555556 us。波形如下,实测的,话不多说,直接上干货,看图就明白。...原创 2020-09-11 12:15:54 · 1476 阅读 · 0 评论 -
扇区号大于FLASH_SECTOR_11时进行加4操作
以下是STM32F4系列HAL库里的flash擦除函数。该函数下有一条语句是如果扇区号大于11,需要加4偏移值。从字面上理解,意思是如果我要擦除23扇区,则需要加4,就变成了擦除27扇区。其实这样理解是不对的。先看一下STM32F429的2Mbytes的flash空间,它被分成bank1和bank2,各1Mbytes。/* Base address of the Flash sectors */ /* STM32F429各个扇区的基地址 */ #define ADDR_FLASH_SECTOR_0原创 2020-08-28 18:09:19 · 850 阅读 · 0 评论 -
STM32F429内部FLASH读写擦除操作流程和寄存器配置要点
一、STM32F429 FLASH总体介绍双bank架构,容量高达2 Mbytes,支持read-while-write边读边写(RWW)支持128位宽的数据读取Byte、half-word、word 、 double word 写入sector, bank, and mass erase (两个bank)Dual bank memory organization对于2M产品,一个bank(1 MB)分为4个16 KB的扇区,1个64 KB的扇区和7个128 KB的扇区。2Mbytes是两个原创 2020-08-28 03:11:14 · 11414 阅读 · 0 评论 -
STM32总线外设分布
1、AHB总线:(1)Flash 存储器;(2)DMA;(3)复位和时钟控制;(4)CRC;(5)以太网;(6)SDIO;2、APB2总线:(1)USART1;(2)高级控制定时器TIM1和TIM8;(3)模数转换器ADC1、ADC2、ADC3;(4)SPI1;(5)外部中断EXTI;(6)复用IO,AFIO;(7)通用IO:GPIOA~G;3、APB1总线:(1)定时器TIM2到TIM7;(2)RTC;(3)WDT看门狗;(4)SPI2 、SPI3;(5)USART原创 2020-08-07 16:38:50 · 2486 阅读 · 0 评论