基于-B站-江科大自化协-STM32基础入门教程-学习笔记

一些话:本文是根据江科大UP的教程写的,所以以下内容都是基于M3架构的单片机(F103C8T6)写的,虽然说M系列都是ARM架构,基本通用,不过有些东西还是不太一样的。如果文章有什么错误,也希望有大佬可以指正。因为本意是记录一下学习的过程心得,所以有很多碎碎念。然后就是文章很多都还没写完,最近在忙,后续有机会会不断补全,然后也在学习新的东西,如果有人看的话,估计也会分享一下。最后感谢大家阅读,就算没有人也很感谢。

※ 晶振

1、晶振的基本原理

        晶振 (Crystal Oscillator) 又称为石英晶体振荡器, 是一种利用石英晶体的压电效应产生稳定频率信号的电子器件. 石英晶体在收到外加电压时会产生形变, 而在受到外力作用时会产生电荷. 这种特征使得晶振能够在电路中起到稳定振荡的作用。


2、晶振的性能参数

        了解晶振的性能参数有助于我们在实际应用中选择合适的晶振产品, 以下是一些主要的性能参数:
        频率: 晶振产生的振荡频率, 单位为赫兹 (Hz). 频率是晶振的核心参数, 直接影响电子设备的运行速度
        频率稳定度: 晶振输出频率随环境温度, 工作电压和老化等因素变化的程度. 搞稳定度的晶振在复杂环境下可以保持更好的性能
        驱动电平: 晶振在正常工作状态下所需要的最小输入电压. 选择合适的驱动电平可以降低电路的功耗, 提高设备的运行效率
        负载电容: 与晶振相连的外部电容, 影响晶振的工作状态. 根据电路需求选择合适的负载电容, 可提高晶振的稳定性和可靠性


3、晶振的分类:

        根据频率不同, 晶振可以分为以下三类:
        (1)低频晶振 (32.768 kHz): 主要应用于实时时钟, 手表等设备
        (2)中频晶振 (1-10 MHz): 用于通信设备, 网络设备等
        (3)高频晶振 (10-200 MHz): 广泛应用于高速数字电路, 微处理器等
        (STM32中8MHz晶振属于高频晶振(好像))


4、晶振的应用

        晶振在电子设备中有广泛的应用:
        (1)时钟源: 晶振在实时时钟, 手表, 计时器等设备中提供稳定的时钟信号
        (2)微处理器和微控制器: 晶振为处理器提供稳定的时钟信号, 保证处理器高效稳定运行
        (3)通信设备: 晶振在通信这边中作为参考频率源, 保证设备之间同步传输数据
        (4)网络设备: 晶振在路由器, 交换机等设备中提供稳定的时钟信号, 保证数据传输的稳定性


5、STM32晶振

        SYSCLK是系统时钟,为芯片内部各大模块的运转提供动力,不可缺少。高速晶振 8MHz 作为系统时钟的来源,可以由芯片内部的 HSI RC 时钟源或芯片外部的独立时钟源提供。由于芯片内部的 HSI RC 时钟源不够精准,我们通常采用外部独立时钟源来来为芯片提供系统时钟。(这段话有待理解,可结合下方时钟部分一起理解)

※ 时钟

1、STM32的时钟源:

①HSI是高速内部时钟,RC振荡器,频率为8MHz。  
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
(时钟部分概述基于STM32-M3架构的单片机,M4、M7还有其他内核的单片机参数都不尽相同,请查阅对应公司官网的对应微控制器数据手册)


2、系统时钟SYSCLK:

在配置STM32的系统时钟时,可以选择将HSI、HSE或PLL的输出作为系统时钟源。
        通常,为了获得更高的系统性能和稳定性,会选择使用HSE作为PLL的输入,并通过PLL倍频来生成系统时钟。
        然而,在某些情况下,如果外部时钟源不可用或出于低功耗的考虑,也可以选择使用HSI作为系统时钟源。
    
