自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 STM32学习笔记【江科协】【9-1】USART串口协议

波特率本来的意思是每秒传输码元的个数,单位是码元/s,或者直接叫波特(Baud),还有个速率表示是比特率,意思是每秒传输的比特数,单位是 bit/s,或者加 bps,在二进制调制的情况下,一个码元就是一个 bit,此时波特率就等于比特率,单片机的串口通信,基本上都是二进制调制,也就是高电平代表 1,低电平代表 0,一位就是 1 bit。奇校验,最后一位补一个 0 或者 1,确保最后发送出的 1 的个数是奇数,偶校验同理,奇偶校验只能保证一定程度上的数据校验,要有更高的检出率,可以了解一下 CRC 校验。

2023-08-29 22:38:39 265

原创 STM32学习笔记【江科协】【8-2】DMA数据转运&DMA+AD多通道

第二步,调用 DMA_Init 初始化各个参数,如果使用的是硬件触发,还需在对应外设调用 XXXDMA_Cmd,开启一下触发信号的输出。如果需要 DMA 的中断,那就调用 DMA_ITConfig 开启中断输出,再在 NVIC 里开启相应的通道,再写对应的中断函数。寄存器外设所在的起始地址,然后再在外设寄存器的总表里查询地址偏移量,就可以得到某个寄存器的地址了,这个地址是固定的。还有存储器到外设的情况,比如串口发送一大批数据,就可以用 DMA 进行外设到存储器的转运,这个需要自己去研究了。

2023-08-29 11:49:39 208

原创 STM32学习笔记【江科协】【8-1】DMA直接存储器存取

主动单元这里,内核有 DCode 和系统总线,可以访问右边的存储器,其中 DCode 总线式专门访问 Flash 的,系统总线是访问其他东西的,由于要转运数据,所以DMA也必须要有访问的主动权,主动单元除了内核 CPU,剩下的就是 DMA 总线了,DMA1 和DMA2 有各自的通道,各个通道可以分别设置它们转运数据的源地址和目的地址,这样就可以各自独立地工作了。外设寄存器得看参考手册的描述,有些是只读的,有些是只写的,我们主要用的是数据寄存器,数据寄存器是可以正常读写的。写 5 就是转运 5 次。

2023-08-28 17:48:45 193

原创 STM32学习笔记【江科协】【7-2】AD单通道&AD多通道

最后得到的AD值有抖动,如果想用这个值比较进行某些参数,比如设置光线的强弱来开关灯,可以设置迟滞比较的形式来进行,设置两个阈值,低于下阈值时开灯,高于上阈值时关灯,和 GPIO 那一节施密特触发器是一个原理。第一步,开启RCC时钟,包括ADC和GPIO的时钟,还需配置ADCCLK分频器的时钟(库函数在RCC里,函数是RCC_ADCCLKConfig)还可以裁剪分辨率,去掉尾数。在这里不使用多通道连续转换,因为有数据覆盖的问题,也很难实现手动转运,通道之间转换完没有标志位,只有整个列表转换完才产生EOC。

2023-08-27 17:08:31 283

原创 STM32学习笔记【江科协】【7-1】ADC模数转换器

最后一个是电压转换的电路,根据分压公式,中间的电压就是VIN/50K*33K,最后的电压范围就是0~3.3V就可以进行ADC转换了,这里使用的电压范围应该在5到10V左右,高电压采集最好使用一些专用的采集芯片,比如隔离放大器等,做好高低电压隔离保证电路安全。因为AD转化时间很短,只有几us,所以有多路信号时,只需要一个AD转换器,然后加一个多路选择开关,想转换哪一路,就先拨一下开关,选中对应通道,然后开始转换,这个AD0809只有8个输入通道,STM32内部ADC有18个输入通道。

2023-08-26 11:08:48 334

原创 STM32学习笔记【江科协】【6-8】编码器接口测速

