STM32
文章平均质量分 62
yummy说电子
我开通公众号了,yummy说电子,以后多数的创作会在公众号更新,写的会更加随意逗比一点,看看能不能靠流量挣个奶茶钱,欢迎关注,ღ( ´・ᴗ・` )比心
展开
-
STM32使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值
使用STM32的HAL库,配置多通道ADC,用DMA采集,算数平均值滤波,把GL5528光敏电阻得到的数据,转为光照度Lux,其中有Matlab计算公式与函数拟合,数据处理。原创 2021-04-29 18:03:10 · 29728 阅读 · 21 评论 -
HAL库教程9:串口接收不定长数据
串口收到的两组数据之间,往往会有一定的时间间隔。可以判断这个间隔,来实现无需结束符,无需指定长度,串口可接收不定长数据的功能。如果串口在一定的时间内没有收到新的数据,可以认为一组数据已经接收完毕了。思路是用定时器来设置一个“闹钟”,连续的一段时间没有收到新的数据,闹钟响起,就把已经收到的数据打包,做相应处理。定时器溢出时间配置 首先修改定时器的溢出时间。本文规定使用5ms的间隔。在某些通...原创 2019-04-16 09:18:28 · 13596 阅读 · 14 评论 -
HAL库教程10:定时器的PWM模式应用
本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐。本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴无源蜂鸣器驱动电路 蜂鸣器按照有无震荡源(不是电源),可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器上电就能工作,控制简单,但是只有一个音调。无源蜂鸣器需要单片机提供震荡源,虽然控制稍微复杂一点,但是可以发出不同频率的声音。PWM原理 根据我们的电路,引脚输...原创 2019-04-16 09:26:45 · 6753 阅读 · 2 评论 -
HAL库教程11:定时器的缓冲功能与影子寄存器
在STM32的定时器中,TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,或者说,修改过后立即生效的话可能会带来潜在问题,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。(中文手册P393) 实际上,STM32定时器中,CNT与ARR或CCR的比...原创 2019-04-16 09:37:25 · 2586 阅读 · 2 评论 -
HAL库教程12:ADC与DMA采集多路AD值
AD的基础知识 AD很复杂,其实也不复杂,因为我们用的不多。 AD:模拟量转换数字量(模拟信号转换数字信号)。 ADC:模拟量转数字量的转换器。 为什么需要AD呢? 自然界宏观的物理量都是连续的。而机器识别的信号0与1是离散的。为了让机器能够采集、分析、储存这些连续的量,所以要把需要被模拟的量转换为数字量。 主要的参数:采样精度与转换速度。 采样精度,也叫作分辨率。如果...原创 2019-04-16 09:42:42 · 23077 阅读 · 3 评论 -
HAL库教程13:AD+DMA采集数据的滤波
借助DMA可以快速采集大量数据,如果数据采集过来却不使用就是浪费。在我的板子上,AD值代表温度,如果系统检测到温度过高,可能会采取一些强制的保护措施。而AD采样是容易受干扰的,所以要对采样数据进行滤波,减少噪声对系统的干扰。接下来我们采用计算平均值的算法来滤波。 我们从每256个数据中,提取出1个算数平均值。2个通道,每个通道采集256个数据的话,共需要采集512个数据。由于DMA转换数据...原创 2019-04-16 10:00:19 · 6909 阅读 · 5 评论 -
HAL库教程14:查表法测量NTC热敏电阻
STM32F4的AD采样的结果是12位的,即采样的最大值为4096。而参考电压是3.3V,所以3.3V与4096是对应的。当然3.3V只是理想状态,实际上可能略有偏差。假设单片机的AD采集引脚电压为x,实际单片机的参考电压为z伏,读取到的AD值与x的对应关系如下: 再分析温度采集电路中,电压值与电阻值的关系。 两个等式联立,可以得出AD与电阻的关系: 程序中可以得到AD值以...原创 2019-04-16 10:04:08 · 9596 阅读 · 4 评论 -
HAL库教程1:STM32Cube的介绍
使用STM32HAL库已经有了一段时间,觉得相比于标准库,好用了不少。加上STM32CubeMX图形化配置工具的加持,个人认为可以极大提升开发效率。其实关于HAL库的教程已经很多了,关于STM32CubeMX的使用教程也很多,我并不比这些写教程的大牛厉害,只是记录一些个人的看法。还有,随着版本的变化,STM32CubeMX的界面变化也比较大,我基于5.0.1版本重新按步骤截图记录操作。另外,我...原创 2019-04-09 22:13:33 · 7674 阅读 · 4 评论 -
HAL库教程2:使用STM32CubeMX新建一个工程
安装STM32CubeMX 安装STM32CubeMX之前,电脑中要有java运行时环境(JRE),否则会报错: 双击JavaSetup8u201.exe即可安装JRE。在安装过程中,需要在线下载一些资源,所以应当保持网络连接。 然后双击SetupSTM32CubeMX-5.0.1.exe。 建议放在默认的文件夹下。 安装过程也比较简单,不再赘述。新建STM32Cube...原创 2019-04-09 22:24:31 · 4201 阅读 · 0 评论 -
HAL库教程3:引脚输入检测
使用CubeMX配置输入引脚 本章我们要把按键作为输入源,使用单片机来检测引脚的电平状态。首先要查看原理图,按键与那些引脚相连。 我使用的板子,按键K2 -K5分别对应PA4-PA7,且按键按下去以后,引脚接地。因此,我们要将单片机的PA4-PA7设置为上拉输入。 点击生成代码并打开工程,可以看到STM32CubeMX配置好的引脚输入初始化代码如下(已省略部分无关代码)://m...原创 2019-04-09 22:29:33 · 14375 阅读 · 0 评论 -
HAL库教程4:外部中断
外部中断机制 本章我们仍然是通过按键来控制LED,只不过实现方式由轮询变为了外部中断。为什么需要外部中断?为了给CPU减轻负担。 举个例子 比如你今天有个快递,快递一般放在前台或是门卫。你有两种方法,1、不停问前台,你的快递到了没有;2、等快递到了,让前台告诉你。 前者就是轮询,后者就是外部中断。 外部中断是由引脚检测到的中断。中断可以由上升沿、下降沿或双边沿触发。换句话说,中...原创 2019-04-09 22:36:11 · 26273 阅读 · 8 评论 -
HAL库教程5:串口数据发送
使用CubeMX配置串口1配置引脚 我的板子上使用插针引出了串口1,串口1连接PA8与PA9。配置串口通信参数 使能串口1,并配置为同步模式,波特率为115200,模式8N1。使能串口中断查看生成的代码 引脚与中断的初始化在stm32f4xx_hal_msp.c 而通信用到的参数,如波特率校验方式等初始化在main.c。 同样是串口初始化的代码,为什么要分开...原创 2019-04-09 22:46:26 · 57015 阅读 · 9 评论 -
HAL库教程6:串口数据接收
STM32的串口接收机制 与阻塞式发送函数HAL_UART_Transmit配套,有个阻塞式的接收函数,HAL_UART_Receive,但此函数不常用,串口接收通常使用中断函数HAL_UART_Receive_IT。HAL库的串口中断比较复杂,主要流程如下: USART1_IRQHandler:由硬件调用,不是HAL库函数,寄存器编程或固件库编程也需要调用此函数; HAL_UART...原创 2019-04-09 22:50:01 · 61319 阅读 · 19 评论 -
HAL库教程7:STM32的时钟系统
STM32的时钟系统比较复杂,不像51单片机,可能只有一个时钟。原因:1、外设多,不同的外设有不同的时钟要求;2、功耗原因,速度越快,功耗越大,抗电磁干扰能力越弱。 此处以STM32F405为例,讲一点最常用的知识。其它的型号大同小异。时钟含义特点HSE外部高速时钟信号一般选择外接晶振,最常用的时钟信号。电机驱动板外接12MhzHSI内部高速时钟信号由单片...原创 2019-04-09 22:51:58 · 5367 阅读 · 3 评论 -
HAL库教程8:通用定时器的使用
定时器溢出时间的计算 关于定时器溢出的时间计算,有个公式: 定时器本质上是一个不断自加的计数器,只不过在自加的时候,能够自动比较计数值跟某个设定值而已。定时器+1用时多少? 1/84000000,单位是秒。 我想让数的慢一点,感觉84Mhz的时钟太快了,想用42Mhz可以吗?可以,2分频就行,这是+1的操作用时:2/84000000, 数100个数字用时多少?100 * 2/...原创 2019-04-09 22:55:42 · 22563 阅读 · 3 评论 -
集成电机驱动方案(STM32+DRV8841)
以前的博客中介绍过一款分立元器件实现的H桥的博文,现在提供一个更简单的单芯片方案。驱动电路主要由一款DRV8841芯片组成,它是一个集成的电机驱动解决方案,内置两个功率NMOS H桥,可通过PWM驱动两个直流电机,或者一个步进电机。它还集成了电流感知、调节电路与保护装置,支持过热、过电流与欠压保护,并且自带最大3.75us的死区。电机电压支持8.2V到45V,最大电流为2.5A。主要的原理...原创 2019-05-26 11:59:53 · 14898 阅读 · 23 评论 -
在KEIL中如何查看寄存器的值与地址
正确连接硬件,编译程序后,按下工具栏的调试按钮进入调试模式。然后在View->System Viwer下,可以按照分类来查看某个寄存器的值。例如RCC相关的寄存器:GPIO相关的寄存器。寄存器的值是什么含义,需要结合芯片的数据手册来分析。例如AHBIENR寄存器的值是0x0010 0084,将此十六进制的数据按照二进制展开,在数据手册中找到相应的寄存器,按位对照,并借助说明即可理...原创 2019-04-08 22:46:35 · 32066 阅读 · 9 评论 -
STM32HAL库定时器中断关闭的方法
本文可以用于解决这个问题:定时器中断上电后莫名其妙开启,或者首先触发一次。STM32HAL库在定时器初始化并开启以后,也是会默认开启中断。如不需要默认就开启中断可以用一下代码关闭:__HAL_TIM_CLEAR_FLAG(&htim6,TIM_FLAG_UPDATE);其中htim6是定时器的句柄,按照实际使用的定时器填写;TIM_FLAG_UPDATE是中断的类型,也可以根据实...原创 2019-03-07 18:00:02 · 18137 阅读 · 5 评论 -
STM32自带GB2312字库显示汉字
本文介绍如何把字库文件写入单片机的flash中,然后无需再提取字模,即可实现单片机显示中文字符的功能。下载字库到单片机flash中的指定位置 在上一篇博客中,最后留了一个想法,让单片机自带字库。现在就来实现这个想法。我把用到的编译过的字符放在这里 我们借助J-Flash软件把bin文件放在单片机flash中的指定位置。 首先要新建工程,然后根据自己的板子选择型号 然后打...原创 2019-03-05 16:19:42 · 27382 阅读 · 6 评论 -
STM32在KEIL平台反汇编代码分析
不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编就够了。但要学习读汇编为什么学习汇编? 1 性能 直接翻译为机器语言,性能最高。优秀的C语言效率只能达到汇编的80%左右。其他高级语言跟汇编一比差得更远。语言越高级性能越差。很多bootloader和BIOS用汇编写,汇编操作的是电脑,手机刚原创 2018-01-14 10:31:23 · 23584 阅读 · 5 评论 -
STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)
本文介绍如何使用STM32F103单片机,通过官方固件库,设置高级定时器TIM1输出嵌入死区的互补PWM,来驱动直流电机的程序设计与电路设计。硬件电路采用IR2110S芯片作为mos管的驱动,驱动IRF840组成的H桥。IR2110S芯片使用中,有一个比较难理解的点——自举电容,本文对其原理也有涉及。 上图是系统的简化原理图,左侧是单片机。中间是IR2110S芯片,为了方便讲解,把芯片内部结...原创 2018-08-26 14:23:37 · 57088 阅读 · 26 评论 -
STM32寄存器的简介、地址查找,与直接操作寄存器
什么是寄存器提到单片机,就不得不提到寄存器。根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 简单来说,寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器可能存放的是指令、数据或地址。 存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个...原创 2019-01-11 11:15:15 · 57147 阅读 · 57 评论 -
STM32从地址到寄存器
本文希望在上一节的基础上,把指针操作过渡到寄存器的使用,来帮助读者深入理解寄存器。引入头文件主函数里出现了强制转换与指针的操作,程序不那么容易理解。我们把寄存器的地址进行宏定义,可以增强可读性。#define RCC_APB2ENR (*(unsigned int *)0x40021018)#define GPIOB_CRH (*(unsigned int *)0x40010c04)#d...原创 2019-01-11 11:44:32 · 4261 阅读 · 0 评论 -
从自定义的库函数到STM32官方标准库
在上一节的基础上,进一步改写代码,再引入官方标注库函数。虽然官方标准库慢慢式微,有一些别的库可能会取代它,但是并不妨碍我们继续拿官方库来写代码,吸取里边好的写法,强化下C语言技能,加深对寄存器的理解也是不错的。 本文模仿库函数,首先自定义库函数,然后一步一步改写代码,最终引入官方标准库函数。实现流水灯void delay(unsigned int a){ while(a--)...原创 2019-01-11 14:10:41 · 9267 阅读 · 0 评论 -
STM32掌机教程3,工程模板与带灯按键测试
我们需要“脚手架” 关于代码,我想体现出这么一个过程:我是如何一步一步修改代码的。我认为,从学习的角度来考虑,直接看最终的代码没有什么意义。 写代码就像工人盖房子,盖房子过程中,工人要搭建脚手架;房子盖好以后,脚手架要拆除。直接领着学生看盖好的房子,说,你就照着这个样子来盖房子,学生是做不出来。他不知道怎么搭建脚手架,甚至都不知道什么是脚手架。 所以我打算这个系列的讲义,每一篇代码都在上一篇的...原创 2019-01-17 11:37:24 · 760 阅读 · 1 评论 -
STM32掌机教程4,STM32驱动OLED屏幕
屏幕显示英文字符 有个屏幕,掌机的可玩性可以大大增强,打地鼠玩腻了,可以玩个贪吃蛇,俄罗斯方块,以及其他需要开动想象力的游戏。并且,以前总是玩别人的游戏,现在可以自己写游戏,岂不美哉。 后来我感觉0.96的OLED屏幕太小了,搞个更大的全彩屏,换成STM32F4系列单片机,跑个ucos,运行NES模拟器,然后我是不是就能拳打任天堂,脚踢PSP了?哈哈哈 打地鼠的游戏,可以显示生命值,...原创 2019-01-18 14:09:28 · 23877 阅读 · 5 评论 -
STM32掌机教程1:我打算做一个开源掌机
电子开发对我的影响爱好作为工作,既能养家,又开心,不用上班像上坟。动手实现自己的想法,成就感满满。思维方式的影响:把如何解决问题放在第一位。什么都能修,自带省钱属性 然而,我发现,很多学生畏惧电子开发,认为太难。如此有意思的一件事情,却被现行教育方式整的这么无聊。 有鉴于此,我打算做一个好玩的、简单的单片机项目,来让大家充分体验电子设计的乐趣。这个项目需要一点动手能力,...原创 2019-01-15 14:46:24 · 15082 阅读 · 1 评论 -
STM32掌机教程5,程序框架,随机,加命与升级
随机生成地鼠 随机数是游戏里边非常重要的组成部分,贪吃蛇随机刷新下一个食物,俄罗斯方块随机生成下一个方块,大富翁扔骰子,都是随机的。甚至微信群红包,金额也是随机的。正是因为这些事件不可预测,游戏才充满趣味性。我们地鼠的生成,当然也要随机。 然而,计算机产生的随机数,都是“伪随机”。伪,指的是说它是随机的,但是却都是有规律可循的。对于C语言,可以直接调用一个随机数生产函数srand()。但是...原创 2019-01-21 11:47:02 · 855 阅读 · 0 评论 -
STM32掌机教程2,掌机的原理
本文用到的资源PDF格式的原理图和集成库资源打地鼠的逻辑 打地鼠的逻辑很简单:我点亮某个LED,然后开始计时。如果在规定的时间内按下了LED对应的按键,那么加分,点亮下一个LED。按错按键,或者规定时间内没有按下,则减命,点亮下一个LED。 那么如何点亮某个LED?如何检测按键是否按下呢? 我选择了一款带LED的按键。大小是12mm乘12mm,用手指按大小正好,手感也不错,就是有一点...原创 2019-01-15 17:51:54 · 2466 阅读 · 0 评论 -
STM32掌机教程8,背景音乐
再用一个定时器 在上一节,我们使用了一个定时器来计算频率。需要某个音符持续一定的时间的话,仍然使用的是延时函数delay_ms,这会导致CPU阻塞,程序运行到这里,CPU只会去数数字,你按下按键,他也检测不到——忙着数数字呢。接下来把这个延时也改成定时器,让定时器像个闹钟一样工作,让CPU该干什么干什么,时间到了以后,让定时器来提醒CPU。换句话说,播放的是背景音乐。//改进此函数中的延时...原创 2019-02-14 17:05:35 · 1564 阅读 · 2 评论 -
STM32掌机教程9,完成掌机
这是教程的最后一篇了,完成之前的任务,到这里一切都应当水到渠成,没什么好讲的了。结尾可能略显仓储,未尽之处,自己看代码吧,看不懂的地方可以在下边评论。修改BGM 之前已经实现了根据不同的按键切换不同的BGM的功能。接下来把切换BGM的代码放到加命、减命、加分、升级的函数中。//main.c//加命并显示void add_life(void){ BGM = LIFE_BGM; ...原创 2019-02-14 17:08:06 · 2260 阅读 · 1 评论 -
STM32掌机教程6,电子琴
本节原来是想讲一讲无源蜂鸣器发声的原理,用于添加BGM功能。为了讲原理,就写了一些通俗的代码,没想到越写越多,后来,干脆就形成了一个小小的项目吧——基于STM32与无源蜂鸣器的电子琴。灯光效果 首先想到的是做一个灯光的效果,按下哪个按键,哪个按键的灯要亮;松手后,灯灭掉。顺带,检测一下带松手检测的按键功能好不好用。后续还可以做成通过亮灯提示需要按下那个按键,类似于节奏大师的功能——哪里要...原创 2019-02-13 10:31:49 · 6840 阅读 · 12 评论 -
STM32掌机教程7,演奏音乐
使用定时器来计算时间 在电子琴这节中,我们已经讲述了蜂鸣器的原理,知道如何用蜂鸣器演示不同音调的音乐,本节改进根据频率计算周期的方法,改为定时器,精确度更高,且不再阻塞CPU。 首先,我们不再把蜂鸣器的控制引脚PB1作为普通IO,而是作为定时器的通道。在IO的初始化中,不应当继续操作PB1。通过查看数据手册,可以知道,PB1可以作为定时器3的通道4。(当然也可以作为定时器1和定时器8的通道...原创 2019-02-14 11:07:01 · 3104 阅读 · 12 评论 -
STM32HAL库使用SPI驱动1.44寸TFTLCD
关于STM32F4单片机,使用HAL库自带的SPI,驱动TFTLCD屏幕的资料网上好像不太多,正好最近我做了这项工作,把成果分享给大家。我的代码实现了这些功能:任意坐标画点,指定首尾坐标画线,画方框,指定区域显示彩图,显示16* 16或者12* 12的汉字、ASCII码,并附带ASCII码表与少量的汉字字库。硬件设计 屏幕选择:使用了一款低成本十六位彩屏,只要十块钱。链接 厂家看到...原创 2019-03-01 11:38:44 · 20090 阅读 · 45 评论 -
解决STM32F103单片机PB4无法拉低的问题
最近使用STM32F103的单片机,PB4接了一个LED灯,低电平点亮,发现程序没有办法拉低PB4。 仔细查了一下数据收着,发现PB4默认是JTAG引脚,并置于上拉模式,所以没法直接当做普通的IO口拉低。可以复用为SWD下载方式,那么PB4就可以“省出来了” 以下是配置PB4做普通IO口的函数GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphC原创 2017-06-01 08:56:38 · 12455 阅读 · 0 评论