SYSCLK系统时钟最大频率为72MHz;
其中FCLK,HCLK,PCLK都称为系统时钟,但区别如下:
    (1)FCLK,提供给CPU内核的时钟信号,CPU的主频就是指这个信号;
    (2)HCLK,提供给高速总线AHB的时钟信号;
    (3)PCLK,提供给低速总线APB的时钟信号;
    
        HCLK:AHB总线时钟,由系统时钟SYSCLK分频得到,一般不分频,所以等于系统时钟。而经过总线桥AHB–APB,通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟,不过PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。PCLK2对应APB2外设。PCLK1对应APB1外设。
        连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。
        连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA-PE)、第二功能IO口。
    
    
    
    提问:RCC内部时钟和RTC(实时时钟)有什么区别?
    
    答:RCC内部时钟和RTC(实时时钟)在STM32等微控制器中扮演着不同的角色,它们之间存在几个关键的区别:
    
    一、定义与功能
    
    RCC内部时钟:
        RCC(Reset and Clock Control)是STM32等微控制器的时钟与复位控制单元。
        RCC内部时钟通常指的是由微控制器内部集成的RC振荡器产生的时钟信号。这些内部时钟源包括高速内部时钟(HSI)和低速内部时钟(LSI)。
        HSI通常用于系统时钟的备选源,而LSI则常用于RTC(实时时钟)的时钟源。
        RCC的主要功能是管理系统时钟、外设时钟的生成与分配,以及复位控制等。
        
    RTC(实时时钟):
        RTC(Real-Time Clock)是一种用于提供精确时间信息的电子设备。
        RTC的主要功能是保持时间的准确性,即使在系统断电或重新启动后,也能继续提供正确的时间。
        RTC通常包含一个独立的时钟源(如LSI或外部32.768kHz晶振),一个计数器,以及用于存储时间信息的寄存器。
        RTC还具备闹钟功能和定时器功能,可以用于定时唤醒系统或执行定时任务。
        
    二、时钟源与精度
    
    RCC内部时钟:
        HSI和LSI作为内部时钟源,其精度和稳定性相对较低。HSI的频率通常较高(如8MHz),但可能受到温度、电压等因素的影响而产生漂移。LSI的频率较低(如40kHz),主要用于低功耗场景。
        
    RTC时钟源:
        RTC通常使用更为精确的时钟源,如32.768kHz的外部晶振。这种晶振具有高精度和稳定性,能够确保RTC在长时间内保持时间的准确性。

一、GPIO

        每个GPIO外设模块都包含寄存器和驱动器,寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,完成输出和读取电平的功能。输出寄存器对应着16个引脚,输出寄存器写1就输出高电平,写0就输出低电平,反之输入寄存器同理读取对应高低电平,STM32单片机是三十二位的,其寄存器也是三十二位的,而每个GPIO外设有0-15编号共16个引脚,即十六位,因此寄存器的低十六位对应GPIO的端口、16个引脚,高十六位是没有用到的。

GPIO输入:

1.    I/O引脚电路中,上拉和下拉都是默认输入模式,如果输入电路既不接入上拉电阻VDD也不接入下拉电阻VSS,那么此时此刻这个电路的输入模式就是浮空输入。
2.    上拉电阻给电路提供了一个默认的高电平,下拉电阻则提供默认低电平。当引脚悬空时,即引脚没有输入时,连接上拉电阻可以保证输入一个高电平,下拉同理。
3.    浮空输入模式下电流就像漂浮在太空中的物体,极不稳定,受到外力就会被影响。

GPIO输出:

        I/O端口中,输出控制连接着MOS管,相当于一种电子开关,上面连接着P-MOS,下面连接着N-MOS,我们的信号来控制开关的导通和关闭,我们可以选择三种输出模式:推挽、开漏、关闭。
1.    推挽:该模式下,P/N-MOS均有效,数据寄存器输出1时,上管导通,下管断开,输出接到VDD,输出高电平,数据寄存器输出0时,输出接到VSS,输出低电平。这种模式下高低电平均具有较强的驱动能力。
2.    开漏:该模式下,P-MOS是无效的。数据寄存器输出1时,上管无效,下管断开,输出相当于断开,也就是和高阻模式,数据寄存器输出0时,输出接到VSS,输出低电平。这种模式下低电平才具有驱动能力,高电平是没有的,那么这个模式的作用是作为通讯协议的驱动方式,例如I2C通讯的引脚就是使用开漏模式的。
        除此之外,开漏模式还可以用于输出5V的高电平。首先I/O口接入一个上拉电阻至5V的电源,当数据寄存器输出高电平时,I/O口就可以输出5V的电平信号。
