资讯动态

stm32入门篇

发布时间:2026/10/16 2:18:22 来源:尧图企业网站定制
一.对单片机的初步认识1.1单片机与电脑的区别单片机单片微型计算机是一种集成电路芯片电脑和单片机中部件的对应关系电脑↔单片机CPU ↔ CPU内存 ↔ SRAM硬盘 ↔ FLASH主板 ↔ 外设1.1.1 RAM和FLASHRAM随机存取存储器分为SRAM静态随机存取存储器和DRAM动态随机存取存储器SRAM 静态 RAM不需要电容刷新通电就保住数据速度更快、电路复杂、容量小。 →单片机片内的 RAM 就是 SRAM你图上的 SRAM用来存变量、堆栈。DRAM 动态 RAM靠电容存电荷电容漏电必须不停刷新成本低、容量大。 →电脑上的内存条DDR 内存就是 DRAM电脑主内存。两者均掉电丢失FLASH闪存FLASH 属于非易失存储器对应电脑的硬盘。单片机里用来存放程序代码就是我们用 Keil 编译后烧录进去的固件。核心特点断电不掉数据断电后代码 / 数据可以保存很多年这是和 SRAMRAM最大区别读快、写慢读数据很快但写之前必须先擦除一整个扇区不能只改单个字节。擦写次数有限一般几万到十万次反复频繁写入会磨损 FLASH所以不适合存高速变化的变量。单片机常用的是NOR Flash支持 XIPCPU 可以直接在 Flash 里面运行代码不用全部搬到 RAM 里。1.1.2 CISC和RISC1.1.3冯诺伊曼结构和哈佛结构1.2Cortex-M系列介绍1.2.1Cortex内核分类及特征.Cortex-M系列的不同类别1.3数据手册的阅读数据手册的分类基础知识说明1. 上拉输入悬空 / 无外接引脚 高电平平时高外接 GND接地、开关按下引脚 低电平按下低口诀默认高接地变低2. 下拉输入悬空 / 无外接引脚 低电平平时低外接 VCC接电源、开关按下引脚 高电平按下高口诀默认低接电变高选择原则模式和外部模块保持默认状态一致若外部模块默认输出低电平就选择输入低电平(下拉输入)若外部模块默认输出高电平就选择输入高电平(上拉输入) 。三极管示意图左边是基极带箭头的是发射极剩下的是发射极二.STM32与51外设的逻辑语关系2.1LEDLED正极接面包板正极负极接GPI/O口时输入低电平亮反之输入高电平亮蜂鸣器是低电平发出响声高电平不发声且LED初始化模式和频率设置如下2.2按键但对于按键是相同的当按键按下时函数的返回值均为0初始化模式和频率设置如下按键Speed的取值与实际使用无关例if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)2.3光敏电阻光敏电阻的特性有光照时光敏电阻阻值很小比如几百欧几千欧被遮挡 / 黑暗时光敏电阻阻值很大几兆欧甚至更高对于光敏电阻当选择上拉输入时被遮挡光敏电阻阻值大 → 内部上拉主导 → 引脚高电平 → 返回1有光照光敏电阻阻值小 → 光敏电阻拉低主导 → 引脚低电平 → 返回0上图符号表示或门可以有多个输入但是只能有一个输出执行的是或的逻辑在输出端只要有一个是高电平1就输出的是高电平1只有全部输入低电平0才会输出0上图符号是与门可以有多个输入但是只能有一个输出执行的是与的逻辑在输出端只要有一个是低电平0就输出的是低电平0只有全部输入高电平1才会输出1上图符号是非门只能有一个输入和一个输出执行的是非的逻辑在输出端只要有一个是低电平0就输出的是高电平1只要有一个是高电平1就输出的是低电平0上图是数据选择器有多个输入一个输出三.GPIO简介单片机的引脚用来读外部信号或控制外部设备GPIO模式LED是浮空四.EXTI(外部中断4.1EXTI简介简介STM32 引脚触发中断外部电平 / 边沿变化触发程序跳转AFIO的用处AFIO 的核心作用AFIO 主要用于引脚复用功能的选择和重定义是 STM32 中配置 GPIO 引脚特殊功能的关键模块。STM32 中 AFIO 的两大核心任务复用功能引脚重映射调整外设默认引脚映射关系解决引脚资源冲突优化硬件设计。中断引脚选择确定外部中断线与具体 GPIO 引脚的对应关系配置外部中断输入源。4.2步骤开启GPIO和AFIO的时钟GPIO初始化AFIO选择中断引脚EXIT初始化NVIC中断分组NVIC配置//若是PX5到PX9,则通道为 EXTI9_5_IRQHandler //若是PX10到PX15,则通道为 EXTI15_10_IRQHandler //NVIC_IRQ通道可在stm32f10x.h文件的297行之后找到五.TIM定时器工作图5.1TIM定时中断5.1.1关于定时器的函数时钟源选择时基单元中断输出控制运行控制来决定定时器运行和静止写预分频值的函数改变计数器的计数模式选择是否有预装给自动重装器写一个值配置时基单元时可通过以下公式定时此为定时1s时所配置的函数因为预分频器和计数器都有一个数的偏差所以要减个1实际分频数预分频数1ARR控制波形长短周期 / 频率 下图就是设置ARR值的函数PSC决定定时器的计数频率清除标志位5.1.2步骤开启TIM时钟配置时钟源时基单元初始化对于计数当计时器数到ARR的值加一100就会清零重新开始计算 (ARR1)*(PSC1)/72000000就是每增加一所需要的时间TIM_Prescaler决定了 “计数的速度”数值越大数得越慢。TIM_Period决定了 “数多少个数才溢出”数值越大溢出越慢。中断输出配置硬件只会自动置 1不会自动清 0必须软件手动清零通过TIM_ClearFlag函数来实现。NVIC分组和配置和EXTI一样TIM使能5.2TIM输出比较5.2.1OC(Output Capture)输出比较简介输出比较可以通过比较 CNT 与 CCR 寄存器值的关系来对输出电平进行置 1、置 0 或翻转的操作用于输出一定频率和占空比的 PWM 波形。5.2.2PWM (Pulse Width Modulation) 脉冲宽度调制PWM的频率越快它等效模拟的信号就平稳占空比决定了PWM等效出来的模拟电压的大小若占空比是以0.1%的速率来变化的即10%-10.1%-10.2%-10.3%则分辨率为0.1%PWM 频率Freq CK_PSC / (PSC 1) / (ARR 1)PWM 占空比Duty CCR / (ARR 1)PWM 分辨率Reso 1 / (ARR 1)PWM的输出比较模式蓝色斜线代表定时器的计数器CNT的值随时间变化的过程。它从 0 开始一直向上计数直到达到最大值后自动清零重新开始计数形成锯齿状的上升波形。红色水平线代表捕获 / 比较寄存器CCR的值这里数值是 30。当CNT计数值小于这个值时输出 PWM 为有效电平大于等于时则变为无效电平它决定了 PWM 的占空比。黄色水平线代表自动重装载寄存器ARR的值这里数值是 99。当CNT计数到这个值时就会自动清零并重新计数它决定了 PWM 的周期频率。参数计算PWM占空比DutyCCR/(ARR1)ARR控制波形长短周期 / 频率 下图就是设置ARR值的函数CCR控制高电平长短占空比 CCR300-300 个时钟高电平5.2.3步骤开启时钟配置时钟源(TIM)和初始化(GPIO)GPIO初始化不能使用推挽输出(Mode_Out_PP)只能使用复用推挽输出(Mode_AF_PP)实基单元初始化(与上文TIM相同)输出比较初始化不同通道对应的引脚不同如下图TIM使能外部封装一个函数来设置CCR的值5.2.4各个通道对应的引脚5.2.5舵机舵机的内部图工作原理PWM信号输入到控制板给控制板一个指定的目标角度电位器就会检测目标当前角度如果大于目标角度就会反转反之就会正转输入 PWM 信号要求周期为 20ms高电平宽度为 0.5ms~2.5ms周期20ms:从一个上升沿到下一个上升沿的时间为20ms。舵机分为两种旋转角度180和360旋转角度180输入不同信号脉冲宽度旋转角度不同旋转角度360输入不同信号脉冲宽度旋转方向和速度不同电机驱动板的硬件电路:5.2.6函数解读用来配置输出比较模块的一个函数对应一个输出单元给输出比较结构体赋一个默认值用来配置强制输出模式单独更改CCR寄存器的值可用来更改占空比仅高级定时器使用在使用高级定时器输出 PWM 时需要调用这个函数使能主输出否则 PWM 将不能正常输出。用来给结构体赋初始值当从通用计时器更换为高级定时器时需要配置的成员变多如果没有配置就会导致高级定时器输出PWM时会出现问题所以我们可以先给所有成员先赋一个初始值然后修改部分结构体成员的方式来处理问题。对于普通/开漏推挽输出引脚的控制权是来自于输出数据寄存器的GPIO_Mode_Out_PP若想让定时器来控制引脚则需要使用复用开漏/推挽输出的模式输出控制权将转移给片上外设GPIO_Mode_AF_PPPWM波形才能通过引脚输出5.2.7重映射定义将片上外设如串口、定时器的默认 I/O 引脚切换到芯片上其他备用引脚。例将作用于PA0的功能转移到PA15上引脚重映射配置函数步骤开启时钟必须开启AFIO引脚重映射配置第一行是选择了部分重映射方式一参考手册上有详细的说明对于引脚PA15上电后默认复用为了调试端口JTDI若想让其作为普通的GPIO端口则需解除调试端口5.3TIM输入捕获5.3.1IC(Input Capture)输入捕获简介输入捕获模式下当通道输入引脚出现指定电平跳变时当前 CNT 的值将被锁存到 CCR 中可用于测量 PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数。四个输入捕获和输出比较通道共用4个CCR寄存器以及四个通道的引脚CH1-CH4也是共用的所以两者只能使用一个不能同时使用5.3.2频率测量测频法在闸门时间 T 内对上升沿计次得到 N则频率 fx​N/T测周法两个上升沿内以标准频率fc​计次得到 N则频率 fx​fc​/N中界频率测频法与测周法误差相等的频率点 fm​fc​/T​令测频法和测周法的N相等然后将fx解出来fc从哪里来硬件来源系统时钟如 HSE 晶振 72MHz定时器时钟经过分频后的频率比如 1MHz外部高精度晶振比如 8MHz软件配置比如定时器配置为时钟源72MHz预分频 PSC71 → 分频系数 72计数时钟fc 72MHz / 72 1MHz这个1MHz就是你在测周法里用的fc高频适合测频法低频适合测周法当待测频率小于中界频率时为低频高于中界频率时为高频5.3.3主从触发模式主模式可将定时器内部的信号映射到TRGO引脚用于触发别的外设即主动发时钟、主动发起通信说了算从模式接收其他外设或者自身外设的信号用于控制自身定时器的运行即被动等时钟、被动响应听指挥选择从模式触发源选择选择从模式的触发信号源选择从模式输入的触发源选择主模式输出的触发源5.3.4输入捕获和PWMI基本结构输入捕获先转运CNT到CCR中再触发从模式使CNT清零PWMI:对左上角的图进行分析在触发上升沿时CCR1先赋值CNT然后令CNT0在高电平时间内CNT一直在触发下降沿时给CCR2赋值CNT这时CNT是在高电平期间的值然后在低电平时间内CNT也一直在触发下一个上升沿时给CCR1赋值CNT这时的CNT是一个周期的总值则CCR1/CCR2占空比5.3.5步骤IC配置步骤开启时钟配置GPIO时钟源时基单元初始化输入捕获初始化选择触发源和从模式TIM使能封装函数获得输入捕获的频率同时要配置PWM分析tim2的pscarr只负责控制输出的频率而tim3的psc负责测周法中的fcarr负责不让计数器溢出必须将PWM波配置完全占空比频率分辨率否则无法测量例子分析当输入信号为100HZ时先明确你的定时器配置TIM3 时钟72MHzPSC 预分频72-1 71计数频率 72MHz / (711) 1MHz意思计数器每 1μs 加 1100Hz 信号的周期是多少频率 f 100Hz 周期 T 1 /f 0.01 秒 10,000 微秒μs计数器会计多少个数因为 1μs 计 1 个数 10000μs 就会计 10000 个数则输入捕获测量的频率值为1MHz/100005.3.6各个通道对应的引脚5.3.7输入捕获和输出比较之间的差别输入捕获输出比较引脚输入端口输出端口执行流程接收到输入信号执行CNT锁存到CCR的动作根据CCR和CNT的大小关系来执行输出动作每个通用定时器和高级定时器都有4个输入捕获通道在输入捕获中高级定时器和通用定时器没有区别基本定时器没有输入捕获功能函数方面上的差别输入捕获下CCR是只读的要用GetCapture输出比较下CCR是只写的要用SetCompare5.4编码器接口Encoder Interface 编码器接口可接收增量正交编码器的信号根据编码器旋转产生的正交信号脉冲自动控制 CNT 自增或自减从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用定时器都拥有 1 个编码器接口两个输入引脚借用了输入捕获的通道 1 和通道 25.4.1正交编码器正转超前90°反转滞后90°A相 B相分析在TI1和TI2上计数的情况下若A相上升沿则相对信号的电平是指B相的电平高低此时B相高电平就为向下计数5.4.2编码器接口基本结构过程输入捕获的前两个通道通过GPIO口接入编码器的A、B相通过滤波器和边沿检测极性选择产生TI1FP1、TI2FP2通向编码器接口编码器接口再通过预分频器控制CNT的时钟同时还根据编码器的旋转方向控制CNT的计数方向5.4.3步骤开启时钟配置GPIO因为编码器接口就是一个带方向控制的外部时钟所以不需要配置内部时钟时基单元配置输入捕获初始化因为只需配置滤波器和极性边沿选择所以分频选择和选择是否直流的结构体参数可以去掉编码器接口配置因为此处可以进行极性边沿选择所以上处进行初始化时可省略且此处配置会覆盖上面函数的参数这里的上升沿不代表上升沿有效因为旋转编码器上升沿和下降沿始终都是有效的而是代表TI1和TI2是否反相选择Rising通道不反相选择Falling通道反相反相通道的输入信号直接送入定时器不做电平翻转不反向通道的输入信号先被取反再送入定时器配置含义效果Rising, Rising两个通道都不反相编码器正转时计数器向上计数Falling, RisingCH1 反相CH2 不反相计数方向整体反转Rising, FallingCH1 不反相CH2 反相计数方向整体反转Falling, Falling两个通道都反相相位关系不变方向和默认一致六.ADC(模拟-数字转换器)6.1ADC简介简介将模拟电压转换为数字变量可将ADC看成一个电压表将引脚的电压值测出放在一个变量里ADC将模拟电压转换为数字变量是模拟电路到数字电路的桥梁。DAC将数字变量转换为模拟电压是模拟电路到数字电路的桥梁。12 位位数越高量化结果就越精细对应分辨率越高逐次逼近型 (ADC的工作模式)ADCAD转化开始到产生结果的时间为1us(1MHz此为stm32中ADC最快转换频率)输入电压范围0~3.3V转换结果范围0~4095输入电压和转换结果为一 一对应关系6.2逐次逼近型ADCSTM32的通道有18个ADC逐次比较给DAC一个数据使其生成一个对应的电压已知然后与通道输入的一个未知电压进行比较若DAC的电压比未知电压大就通过二分法使DAC电压变小不断重复就得到了未知的电压6.3ADC的基本结构分析输入通道有18个16个GPIO口和2个内部通道AD转换器里的规则组最多选择16个通道注入组最多选择4个通道转换的结果存放在数据寄存器中其中规则组有1个寄存器注入组有四个触发控制可分为软件触发和硬件触发硬件触发主要来自于定时器和外部中断的引脚RCC是推动ADC逐次比较的时钟模拟看门狗用于监测转换结果的范围若超出设定阈值就通过中断输出控制向NVIC申请中断EOF是结束信号规则组的四种转换模式单次转换非扫描模式只有序列1的通道转换有效多次转换非扫描模式单次转换扫描模式将前7个序列的通道都转换将数据结果放在数据寄存器里并用DMA将数据挪走防止数据被覆盖多次转换扫描模式总结单次 非扫描单通道、转一次就停只有第一个通道单次 扫描多通道序列跑一遍就停连续 非扫描单通道高速连续采样只有第一个通道连续 扫描多通道循环采样高速数据采集数据对齐数据右对齐一般使用数据左对齐不想要高分辨率时使用AD转换时间AD 转换的步骤采样保持量化编码STM32 ADC 的总转换时间为 TCONV 采样时间 12.5 个 ADC 周期量化编码所需时间例如当 ADCCLK14MHz最大频率采样时间为 1.5 个 ADC 周期 TCONV 1.5 12.5 14 个 ADC 周期 1μs校准ADC 有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间在每个电容器上都会计算出一个误差修正码 (数字值)这个码用于消除在随后的转换中每个电容器上产生的误差建议在每次上电后执行一次校准启动校准前 ADC 必须处于关电状态超过至少两个 ADC 时钟周期硬件电路点位器产生可调电压的电路中间的滑动端可输出一个0~3.3V的可调电压向上滑电压增大向下电压减小传感器输出电压的电路传出端感器阻值变小下拉作用变强输出电压下降传出端感器阻值变大下拉作用变弱输出电压上升电压转换电路通过串联分压来实现测量VIN电压6.4步骤开启RCC时钟配置GPIO口AIN模式下GPIO口是无效的目的是为了防止GPIO口的输入输出对模拟电压造成干扰AIN模式是ADC的专属模式选择规则组的输入通道规则组通道配置ADC初始化ADC使能ADC校准封装一个用于得到转换值的函数以上是选择单次转换非扫描模式的操作步骤若选择多次转换非扫描模式则如图所示大参数稳定小参数更快给SWSTART置1开始转换返回SWSTART的状态由于SWSTART在开始转换后立刻就清零了所以此函数返回值与转换是否结束无关七.DMA直接存储器存取7.1DMA简介简介不用CPU参与DMA 自己在内存 ↔ 外设之间和内存↔ 内存高速搬数据12个独立可配置的通道DMA17个通道DMA25个通道每个通道都支持软件触发和特定的硬件触发7.2存储器映像在stm32中变量是存储在SRAM里面的用const修饰的常量是存储在Flash里面的访问ADC1的DR寄存器方式ADC1-DRROM 只读存储器程序闪存断电数据保留只读为主可擦写存放烧录固件、常量STM32片内 FlashRAM 随机存取存储器运行内存断电数据丢失读写速度快存放程序运行变量、栈、堆STM32片内 SRAM7.3DMA基本结构分析DMA的数据转运可以是存储器一般指Flash和SRAM到外设也可是外设到存储器也可是Flash到SRAM但不能是SRAM到FlashFlash只读当是存储器到存储器时外设的参数应该写Flash的数据宽度可选择字节(Byte)、半字(HalfWord)、字(Word)地址自增外设寄存器不需要自增存储器需要自增自动重装器转运完成后是否恢复到未转运前传输计数器的数字传输计数器自减计数器用于设定需要转运几次M2M:用于选择软件触发用于存储器到存储器或硬件触发方式ADC、串口、定时器但软件触发不能和自动重装器一起用软件触发的目的是为了使传输计数器清零而自动重装器是防止其清零DMA转运条件DMA必须使能传输计数器必须大于0若其等于0且没有自动重装器这时就要给DMA_Cmd失能再给传输计数器一个大于0的数然后使能开启触发源必须有触发信号当传输数据和被传输数据的传输宽度不同时大数据传到小数据时高位会被舍弃小数据传到大数据时高位会补07.4步骤开启时钟注DMA的时钟在AHBP总线上DMA初始化其中AddrBAddrASize均为自定义变量DMA使能封装一个DMA转运函数当DMA和ADC一起使用时开启时钟设置ADC的时钟GPIO初始化ADC规则组通道配置和ADC初始化DMA初始化DMA和ADC使能ADC校准ADC触发以上为ADC连续扫描模式的配置方法强制转换(uint32_t)就是把 “指针类型的地址” 转换成 “32 位整数”选择DMA_PeripheralDataSize_HalfWord低16位数据是因为低16位数据是规则组的数据高16位数据是ADC2的stm32中没有ADC2AD_Value为自定义数组

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