不确定外部模块输出状态或者外部模块输出功率比较小,选择浮空输入(优点是,没有上下拉电阻影响外部信号;缺点是,当引脚悬空时,没有默认电平了,输入就会受噪声干扰,来回不断的跳变)。如果是需要测量编码器的速度和方向,则需要固定一段时间取出CNT的值,然后再清零,也就是测频法的思路。第三步,配置时基单元,这里预分频器选择不分频,自动重装选最大65535,这里只需要CNT计数。第四步,配置输入捕获单元,只不过这里输入捕获单元,只有滤波器和极性两个参数有效。第一步,RCC开启时钟,开启GPIO和定时器的时钟。

2023-08-23 11:13:10 154

原创 STM32学习笔记【江科协】【6-7】TIM编码器接口

反相的含义,TI1TI2进来,都会经过极性选择的部分,输入捕获模式下,极性选择是选择上升沿有效还是下降沿有效,但对于编码器接口,上升沿和下降沿都需要计次,所以在编码器模式下,不是边沿的极性选择,而是高低电平的极性选择。比如这节的代码是通过定时器的编码器接口,来自动计次,之前的代码是通过触发外部中断,然后再中断函数里手动计次。之前使用的内部时钟CK_PSC和时基单元初始化设置的计数方向,并不会使用,此时计数时钟和计数方向都处于编码器接口托管的状态。所以想调整数据的加减方向,可以调整极性,把任意一个引脚反向;

2023-08-22 08:18:06 230 1

原创 STM32学习笔记【江科协】【6-6】输入捕获测频率&PWMI模式测占空比

要参考误差的要求,如果误差要求是千分之一,那么1M/1000=1KHz就是频率上限,误差要求是百分之一,那么1M/100=10KHz就是频率上限。所以可以测量的最低频率是1M/65535,大概是15Hz,频率再低,计数器值就要溢出了,所以可以测得的最低频率是15Hz。最大频率的上限是标准频率1MHz,但这时误差已经非常大了,这个上限没有参考意义,信号频率比标准频率还高,就测不了了。想要降低最低频率的限制,可以把这个预分频再加大一些,这样标准频率值更低,所支持的测得最低频率也更低。这里讨论一下测频率的性能。

2023-08-22 07:03:21 184 1

原创 STM32学习笔记【江科协】【6-5】TIM输入捕获

这里其实有两套输入滤波器和边沿检测器,第一套电路,经过滤波和极性选择,得到T1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路,第二套电路,经过另一个滤波和极性选择,得到T1FP2(TI1 Filter Polarity 2),输入给下面通道2的后续电路。测周法同理)(为了消除正负1的影响,要使N尽可能地大)(当有一个频率,测频法和测周法的N相同,说明误差相同,另两个方法N相等,把fx解出来,就是中界频率)(当大于中界频率,选用测频法,当小于中界频率,选用测周法)

2023-08-20 11:22:33 272 1

原创 STM32学习笔记【江科协】【6-4】PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机

用来配置强制输出模式,运行中强制暂停输出高电平或者低电平可用,但用得不多,因为强制输出高电平和占空比100%是一样的,强制输出低电平和占空比0%是一样的。第三步,配置输出比较单元,包括CCR的值、输出比较模式、极性选择、输出使能这些参数,库函数里也是统一用结构体来配置的。*单独设置输出比较功能极性的,带N的就是高级定时器输出互补通道的配置,这里设置极性和在结构体设置作用是一样的。第四步,配置GPIO,把PWM对应的GPIO口,初始化复用推挽输出的配置。第五步,运行控制,启动计数器,这样才能输出PWM。

2023-08-13 18:21:47 240 2

原创 STM32学习笔记【江科协】【6-3】TIM输出比较