3.    关闭:当引脚为输入模式时,两个MOS管均关闭,端口的电平由外部信号来控制。


补充:

串口、端口、引脚的关系

串口:串行通信接口

端口:设备与外界通信交流的出口

引脚:芯片引脚是指从集成电路(芯片)内部电路引出与外围电路的接线,构成芯片的接口。引脚的功能多样,可以分为以下几类:

(1)电源引脚:提供芯片所需电源电压,如VCC、VDD等。
(2)地线引脚:用于芯片电路的参考点,连接到电源管理芯片的接地位置,如GND、VSS等。
(3)输入引脚:接收来自外部电路的信号输入,如RX、Tx等。
(4)输出引脚:将芯片内部处理后的信号输出到外部电路,如LED驱动引脚等。
(5)控制引脚:用于控制芯片的操作,如EN、RST等。
(6)状态反馈引脚:提供芯片状态的反馈信息,如PWRGD、RDY等。
(7)其他特殊功能引脚:如I/O端口、复位引脚、监控引脚等。

举个栗子:电脑上的RS232、RS485接口就是串口,是一个物理窗口,是实际存在的。在32上烧录程序时,需要在PC上查看是否能检测到端口(COM),这个端口是否存在取决于你是否接线,所以说端口是串口的一个标识,是一个逻辑窗口。而由多个引脚可以组成一个串口,比如GND\VCC\RXD\TXD组成RS232串口。


施密特触发器

        整形后的数据是数字信号,整形前是模拟量。

        波形会有抖动,而施密特触发器有两个整形阈值,假如波形高于了上方的阈值,那么即为高位,如果接下来波形低于了上方的阈值,但是没有低于下方的阈值,那么此时波形还是为高位,如若波形低于了下方的阈值,那么此时波形变为低位,余下同理。(个人理解)

        跟工程师交流了一下,好像施密特触发器有不同的种类,我不也不太清楚,有大佬知道的可以告知一下,谢谢。

整形原理如下图:(待补充)


片内外设和片外外设的区别

        片内外设就是片上外设,同一种意思不同说法而已。片内、外设是两个概念,片内指做成芯片的集成电路内部,简称片内,片外同理显而易见;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。 
        由于大规模集成电路的技术发展得很快,现在许多芯片在制造时已经能够将部分接口电路和总线集成到芯片内部。对于这部分电路与传统的接口电路和总线是有区别的,为了加于区别可以称之为片内外设,其含义是在集成电路芯片内部集成的用于与外部设备连接的独立于内核的控制器、接口电路和总线等。
        总结:片上外设就是芯片上,内核外的设备。


