嵌入式-单片机
这个专栏主要是嵌入式单片机方向的一些知识
学无-止境
每天进步一点点就行
展开
-
移植ST的USB驱动库到STM32F4用于MSC时(SD卡)无法识别到设备问题解决办法
STM32 USB模拟U盘(MSC)无法识别到设备解决办法原创 2023-05-25 10:14:43 · 1533 阅读 · 2 评论 -
使用STM32L4系列SPI字节收发异常原因查找
STM32L4系列MCU 使用自己编写的收发函数时出现通信异常问题原创 2022-11-04 15:11:12 · 1802 阅读 · 0 评论 -
串口接收中断+空闲中断实现多个数据帧接收与处理
串口不定长度报文接收方法原创 2022-06-11 19:27:10 · 2032 阅读 · 3 评论 -
Freertos任务切换异常问题
taskSELECT_HIGHEST_PRIORITY_TASK卡死在断言configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); 中原创 2022-03-14 17:48:57 · 3263 阅读 · 9 评论 -
用IO口模拟串口(外部中断+定时器)--附程序附测试结果
给大家分享一下我用IO口模拟串口的一种方法,经测试使用这种方法发送能支持115200波特率,接收9600波特率测试没问题,接收波特率能否提高受制于用户应用场景是否能允许微妙级别的频繁中断了,我实际使用由于MCU主频不高(才32M),处理能力有点差,9600波特率勉强能接受。如果你的MCU主频很高而且使用到的中断也不多,是可以将接受波特率往上提升的。 下面介绍一下我模拟串口使用的方法,我采用的是外部中断+定时器的组合来实现的,将接收引脚(RXD)配置为外部中断引脚,下降沿触发,配置......原创 2022-01-23 10:21:55 · 10177 阅读 · 0 评论 -
用一次N点的FFT求两个长度为N的实序列的FFT的算法
当你需要对两个长度为N的序列分别计算FFT时,传统的做法是一个序列一个序列进行计算,这种方法对速度有要求的场合明显不适用,这里向大家推荐一个FFT算法,此算法可以实现用一次N点的FFT求两个长度为N的实序列的FFT,用这方法可以大大加快计算速度,此算法的原理是利用傅里叶变换的共轭对称性,详细原理可以参考如下链接:FFT共轭对称性原理:https://www.zhihu.com/question/20904987现对此算法用matlab成功实现,在此分享出来供大家参考:%用一次N点的FFT求两个原创 2021-12-04 17:24:10 · 4495 阅读 · 0 评论 -
BC260无法连接MQTT服务器
当遇到BC260使用"AT+QMTOPEN=xxx"指令报错时,可能的一个原因是当前固件版本不支持MQTT,我遇到的就是这个原因导致的。如果你使用“ATI”指令查询到的版本号不是“BC260YCNAAR02A01”而是下面图片的版本号那说明你的模块还不支持MQTT,需要升级固件才行。BC260Y-CN的软件开发进度如下:升级所需要的固件和升级工具以及教程可以从下面链接下载:点击:BC260Y新版固件+工具没有积分的小伙伴私信我或者留下邮箱!...原创 2021-10-27 19:35:55 · 566 阅读 · 0 评论 -
SX1268 SX1262中文数据手册
在使用SX1268的时候,只有英文数据手册,中文手册没有人翻译,现提供SX1262的中文手册方便大家在开发SX1268程序时使用,这两款芯片使用上几乎一样的,只是SX1268支持中国频段,寄存器和模式和一些特性都是一样的,所以具备参考价值,此中文手册带有书签。没有积分的留下邮箱,我看到后发邮箱。SX1262_8中文数据手册.pdfhttps://download.csdn.net/download/qq_27718231/34030085...原创 2021-10-23 16:24:01 · 4248 阅读 · 79 评论 -
关于L76C GPS模块出来的坐标和实际坐标有偏差的解决办法
最近使用GPS模块(L76C)定位时发现获取到的坐标在地图上面显示的位置和实际的位置存在偏差,产生此问题的原因是坐标系不统一导致的。我们从模块获取到的定位数据使用的坐标系叫做WGS84坐标系,而地图软件使用的坐标系并不是这个,例如百度地图使用的坐标系是BD09,高德地图使用的坐标系是GCJ02。这三种坐标系的介绍如下:WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐原创 2021-08-19 11:58:08 · 1786 阅读 · 0 评论 -
GD32F103串口接收卡死问题解决
问题描述:使用GD32串口空闲中断接收数据时,发现当我发送数据后,MCU总是会出现卡死,但是进入keil调试却又正常, 不仿真接收就会出现卡死现象,经检查MCU其实没有死,只是频繁进入了串口中断服务函数, 再经检查原来是空闲中断清除标志的方式和STM32L4不一样导致空闲中断标志一直没有清除,因为我之前一直用的是STM32L4x系列.GD32空闲中断标志清除过程如下:而STM32L4的空闲中断标志清除过程如下:STM32L4有一个ICR寄存器,清标志只要直接置位就行.解决后的程序..原创 2021-08-19 09:46:56 · 5066 阅读 · 1 评论 -
GD32F103时钟配置
用过STM32单片机的知道,单片机的主频是需要使用者自己配置的,但是GD32库移植好后,不需要自己写时钟配置函数,库函数中会有默认的时钟配置函数,但是需要根据所选择的晶振频率修改几个地方修改方案有以下两种:第一种方案:1.第一处要修改的地方:修改gd32f10x.h 中的HXTAL_VALUE宏定义这里我使用的是12M的晶振,因此修改成下面这样#define HXTAL_VALUE ((uint32_t)12000000)2.第二处要修改的地方:修改system_gd32f10x...原创 2021-08-18 20:57:29 · 7756 阅读 · 1 评论 -
NMEA协议解析
NMEA 协议是为了在不同的 GPS (全球定位系统)导航设备中建立统一的 BTCM (海事无线电技术委员会)标准,由美国国家海洋电子协会( NMEA-The National Marine Electronics Associa-tion )制定的一套通讯协议。 GPS接收机根据 NMEA-0183 协议的标准规范,将位置、速度等信息通过串口传送到 PC 机、 PDA 等设备。NMEA-0183 协议是 GPS 接收机应当遵守的标准协议,也是目前 GPS 接收机上使用最广泛的协议,大多数...原创 2021-08-18 17:06:39 · 7656 阅读 · 11 评论 -
用外部触发同步STM32定时器,实现精确测量时间
测试芯片:STM32L151RCT6功能要求: 通过外部触发,使能脉冲生成同时使能捕获定时器抓取所生产脉冲的上升沿,然后计算从触发到捕获到上升沿的时间。在测量飞行时间的应用场景,例如超声波测距,超声波测流量等场景对时间测量要求比较高,此时就可以用此方法来做。实现代码如下:/** 全局变量 */uint32_t Cap_Cnt; /*!< 存放捕获值 */uint8_t Status; /*!< 捕获状态 */uint8_t Process; /*!&l...原创 2021-07-23 16:12:21 · 2319 阅读 · 5 评论 -
关于STM32输入捕获定时器未启动就进入捕获中断的问题
测试芯片:STM32L151RCT6问题描述: 当我初始化完成输入捕获定时器后,我在未使能这个定时器的时候,在输入捕获引脚输入PWM脉冲,这是发现捕获定时器的捕获标志(CC1IF)置位了,同时也进入了中断。参考附在后面。问题分析: 这个现象开始我很困惑,我还未使能这个捕获定时器怎么还能进入捕获中断呢?网上找相关问题的资料也没有,那就只能从手册上面找答案了,找了许久手册也没有直接说为什么会这样,但是我看定时器使能位CEN时,我大概明白了,CEN位叫计数器使能,置1...原创 2021-07-23 09:30:10 · 2429 阅读 · 0 评论 -
STM32L431使用TIM单脉冲模式实现指定数量PWM输出
有些场合我们需要生成指定个数的PWM,实现方法有很多,这里我介绍一个通过高级定时器的单脉冲模式+重复计数实现指定个数PWM输出,生成完成后会自动停止。实现程序如下:/** * 说明 : 产生指定个数脉冲 * 参数 : 无 * 返回 : 无 */void Pulse_Timer_Init(void){ LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruc原创 2021-07-20 15:59:22 · 1592 阅读 · 0 评论 -
STM32定时器同步功能3
STM32定时器同步功能3:定时器门控功能使用,主定时器产生触发,从定时器接收触发进行计数,主定时器停止,从定时器也停止,这样可以通过从定时器来计算主定时器产生的脉冲数。本例中主定时为TIM3,从定时器为TIM2,TIM3配置为PWM输出,并且使能主从模式,并将更新事件输出给从机TIM2,从机TIM2检测到触发信号后进行计数,计数到指定值CNT后,产生更新中断。这个CNT值就是TIM3输出的PWM脉冲数,使用这种脉冲计数方式可以避免频繁中断产生,并且可以精确计算脉冲数。PWM输出频率= TI..原创 2021-05-22 19:59:26 · 1814 阅读 · 0 评论 -
STM32定时器同步功能2
STM32定时器同步功能2:用一个定时使能另外一个定时器测试芯片:STM32L151C8T6代码库:LL库本例中,TIM3为主定时器,TIM2为从定时器,通过TIM3 的更新事件使能TIM2,TIM2 收到触发信号时,其 CEN 位会自动置 1,并且计数器开始计数,直到向 TIM2_CR1 寄存器的 CEN 位写入“0”才停止计数。使用注意事项:1.使用LL库初始化TIM3时单独配置各个功能,建议不要使用LL_TIM_Init初始化函数,因为这个函数初始化配置后会软件产生一次更.原创 2021-05-22 11:13:48 · 2355 阅读 · 0 评论 -
STM32定时器同步功能1
STM32定时器同步功能1:将一个定时器用作另一个定时器的预分频器测试程序说明:测试芯片为STM32L151C8T6, 程序库使用的是LL库用TIM3为主定时器,产生更新事件,并产生触发输出(TGRO)给TIM2,TIM2的时钟来自TIM3的TGRO信号,TIM2作为从定时器,配置为PWM输出模式。内部触发连接如下图:/** * 说明 : 从定时器初始化,用来生成PWM * 参数 : 无 * 返回 : 无 */ void Pwm_Timer_Init(voi.原创 2021-05-21 16:46:15 · 2594 阅读 · 2 评论 -
STM32停止模式唤醒后串口数据发送错误问题
最近调试串口时发现,每次从停止模式唤醒后发送的第一条数据老是出错,出错现象是所发送的数据前面会出现多出一些乱码数据,如下图所示。后面经过排查发现是串口发送函数导致的,出错代码如下。出错原因就是发送完成标志还没有置位,就进入了低功耗模式,导致退出时再次发送就会出问题(具体原因还未知,手册里面有这样一段话“数据发送期间不应复位 TE 位。发送期间复位 TE 位会冻结波特率计数器,从而将损坏 TX 引 脚上的数据。当前传输的数据将会丢失。”,我遇到的这种出错问题可能就是这个,进入低功耗之前还处在发送状原创 2020-08-31 16:21:30 · 1968 阅读 · 6 评论 -
HDC1080传感器使用
HDC1080温湿度传感器的驱动链接(函数都封装好了,稍微改改就能用了):没有积分的小伙伴给我发消息或者留下邮箱!!白嫖了网上这么多资料也该回馈回馈了!HDC1080使用步骤:1.编写I2C驱动(模拟I2C)2.通过读取Manufacturer ID测试驱动以及芯片是否正常(读取到的数据是0x5449则说明驱动和芯片工作正常),如下图3.配置HDC1080芯片的0x02寄存器的几个参数如下图4.发送读取读取0x00寄存器的命令触发温度和湿度的转换,注意在发送完寄存器地址后需要原创 2020-07-23 20:02:41 · 22420 阅读 · 61 评论 -
STM32L476多通道TIM+DMA+ADC采样(LL库)
本代码适合定时采集N个点然后处理的场合,比如定时采集电池电压,每次采集64次采集完后计算64次平均值。本代码已经用于项目,本代码ADC的启动和停止对于功耗控制较为严格的场合特别适用。/* * 函数名称: Samp_TIM_Init * 函数说明: TIM4初始化,此定时器用于采样触发(采样率可以设置,这里设置的是1K) * 输入参数: 无 * 返回参数: 无 */void Samp_TIM_Init(void){ LL_TIM_InitTypeDef LL_TIM_Struct={0}原创 2020-06-11 14:17:56 · 2249 阅读 · 0 评论 -
STM32RTC唤醒功能配置(基于LL库)
/* * 函数名称: RTC_Wake_Init * 函数说明: RTC唤醒初始化(需要在时钟初始化中打开LSE) * 输入参数: 无 * 返回参数: 无 */void RTC_Wake_Init(void){ /* 设置RTC时钟源 */ LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); /* 使能RTC时钟 */ LL_RCC_EnableRTC(); /* 失能RTC写保护 */ LL_RTC_Disabl.原创 2020-05-08 19:25:16 · 3119 阅读 · 0 评论 -
基于C语言实现离散时域积分算法
时域积分公式如下:由于实际应用时传感器采样得到的点都是离散的,因此我们常常需要用到的是离散时域积分算法,对离散点的积分就是求和。matlab实现积分算法:% 积分clc;t=0:1/1000:0.2; %时间向量,包含了10个周期syms xf=0.5*cos(100*pi*x); %测试函数定义x1=0.5*cos(100*pi*t); %离散化处理v=int(f); %一次积分x2=subs(v, t); ...原创 2021-05-20 16:08:30 · 3863 阅读 · 6 评论 -
使用STM32CubeProgrammer软件实现对STM32L4xx系列单片机程序下载
串口下载介绍串口下载简单方便,仅需一个USB-TTL模块几根杜邦线就可以了,而且产品量产时不用给生产源代码就可以实现烧录操作,省下了购买JLINK的成本。软件上也只需要随便选择一个支持串口烧写的串口就行,一般使用的是调试串口。使用串口下载唯一的不足就是不能在线调试。串口下载准备工作1.一台安装了STM32CubeProgrammer软件的电脑2.一个USB-TTL模块3.4根杜邦线4.带有STM32L4xx系列芯片的设备(本次测试用的是STM32L431KBU6)5.要烧写的HEX文件6.检原创 2021-03-05 11:05:11 · 2829 阅读 · 4 评论 -
基于TI的SDK搭建keil IDE使用的编译环境
KEIL编译环境建立流程一、准备工作二、安装SDK,安装keil,导入PACK包三、SDK说明四、工程建立一、准备工作开发MSP432程序前,需要准备以下几个东西:1、TI官方提供的SDK(链接: MSP432P4 SDK)2.keil IDE使用的PACK包 (链接:TexasInstruments.MSP432P4xx_DFP.3.2.6)3.keil IDE(版本5以上就行)二、安装SDK,安装keil,导入PACK包安装就不用说了,不懂的网上搜一搜吧三、SDK说明SimpleLin原创 2021-01-24 18:35:35 · 2839 阅读 · 0 评论 -
STM32L431内部flash读写参考代码
分享一下STM32L431内部flash读写的代码(实测可行):/** 注意地址的选取尽量选在FLASH的末尾,放置被用户代码覆盖 *//** * 说明 : 往ST的FLASH写入指定长度的数据(由于是单页写入,写入的字节不能超过4K字节) * 参数 : addr, 写入的起始地址(保证双字对齐) * ptr, 数据存放地址(注意是uint64_t类型,即一次写入8字节) * ndword, 写入的Dword数(注意双字数) * 返回 : 成功返回.原创 2021-01-24 11:39:21 · 2075 阅读 · 0 评论 -
STM32Lx在低功耗下使用软件看门狗
看门狗对于防止程序跑死是很关键的,很多时候我们的产品需要进入低功耗,而且唤醒间隔也比较长,此时如果看门狗启动了,那么就会导致处在低功耗的MCU发生复位。解决这个问题的方法有两种:一种是增加看门狗的喂狗时间间隔,保证此间隔大于MCU唤醒间隔,这对于那种几个小时唤醒一次的应用,很多看门狗是不支持这么长的喂狗间隔的。第二种是MCU进入低功耗之后停止看门狗计时,唤醒之后重新开始。第二种方案就能很好的解决上述痛点,STM32系列很多单片机的看门狗就具备这个功能,拿STM32L476VET6这型号的单片机举例,此单原创 2020-12-08 14:05:22 · 1788 阅读 · 10 评论 -
两个让人崩溃的看门狗应用问题,怎么解决?
作为一个电子行业的从业人员,相信各位对看门狗的重要性已经非常清楚了,看门狗主要用于监控系统的可靠性,一旦发现系统的严重故障,设计者可以根据严重等级,轻则可以复位系统,重则可以重新断电重启。看门狗又分为硬件看门狗和软件看门狗,两者最主要的区别就是硬件看门狗一上电就运行,只要运行起来就停不下来;软件看门狗可以很容易通过寄存器配置启动和停止。无论是硬件还是软件看门狗,都需要软件在定时器结束前进行喂狗,否则看门狗就会复位输出。就是因为这个特性,大家都相信硬件的比软件的可靠,可靠性要求高的都会增加硬件...转载 2020-12-07 18:39:08 · 2042 阅读 · 2 评论 -
基于ST官方的Nucleo_L073RZ评估板低功耗测试(程序基于LL库)
手头有一块ST官方的Nucleo_L073RZ评估板,想看看这个L0系列进入停止模式功耗能做到多少,经过周末一天的写程序测试,从测试结果来看进入停止模式后功耗最低能降到1ua左右,还是不错的。后面在低功耗的基础上增加了串口打印,RTC定时唤醒功能,以及ADC采样功能(软件触发),都能使功耗稳定在2ua左右。 下面分享一下我的部分代码供需要调试低功耗应用的人一些参考,一些关键的地方在代码中强调出来了。要降功耗主要注意以下几点:1.GPIO的配置(不用的引脚配置为模拟输入,使用到...原创 2020-10-11 19:02:03 · 432 阅读 · 0 评论 -
MSP430FR6972的Comparator E比较器模块的使用
最近做一个拓扑识别模块用到了MSP430的比较器(Comparator E),这个比较器还是蛮好用的,支持多个参考,支持比较输出以及中断功能,还可以设置比较器输出高电平和输出低电平时的比较阈值(这功能真是太好用了,这样就能在我想要的波形位置触发中断,比如可以利用这功能在正弦波零点附近触发晶闸管的导通),以及内部自带一个电阻网络(比较器的比较阈值可以通过这个电阻网络设置成不同大小),还带有RC滤波输出功能。 我在调试过程中一开始对这个电阻网络一直没搞清楚怎么使用,后来不断调试...原创 2020-05-18 15:12:47 · 767 阅读 · 1 评论 -
STM32 DMA之存储器到存储器(LL库)
#include "main.h"/* DMA 存储器到存储器测试 */程序说明:每隔100ms执行一次DMA传输,每次传输1000个字,目标地址固定为Buff3,但源地址每隔100ms切换一次void DMA_STREAM1_Init(void);uint32_t Buff1[1000];uint32_t Buff2[1000];uint32_t Buff3[1000];...原创 2019-11-08 14:14:10 · 1657 阅读 · 0 评论 -
STM32H743,基于LL库实现adc双重采样(ADC+DMA+TIM)
直接上代码:/* * 双重采样要保证两个ADC的参数一致,双重采样的开始由主ADC控制,触发信号来自同一个触发源 * */#define USE_ADC_WORK_MODE 1 /* 0表示独立模式,1表示双重模式 *//* * 函数名称: Samp_TIM_Init * 函数说明: TIM4初始化,此定时器用于采样触发(采样率1M) * 输入参数: 无 ...原创 2019-11-06 14:43:22 · 3444 阅读 · 1 评论 -
STM32H743,基于LL库实现adc采样(ADC+DMA+TIM)
买了一块正点原子的阿波罗H743开发板,最近在调试ADC采样,由于CubeMx生成的是HAL库格式的代码,HAL库使用时太占用资源了不喜欢,个人比较喜欢LL库,这个库和STD库有点像。因此用LL库来实现ADC的采样,给大家分享一下我基于LL库写的adc采样程序,测试可用的。#define USE_DMA 1 /* 是否使用DMA *//* * 函数名称: Sa...原创 2019-11-05 13:40:00 · 8257 阅读 · 12 评论 -
STM32上电启动过程分析-了解上电复位做了什么事情
相关概念复习:PC:程序计数器,指示当前程序运行到哪了,指向的是代码区。SP:代表堆栈指针,指向当前堆栈栈顶。中断向量表:表中的每一项存放是中断服务程序的入口地址。STM32中断处理过程:当中断发生后,CPU自动从中断向量表中找到对应的中断服务函数的地址并跳转进去执行。相关汇编指令:EQU:表示宏定义的伪指令,不会占用空间,类似于C语言的#defineAREA:定义一个代码段或...原创 2019-10-25 19:23:20 · 1777 阅读 · 0 评论 -
STM32内部SRAM调试程序
在stm32f407内部SRAM调试程序调试过程目录硬件软件环境调试程序介绍RAM调试所需相关配置1、修改代码存放地址和数据存放地址2、更改向量表3、更改DEBUG配置4、取消更新flash程序运行目录你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。硬件本次调试使用...原创 2019-10-25 15:32:53 · 4999 阅读 · 3 评论