匹配时电平翻转,这个可以方便输出一个频率可调,占空比始终为50%的PWM波形,如设置CCR为0,那CNT每次更新清0时,就会产生一次CNT=CCR的事件,这就导致输出电平每翻转一次,每更新两次,输出为一个周期,输出波形的频率=更新频率/2。PWMA引脚要接PWM信号输出端,其它两个引脚可以任意接两个普通的GPIO口,这三个引脚给出一个低功率的控制信号,驱动电路就会从VM汲取电流,来输出电机,这样就可以完成低功率的控制信号控制大功率设备的目的了。一旦切换到这个模式,输出就暂停了。

2023-08-13 11:47:48 271 1

原创 STM32学习笔记【江科协】【6-2】定时器定时中断&定时器外部时钟

配置时基单元的三个参数Period是ARR的值,Prescaler是PSC的值,RepetitionCounter是重复计数器的值(高级计时器才有)因为预分频器的缓存寄存器,写入的值只有在更新事件时才会起作用,为了让值立刻起作用,在这里手动生成一个更新事件。副作用是,更新事件和更新中断同时发生,更新中断会置标志位,一旦初始化完,更新中断立刻进入。第六步,运行控制,整个模块配置好后,还需使能一下计数器,否则计数器是不会运行的。第二步,选择时基单元的时钟源,对于定时中断,我们就选择内部时钟模式。

2023-08-13 09:38:33 249 1

原创 STM32学习笔记【江科协】【6-1】TIM定时功能

第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,ETR(External)引脚的位置,可以参考一下引脚定义表,在这个TIM2的ETR引脚,也就是PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频电路,再配置一下输入滤波电路,这些电路可以对外部时钟进行一定的整形,因为是外部引脚的时钟,所以难免会有些毛刺,那这些电路就可以对输入的波形进行滤波,同时可以选择一下极性和预分频器,最后,滤波后的信号,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟。

2023-08-12 14:43:55 394 1

原创 STM32学习笔记【江科协】【5-2】对射式红外传感器计次&旋转编码器计次

本质上都是对状态寄存器的读写,只是下面两个只能读写与中断有关的标志位,并且对中断是否允许做出了判断,而上面的两个函数只是一般读写标志位能不能触发中断的标志位都能读取到。当我们的挡光片或者编码盘在这个对射式红外传感器中间经过时,这个DO就会输出电平变化的信号,然后这个电平跳变的信号触发STM32PB14号口的中断,我们在中断函数里执行变量++的程序,然后主循环里调用OLED显示这个变量,这样第一个程序就完成了。*引脚重映射,第一个是选择要重映射的方式,第二个是新的状态,但目前还未学到需要重映射引脚的外设。

2023-08-12 09:23:31 517 1

原创 STM32学习笔记【江科协】【5-1】EXTI外部中断

对于STM32来说,想要获取的信号是外部驱动的很快的突发信号,比如旋转编码器的输出信号,我可能很久都不会拧它,这时不需要STM32做任何事,但是一拧它,就会有很多脉冲波形需要STM32接收,这个信号是突发的,STM32也不知道什么时候会来,同时它是外部驱动的,STM32只能被动读取,而且这个信号非常快,STM32稍微晚来一点来读取,就会错过很多波形,对于这个情况来说,就可以考虑使用STM32的外部中断了,有脉冲过来,STM32立即进入中断函数处理,没有脉冲时,STM32就专心做其他事情。

2023-08-10 12:30:53 371 1

原创 STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

2023-07-28 16:30:13 827 1

原创 STM32学习笔记【江科协】【4-1】OLED调试工具

宽视角,因为OLED屏幕上自发光的,所以在任何角度看,显示内容都是清晰的,对比LCD:比如电脑屏幕,从下或者上斜看屏幕,那么屏幕会变黑,很难看清上面的内容,手机屏幕作为OLED屏幕基本各个视角都可以看清屏幕,这就是可视视角的差别。2.通常串口助手只能以信息流的方式呈现数据,就是一行一行的打印,如果有很多不断变化的数据需要显示,那就只能在电脑上刷屏显示,这样用起来就不太方便。功耗低:OLED每一个像素都是一个单独的发光二极管,每一个像素都是可以自发光的,不同LCD那样需要有背光,所以OLED屏幕会比较省点。