复用功能

        STM32Fxx系列单片机的GPIO引脚可以配置为浮空输入(Input Floating)、上拉输入(Input Pull-up)、下拉输入(Input Pull-down)、模拟量(Analog)、开漏输出(Output Open-drain)、推挽输出(Output Push-pull)、复用开漏(Alternate function open-drain)输出和复用推挽(Alternate function push-pull)输出等八种模式。

        先来介绍下开漏输出和推挽输出的区别:STM32Fxx系列单片机的输出电路有两个MOS管:P-MOS和N-MOS。在开漏输出模式下,P-MOS管不工作,只有N-MOS管起作用。若输出数据寄存器的值为0,则N-MOS导通,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止;由于P-MOS不工作,此时IO口既不是高电平,也不是低电平,这种状态被称为高阻态。在推挽输出模式下,若输出数据寄存器的值为0,则N-MOS导通,P-MOS截止,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止,P-MOS导通,IO口输出高电平;我们知道STM32Fxx单片机还有复用开漏输出和复用推挽输出,它们和上面讲到的(普通)开漏输出和(普通)推挽输出有什么区别呢?这就涉及到针脚的复用功能。

        我们知道,STM32Fxx内部集成了很多的外设控制器,比如USART、SPI、bxCAN等等,这些外设控制器,也需要通过引脚与外设连接。复用功能是相对于单片机的引脚而言的。所谓“复用功能”,是指单片机的引脚既可以做普通GPIO使用,也可以作为内部外设控制器的引脚来使用。

        比如我们来看看STM32F103xx单片机的PA5引脚,如下图:

        首先,PA5可以做为普通GPIO来使用;其次,如果作为外设的引脚,它可以作为SPI1的时钟(SPI1_SCK)、DAC的输出通道1(DAC_OUT1)或者ADC的输入通道5(ADC12_IN5)。PA5支持的三种外设(SPI1、DAC、ADC)在同一时刻只能选择一种,选择的方法是开启相应外设的时钟,并使其它外设的时钟保持关闭状态。如果PA5被配置为复用功能,但是没有开启它支持的任何外设的时钟,它的输出是不确定的。

        复用推挽输出和(普通)推挽输出在输出的时候均使用两个MOS管(P-MOS和-MOS),其输出电路是相同的。区别在于控制输出的信号来源:(普通)推挽输出控制MOS管的信号来自输出数据寄存器,而复用推挽输出的控制信号来自单片机的内置外设控制器(比如SPI1)。复用开漏输出和(普通)开漏输出的道理是一样的。

        下面这张图,是普通GPIO输出的引脚配置图,可以看到其输出信号来自输出数据寄存器(Output data register):

        下面这张图,是选择复用功能后的引脚配置图,可以看到其输出信号来自芯片内置的外设控制器:

        虽然复用模式的控制信号来自内置外设控制器,但是单片机(CPU)依然可以读取相应的数据。在复用推挽输出模式下,单片机可以通过读取输出数据寄存器(Output Data Register)的数据来获取上次输出的值;在复用开漏输出的模式下,单片机可以通过读取输入数据寄存器(Input Data Register)的值来获取引脚的状态。


上位机

        上位机是指可以直接发出操控命令的计算机,一般是PC,通常用来在屏幕上显示各种信号变化(液压,水位,温度等),并将数据存储下来,供查询分析。下位机是直接控制设备、获取设备状况的计算机,一般是单片机/PLC(Programmable Logic Controller)。


本专题中MCU的意思(两个版本的解释)

        MCU,中文简称单片机。即将CPU、存储器(RAM和ROM)、多种I/O接口等集成在一片芯片上,所形成的芯片级计算机。
        MCU,又称单片微型计算机或者单片机,是把中央处理器的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机。

        除了叫MCU,也有叫FCM的叫法(没记错的话)。

二、中断(待补充)

中断的含义(自己总结理解的):

        当中断源触发中断,此时程序自动调用对应中断的中断函数,打断此时执行的主函数,跳到中断函数中执行中断函数,当执行完了之后,再回到主函数继续执行主函数。
        STM32有68个可屏蔽中断信号(中断源),对于具体型号数量有出入,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。STM32使用NVIC(内核外设)统一管理中断,可设置抢占优先级响应优先级。响应优先级的意思可以这样理解,此时,CPU正在执行一个中断,后面还有顺序排列的多个中断,比如说排第三的中断它的响应优先级最高,那么当CPU执行完了前面正在执行的中断之后,这个排第三的中断就可以直接执行,无需等待。抢占优先级那么也很好理解了,就是相当于中断嵌套,就算此时CPU正在执行某个中断,但是这个抢占优先级最高的中断来了,正在执行的中断也得靠边站,让这个抢占优先级高的中断先执行。如果抢占优先级和响应优先级均相同时,就按照中断号(查询手册中断向量表)来排队。


例子:

        1、窗口看门狗
        假如我们的程序卡死了,没有及时喂狗,那么窗口看门狗就会申请中断,让我们的程序跳到中断程序里,然后我们就可以在中断程序里进行错误检查,查看检查出了什么问题。
        2、EXTI
        EXTI可检测GPIO的电平变化,如果指定的GPIO口的电平发生跳变,那么EXTI就会申请中断。

三、TIM定时器

基本概述:

        定时器是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7),当然,不同型号的32板子之间拥有定时器是不一定是一样的,具体要查看对应的说明书。
        STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能。


基本定时器的功能和特点:

    (1)位于低速的APB1总线上
    (2)拥有定时中断、主从模式触发DAC的功能


通用定时器的功能和特点:

    (1)位于低速的APB1总线上
    (2)拥有基本定时器的全部功能
    (3)并额外拥有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能


通用定时器功能特点详细信息(搜集来的):

    (1)16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
    (2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
    (3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
                ① 输入捕获 
                ② 输出比较
                ③ PWM 生成(边缘或中间对齐模式) 
                ④ 单脉冲模式输出 
    (4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
    (5)如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 
                ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
                ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
                ③输入捕获 
                ④输出比较 
                ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 
                ⑥触发输入作为外部时钟或者按周期的电流管理


高级定时器的功能和特点:

    (1)位于高速的APB2总线上
    (2)拥有通用定时器的全部功能
    (3)额外拥有重复计数器、死区生成、互补输出、刹车输入等功能(这些功能主要是为了三相无刷电机驱动设计的)


TIM定时中断 

基本结构:

    (1)打开RCC内部时钟:当打开RCC时钟后,定时器的基准时钟和整个外设的工作时钟都会同时打开
    (2)选择时基单元时钟源:对应定时中断,我们选择内部时钟源
    (3)配置时基单元:使用一个结构体
        预分频器(PSC)    :对计数器预分频,使得计数更灵活        (16位的定时器的预分频器的最大值为2的16次方,可写入的最大值为65535,最大分频系数为65536(65535+1))
        自动重装器(ARR):参数对应计数的目标值,就是我想要计多少个数后申请中断        (16位的定时器的自动重装器的最大值为65535)
        CNT计数器(CNT):执行计数定时的寄存器,每来一个计数时钟(由分频器分频后的时钟),计数器值加一(可参考下方主频72MHz计72个数的部分)        (16位的定时器的计数器的最大值65535) 

        预分频器的分频系数与实际分频系数相差1,即预分频器值为1,主频72MHz要除以2,预分频器值为2,主频72MHz要除以3。
        预分频器和自动重装器的关系是:72MHz的主频除以预分频器的值再除以自动重装器的值得到的就是中断频率,这个频率取倒数就是我们想要的定时的时间。
        计数器与自动重装器的关系是:通过分频器的计数时钟给到计数器后开始计数,当计数器的值与自动重装器的值相等时,产生中断信号(在32的原理图上会标有一个UI的向上的箭头,这代表产生一个更新中断,同时还有一个向下的箭头标为U,代表一个更新事件,更新事件不会触发中断,但会触发内部电路的其他工作),计数器值清零(关于这部分来说,32可以直接让值相等时产生中断,而51好像是当计数值溢出,即65535+1=65536时,才产生中断)
        由上述的关系我们也可以得出16位的STM32定时器的最大定时时间为59.65s,如若我们还需要更大的定时时间,STM32定时器还支持级联,即一个定时器输出当作另一个定时器的输入,这样最大的定时时间就为59.65s乘上两次65536,大概为八千多年。

    (4)配置输出中断控制:允许更新中断输出到NVIC
    (5)配置NVIC:在NVIC中打开定时器中断的通道,分配优先级
    (6)运行控制:整个模块配置完成后我们还需要使能一下定时器,否则计数器是不会工作的。当定时器使能后,计数器就会开始工作计数,当计数器更新时,触发中断
    (7)最后,我们写一个定时器的中断函数,这样这个中断函数每隔一段时间就会自动执行一次


知识补充一:

        1GHz=1000MHz,1MHz=1000kHz,1kHz=1000Hz
        1s=1000ms,1 ms=1000μs,1μs=1000ns
        s(秒)、ms(毫秒)、μs(微秒)、ns(纳秒)

        时钟周期与时钟频率互为倒数, 我们可以找出以下关系:
        时钟频率    时钟周期
        1Hz            1s
        1KHz         1ms
        1MHz         1μs
        1GHz         1ns

        知道这些,我们就能很快换算周期与频率.
        比方10KHz, 那么就是1/10 = 0.1ms, 即100μs.
        比方100ns, 那么就是1/100 = 0.01GHz, 即10MHz.

        主频72MHz计72个数,那就是在一微秒的时间内计数72,如果计数72000,那周期就是1KHz,即一毫秒的时间内计数72000,如果是计数72000000,那周期就是一秒,即一秒的时间内计数72000000。


知识补充二:

TIM输出比较

        PWM:在数字系统等效输出模拟量,可以实现LED控制亮度,电机控速等功能
        PWM参数:
        (1)频率:1/Ts(Ts是一个高低电平变化的周期)
        (2)占空比:占空比是高电平占整个周期的比例,占空比是时线性,所以他的高电平如果5V,低电平是0V,如果此时占空比是50%,那么就是2.5V,如果是20%,那么就是1V。
        (3)分辨率:即占空比变化步距,也可以理解为占空比变化的精细程度,如果一个波形是以1%、3%这样的占空比变化的话,那么其分辨率就是1%,即以1%的步距跳变,如果是以1.3%、6.1%这样的占空比变化的话,那么分辨率就是0.1%

TIM输入捕获


主从模式触发功能

触发信号
        概念:可以理解为某器件在接收到某个信号后,此信号可以触发本器件的一些功能。
        在STM32中触发信号分为两大类:TRGI 和 TRGO,即触发输入信号和触发输出信号。
        TRGO:定时器输出给其它定时器或外设的信号。可以理解为主模式触发信号。
        TRGI : 可以理解为从外部引入到定时器中的信号。可以理解为从模式触发信号。 

触发输入信号
        第⼀类:TI1F_ED/TI1FP1/TI2FP2,来自输⼊通道1或通道2的触发信号,连接到从模式控制器,从而控制计数器的工作。
        第⼆类:来自外部触发脚[ETR]的信号经过处理后,连接到从模式控制器。
        第三类:来自其他定时器的触发信号,通过内部线路连接到从模式控制器

触发输出信号

        

编码器接口
 

四、ADC(模拟-数字转换器)

        官方解释:ADC可以将引脚上连续变换的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路之间的桥梁。

        非官方解释(自己总结):GPIO口正常就只能读取高低电平,即0-3.3V,但是通过ADC(相当于是一个电压表),就可以将这个电平量化成这个区间内的电压数值。

        ADC将读取到的模拟电压,转化为一个数据,存储到寄存器内,我们就可以将数据读取到变量里去。
                输入电压范围:0-3.3V
                转换范围:0-4095
        输入电压范围和转换范围线性对应。

        ADC转换有一个通道,最多容纳18个输入通道(待转换电压),可测量16个外部源和2个内部信号源(具体型号的外部引脚模拟信号数量不同)。ADC拥有规则组和注入组两个转换单元。


逐次逼近型ADC:

        DAC实现原理:通过逐次逼近SAR寄存器调节DAC电压,并将外部电压与DAC连接到比较器上,当外部电压输入到比较器时,DAC也输入电压数据到比较器和外部电压比较,当DAC较小,就调大DAC电压,反之亦然,当DAC电压与外部电压相同时,就通过DAC得到了外部电压的编码数据。(为了更快得到编码,即更快找到对应的DAC数据,通常采用二分法)


STM32逐次逼近型ADC:

        STM32ADC规则组有最多16通道,一次性可以转化16个外部电压模拟信号;注入组有最多4通道,一次性最多可以转化4个外部电压模拟信号。普通的ADC每次智能转化一个外部电压模拟信号,转化完一个之后在转化下一个,就相当于你给老板点餐吃饭,每次只能点一个菜,而STM32有两个组,规则组就是给你一个菜单,你每次可以写16个菜,然后给老板帮你顺序做好一次性端上来,但是这个规则组比较尴尬的就是STM32规则组他只有一个16位的数据寄存器,就是你16个菜端上来,但是餐桌太小了,只能留一个菜,所以前15个菜会被挤掉,只留下第16个菜。因此规则组通常要配合DMA来使用,DMA是个数据转运器,它可以每上一个菜,就将这个菜转移到其他地方保存,防止被覆盖。注入组就很容易理解了,因为它有四个16位数据寄存器,所以他的菜单最多写四个菜,转化完了之后他的桌子也足够放下四个菜,因此不用担心被挤走。

规则组四种转换模式:
        1、单次转换非扫描模式
        2、单次转换扫描模式
        3、连续转换非扫描模式
        4、连续转换扫描模式
    
        单通道:当ADC规则组选择非扫描模式,那么就只有序列1指定的通道有效,即单通道转换有效;
        多通道:当ADC规则组选择扫描模式,那么全序列指定的通道有效(通道0-通道17),即多通道转换有效;


拓展:双ADC工作

        双ADC工作拥有两个模式,交叉模式和同步模式,比如交叉模式就是两个ADC对一个通道交叉采样,提高效率。

五、DMA

六、通信

通信的意义

        假如我们需要使用STM32片上外设没有的功能,那么我们就需要外挂芯片来实现,但是由于外挂的芯片数据不在STM32内,无法读取,那么此时就需要我们在两个设备之间(STM32和外挂的设备)连上一根或多根通信线,通过通信线路接收和发送数据,来实现控制外挂模块和读取外挂模块数据。    简单来说:拓展硬件系统。


通信协议的作用

        制定通信的规则,通信双方按照规定的协议来接收和发送数据。


通信协议的参数(也不知道该不该叫参数)

1、通信方式:

全双工:

        搜的资料:全双工通信(Full duplex Communication)是指在通信的任意时刻,线路上存在A到B和B到A的双向信号传输。 全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号。(可能还需要控制线和状态线,以及地线);
        自己理解:指通信双方能够进行双向通信,通常需要两根通信线,一根接收,一根发送,两根线路互不影响(例如:USART、SPI)。

半双工:

        半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端,相应地,接收端也可以转变为发送端,但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。(比如:I2C、CAN、USB)        例如:对讲机是日常生活中最为常见的一种半双工通信方式,手持对讲机的双方可以互相通信,但在同一个时刻,只能由一方在讲话。

单工:

        在单工通信中,通信的信道是单向的,发送端与接收端也是固定的,即发送端只能发送信息,不能接收信息,接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的,指数据只能从一个设备到另一个设备,不能反着来,假如全双工的USART有两个引脚TX、RX,如果去掉其中一个,就变成了单工工作。

2、时钟特性

        同步:比如I2C和SPI他们有自己的时钟线,接收方可以在时钟信号的指引下进行采样,因此他们是同步的;

        异步:USART串口等通信方式没有时钟线,因此需要双方预定一个采样频率,所以是异步通信,而且还需要加一些帧头帧尾等,来确定采样位置的对齐。

3、电平                                                                                                                             

        单端:比如串口、I2C、SPI他们都是单端信号,即引脚的高低电平都是对GND的电压差,所以单端通信的双方必须要共地,因此他们通信引脚都有GND引脚,不接GND是没法通信的。

        差分:例如CAN和USB他们是差分信号,靠差分引脚的电压差来传输信号的,不过USB协议里面有些地方还是需要单端信号的,所以还是要共地的。同时差分信号的抗干扰性非常好,因此差分信号的传输速率和传输距离都非常的牛。

4、设备

        点对点:好比老师单独找你去谈话,就是两个设备双方通信。

        多设备:好比老师在班上对多个同学讲话,需要有一个寻址的过程,以确定通信的对象。


具体通讯协议:

<一> 串口通讯

        串口通信的最大优势就是可以实现单片机和电脑的互联;CH340是一个串口转USB的芯片,通过这个芯片就可以把串口协议转化成USB协议。

        电平标准:电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据之间的对应关系;串口常用的电平标准有三个:
        (1)TTL电平:+3.3V或+5V表示1,0V表示0;
        (2)RS232电平:-3V~-15V表示1,+3V~+15V表示0;
        (3)RS485电平:两线压差+2V~+6V表示1,-2V~-6V表示0(差分信号);

        串口参数:
        (1)波特率:串口传输的速率;
        (2)起始位:标志一个数据帧的开始,固定为低电平;
        (3)数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行;
        (4)校验位:用于数据校验;
        (5)停止位:用于数据帧间隔,固定为高电平;

        关于数据帧的个人理解:空闲时,信号一直是高电平,而当数据发送过来时,起始位变为低电平,产生下降沿,标志着数据接收的开始;很好理解,空闲为1,开始接收变为0。然后就是接收8位数据位,如果我们传输的数据是0x0F,那么就是将其转化为2进制00001111,低位先行,所以在数据位里就是11110000,如果有奇偶校验位时,那么就多一位,而校验的原理是什么呢?简单来说就是,奇校验时,如果正确的数据为00011010,那么此时校验位补0,让数据位的有效数据保持为奇数,如果是11001100,那么校验位就补1,始终保持为奇数。如果数据发送、接收时出现干扰,本来是00011010的数据,变为了00011000,校验位还是补0,那么现在数据有效位就变成了偶数,就意味着出错了,那么程序就会要求重发或者直接丢弃;偶校验同理。接着接收完成后停止位到来,变为高电平,与空闲时一致,也是方便判断下个起始位,如果后续没有数据了,那就还是高电平。

USART:

        引脚部分主要用到TX和RX,发送和接收引脚;接着就是DR——数据寄存器,在程序上表现为一个寄存器,即数据寄存器DR;但实际上,DR分为四个寄存器,分别为发送数据寄存器(TDR)、接收数据寄存器(RDR)、发送移位寄存器、接收移位寄存器。当进行写操作时,数据存入TDR,只写;当进行读操作时,数据从RDR读出,只读。发送移位寄存器的作用就是将数据一位一位地移出去,跟串口协议的波形的数据位对应,并且都是低位先行;接收数据寄存器也是同理。
        比如说,我们将0x55这个数据传入发送数据寄存器,转化为二进制数据就是01010101,接着硬件检测到你写入数据了,他就会查看发送移位寄存器中是否有数据正在移位,如果有,那么就会等待移位完成,如果没有,那么这个01010101的数据就会立刻全部移动到移位数据寄存器,接着移位、发送;当数据从TDR移动到移位数据寄存器时,会置一个标志位TXE(TX Empty)——发送数据寄存器空,当这个标志位置一了,我们就可以将下一个数据写入TDR;不过即使TXE置一了,也不代表发送移位寄存器就移位完成了,只要发送数据寄存器空了,就会置一,而移位寄存器会在发送控制器的作用下,向右一位一位地把数据输出到TX引脚。
        了解完发送数据寄存器部分,那么接收数据寄存器部分也就大差不差了。当RX引脚将数据输入到接收移位寄存器,那么数据就会从高位到低位输入,接着检测接收数据寄存器是否为空,为空,那么接收移位寄存器里的数据就按串口协议的低位先行的方式将数据一次性全部转移到接收数据寄存器里,在这个过程中,当接收数据寄存器不为空时,会产生一个RXNE(RX Not Empty)标志位,当RXNE为1时,我们就可以把接收数据寄存器里的数据读走了,而接收移位寄存器也可以接着输入数据了。

流控:

        这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同(比如台式机与单片机之间的通讯就会出现这种情况),接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 pc机中常用的两种流控制是硬件流控制,包括rts/cts、dtr/cts等等,以及软件流控制xon/xoff(继续/停止)。

起始位侦测:

        

波特率发生器:

        寄存器原理建议自行查看江协自动化的B站32教程。

串口收发HEX数据包和文本数据包:

        串口收发数据包通过包头包尾来判断数据的起始位
        (1)HEX数据包:在HEX数据包里,数据都是以原始的字节数据本身呈现的,即十六进制数;HEX数据包长度分为可变长度和不可变长度的数据包;但是由于包头包尾存在与数据载荷重复的情况,这样就容易导致收包出错,解决方式很多样,比如我们可以规定数据载荷的范围,或者采用双包尾的策略,这样就可以减少出错;关于可变长度数据包,由于数据载荷可变,所以数据载荷与包头包尾重复的情况更多,难以判断数据包长度。
        (2)文本数据包:在文本数据包里,数据由原始数据经过一层编码译码之后,以字符的形式呈现。由于字符的数量较多,因此包头包尾与载荷重复的情况就很少了,也很好解决。

<二> IIC通讯协议

<三>SPI通讯协议

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值