2023-07-27 17:23:40 221 2

原创 STM32学习笔记【江科协】【3-4】按键控制LED&光敏传感器控制蜂鸣器

我们需要完成LED和按键的驱动代码,但把两个混在主函数里,就会太乱,也不好移植,所以选择将驱动代码封装起来,单独放在.c和.h文件里,这就是模块化编程的方式。,在LED里加上这段函数,调用它LED的状态取反。同样记得,在.h文件里声明,在main.c文件里加上头文件#include "Key.h"*用来读取数据输出寄存器某一个端口的输入值,这个函数一般用于输出模式下,用来看自己输出什么。这段我的理解是,如果按下原来是关就给开,原来是开就给关。LED的定亮和熄灭的代码,记得去.h文件里面声明。

2023-07-27 14:44:53 672 1

原创 STM32学习笔记【江科协】【3-3】GPIO输入

对不同传感器来说,N1对应不同,热敏传感器来说N1对应热敏电阻,对红外传感器来说N1就是红外接收管(当然会对应多一个点亮红外发射管电路)注意事项:51单片机中,int占16位,STM32中,int占32位,如果要用16位的数据,需要用short来表示。按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动。总结:上接,按键按下为低电平,松手为高电平;上接的方式(一般采用这个)(和LED接法类似,是电路设计的习惯和规范)按键:常见的输入设备,按下导通,松手断开。

2023-07-27 10:00:21 209 1

原创 STM32学习笔记【江科协】【3-2】LED闪烁&LED流水灯&蜂鸣器

把端口模式换为GPIO_Mode_Out_OD,开漏输出模式,LED不亮了,现在LED还是高电平点亮方式,LED不亮,说明开漏输出没有高电平驱动能力,再调换LED正负极,可以看到LED正常闪烁,说明开漏模式下低电平是有驱动能力的。*用结构体的参数来初始化GPIO端口,需定义一个结构体变量,然后再给GPIO赋值,最后再调用这个函数,这个函数就会自动读取结构体的值,自动把外设各个参数配好。第三个GPIO_Initstructure.GPIO_Speed是一样的套路,选择GPIO_Speed_50MHz。

2023-07-23 13:46:40 838 1

原创 STM32学习笔记【江科协】【3-1】GPIO输出

模式下,这个P-MOS是无效的,只有M-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;通过设置这个位设置和位清除寄存器,如果要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这就保证了只操作其中某一位而不影响其它位,并且这是一步到位的操作,如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了。*数据0,就是0V低电平;

2023-07-22 16:19:38 1949 2

原创 STM32学习笔记【江科协】【2-2】新建工程

是PC13口的LED,所以第一个参数就写GPIOC,第二个参数是一个GPIO_InitTypeDef的结构体,首先需定义一个结构体,先把结构体的类型写上GPIO_InitTypeDef,这个名字可以随便起,但根据官方推荐最好叫作GPIO_InitStructure,然后把结构体的每个参数写上,复制粘贴结构体的名字,然后用点 . 来引出结构体的参数,先把参数罗列出来,可以看到结构体有三个参数,分别是GPIO模式、GPIO端口、GPIO速度。这句便可将PC13号端口设置为低电平。

2023-07-21 10:57:37 422 3

原创 STM32学习笔记【江科协】【1-2】STM32简介

STM32基本情况、ARM内核、参数、外设、命名规则、系统结构、引脚定义、启动配置、最小系统

2023-07-14 19:24:46 1304 1

原创 STM32学习笔记【江科协】【1-1】课程简介

劣势:程序现象不出来可能是程序或接线的问题-------->>优势:可以任意电路线路的连接,接线和修改方便。keil5 MDK:给ARM系列的单片机编程。调试:调试程序时,程序的变量会显示在屏幕上。keil5 C51:给51系列的单片机编程。

2023-07-13 08:39:23 307 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除