STM32开发

📅 2026/7/6 15:15:19
STM32开发
1.新建工程步骤2.点亮LED灯1.配置寄存器1.RCC寄存器使能GPIOC的时钟2.IOPCEN用于使能GPIOC时钟打开时钟写13.配置13口模式1.找到GPIOx_CRHx可以是A到E任意一个字母3.型号分类及缩写4.GPIO输出1.简介1.GPIO基本结构注1.每个外设都有16个引脚把第0号引脚称为PA0······2.在每个模块内都有寄存器和驱动器内核可以通过APB2总线对寄存器进行读写以此完成输出和读取电平的功能寄存器的每一位对应一个引脚输出寄存器写1对应引脚输出高电平写0就输出低电平输入寄存器读取为1证明对应端口目前是高电平读取为0就是低电平2.I/O端口位基本结构1.输入部分1.图片右端二极管中VDD输入3.3伏VSS输入0伏若输入电压比3.3高上方的二极管就会导通输入电流就会直接流入VDD而不会流入电路2.电阻上拉电阻为VDD下拉为VSS这两个电阻可通过程序进行配置如果上面导通下面断开就是上拉输入模式下面导通上面断开就是下拉输入模式两个都断开就是浮空输入模式1.上拉和下拉的作用给输入提供一个默认输入电平对应一个数字的端口输入不是高点平就是低电平2.若输入什么都不接就会处于一种浮空的状态引脚的输入电平极易受外界干扰而改变3.为了避免一脚悬空导致的输入数据不确定就需要在这里加上上拉或者下拉电阻了4.接入上拉电阻时当引脚悬空时还有上拉电阻来保证引脚的高电平所以上拉输入又称默认高电平输入模式同理下拉输入默认为低电平输入方式3.肖特基施密特触发器对输入电压进行整形1.执行逻辑如果输入电压大于某一阈值输出就会瞬间升为高电平同理电压小于某一阈值输出就会瞬间将为低电平4.模拟复用功能输入1.模拟输入连接到ADC上因为ADC需要接收模拟量因此模拟输入接到施密特触发器前2.复用功能输入连接到其他需要读取端口的外设上如串口的输入引脚因为这根线接收的是数字量所以在施密特触发器后面2.输出部分1.数字部分寄存器可以用输出部分寄存器和片上外设控制两种控制方式通过这个数据选择器接到了输出控制部分选择通过输出数据寄存器进行控制就是普通IO口输出写这个数据寄存器的某一位就可以操作对应的某个端口了2.位设置/清除寄存器可以用来单独操作输出数据寄存器的某一位而不影响其它位因为此寄存器同时控制16个端口且只能整体读写单独控制其中一个端口而不影响其他端口方法1.先读出这个寄存器然后用按位与和按位或的方式更改某一位在将更改后的数据写回去在C语言中就是和|2.通过设置这个位设置和位清除寄存器若我们要对某一位进行置1的操作在位设置寄存器的对应位写1即可剩下不需要操作的位写0这样它的内部就会有电路自动将输出数据寄存器中对应位置为1.而剩下写0的位则保持不变这杨就保证了只操作其中某一位而不影响其他位并且这是一步到位的操作若相对某一位进行清零的操作就在位清除寄存器的对应位写1即可3.读写STM32中的位带区域在STM32中专门分配有一段地址区域这段地址映射了RAM和外设寄存器所有的位读写这段地址中的数据就相当于读写锁映射位置某一位3.MOS管上面是P-MOS,下面是N-MOSMOS管相当于一种电子开关信号来控制开关的导通和关闭开关负责将IO口接到VDD或VSS,在这里可以选择推挽、开漏或关闭三种输出模式1.在推挽输出模式下P-MOS,N-MOS均有效数据寄存器为1时上管导通下管断开输出直接接到VDD即输出高电平数据寄存器为0时上管断开下管导通输出直接接到VSS就是输出低电平在此模式下高低电平均有较强的驱动能力所以推挽输出模式也称为强输出模式在此模式下STM32对IO口具有绝对控制权高低电平均由STM32说了算2.在开漏输出模式下只有N-MOS在工作数据寄存器为1时下管断开这时输出相当于断开也就是高阻模式数据寄存器为0时下管导通输出直接接到VSS也就是输出低电平在此模式下只有低电平有驱动能力高电平没有驱动能力这个模式可以做为通信协议的驱动方式在多机通讯模式下可以避免相互干扰3.关闭当引脚配置为输入模式时输出关闭端口电平由外部信号控制3.GPIO模式1.输入浮空/上拉/下拉配置2.模拟输入配置3.开漏、推挽输出配置4.复用开漏推挽输出配置5.LED闪烁流水灯蜂鸣器1.LED闪烁1.找到rcc.h库函数在.h函数最下面一般是库函数所有的函数的声明其中下图函数最常用2.找到函数介绍1.Enables or disables the AHB peripheral clock.用来使能或失能AHB外设时钟2.STM32互联型设备可以在下图列表选择3.其他设备在下面这个列表选择4.第一个参数选择外设第二个参数选择使能或失能5.打开gpio.h文件1.void GPIO_DeInit(GPIO_TypeDef* GPIOx);参数可以写GPIOA,GPIOB等等调用这个函数后所指定的GPIO外设就会被复位2.void GPIO_AFIODeInit(void);可以复位AFIO外设3.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);用结构体参数来初始化GPIO口需要先定义一个结构体变量然后再给结构体赋值最后调用这个函数此时这个函数内部就会自动读取结构体的值然后自动把外设的各个参数配置好一般外设的初始化都是使用init函数完成4.void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);可以把结构体变量赋一个默认值5.读取函数和写入函数6.8中输入输出模式对应代码从上到下依次是模拟输入、浮空输入、下拉输入、上拉输入、开漏输出、推挽输出、复用开漏、复用推挽7.GPIO输入输出函数1.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);这个函数可以把指定端口设置为高电平2.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);可以把指定端口设置为低电平3.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);根据第三个参数值来设置指定的端口这个参数可以是bitaction这个枚举终端一个值Bit_RESET是清除端口值也就是置低电平Bit_SET是设置端口值也就是置高电平4.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);第一个参数是选择外设第二个参数可以同时对16个端口进行写入操作3.在led点亮实验中使用推挽输出4.延时函数图中从上到下分别表示微秒延时毫秒延时和秒延时实操实例注若想在writebit函数中填入10代表开关灯则需要强制转换为BitAction类型5.推挽和开漏输出驱动问题1.高电平点亮方式把长脚插到GPIO口短脚插到负极说明在推挽输出模式下高低电平均有输出能力2.在开漏输出模式下低电平由驱动能力2.LED流水灯1.可以通过“|”来对多个端口进行初始化。时钟控制也可以通过此方法实施多个外设2.GPIO_SetBits也可以用|选择多个引脚3.使用GPIO_Write函数时如果使用低电平则需要进行取反在数据寄存器前加~3.蜂鸣器1.A15,B3,B4端口默认是JTAG的调试端口若想作为普通端口则需经过特殊配置4.调用库函数方法1.先打开.h文件最后看一下都有哪些函数在右键转到定义查看一下函数和参数的用法6.GPIO输入1.按键控制led1.按键介绍1.定义常见的输入设备按下导通松手断开2.按键抖动由于按键内部使用机械式弹簧片来进行通断的所以在按下和松手的瞬间会伴随有一连串的抖动2.传感器模块传感器元件光敏电阻/热敏电阻/红外接收管等的电阻会随外界模拟量的变化而变化通过与定值电阻分压即可得到模拟电压输出在通过电压比较器进行二值化即可得到数字电压输出1.传感器模块基本电路1.AO电压由来在上图中N1代表传感器元件所代表的可变电阻它的阻值可以根据环境的管线温度等模拟量进行变化R1是和N1进行分压的定值电阻它和N1串联一端接在VCC正极一端接在GND负极C2为滤波电容它是为了给中间的电压输出进行滤波的用来滤除一些干扰保证输出电压波形的平滑一般遇到这种一端接在电路中另一端接地的电容都可以考虑一下是不是滤波电容的作用如果是滤波电容的作用那这个电容就是用来保证电路稳定的并不是电路的主要框架这是我们在分析电路时就可以先把这个电容给抹掉这样就可以使我们的电路分析更加简单当N1阻值变小使下拉作用会增强中间的AO端电压就会降低当N1阻值为0AO输出被完全下拉输出0伏当N1阻值变大下拉作用就会减弱中间的引脚由于R1的上拉作用电压就会升高当N1阻值趋向正无穷电路无限趋近于于断路输出电压被R1无限拉高至VCC2.数字输出对AO进行二值化输出二值化通过LM393完成输出LM393是一个电压比较器芯片里面有两个独立的电压比较器电路C1为滤波电容电压比较器相当于运算放大器当同相输入端电压大于反相输入端的电压时输出就会瞬间升高为最大值也就是输出接VCC反之当同相输入端的电压小于反相输入端的电压时输出就会瞬间降低为最小值也就是输出接GND这样就可以对一个模拟电压进行二值化了3.指示灯左边的是电源指示灯通电就亮右边的是DO输出指示灯它可以指示DO的输出电平低电平点亮高电平熄灭上拉电阻R5是为了保证默认输出为高电平的4.P1排针分别是VCC,GND,DO,AO2.按键硬件电路1.上图中上面两个是下接按键方式下面两个是上接按键方式在开发过程中多用下接方式2.接法1.左上角图随便选取一个GPIO口然后通过K1接到地当按键按下时GPIO口直接下拉到GND此时读取GPIO口的电压就是低电平当按键松手时GPIO口被悬空引脚电压不确定所以必须要求引脚是上拉输入模式否则会出现电压不稳定的错误现象在这种方式下按下按键引脚为低电平松手引脚为高电平2.右上角图在上一个图基础上增加一个上拉电阻当按键松手时引脚为高电平按键按下时引脚直接接到GND也就是一股无穷大的理吧这个引脚往下拉引脚为低电平这种状态下引脚不会出现悬空状态此时引脚可以配置为浮空输入和上拉输入若为上拉输入那就是内外两个上拉电阻共同作用了这时高电平就会更强些对应高电平就更加稳定但引脚被强行拉到低时损耗也就会大一些3.左下角图引脚通过按键接到3.3伏需要引脚必须配置为下拉输入模式当按键按下时引脚为高电平松手时引脚回到默认值低电平4.右下角图在上一个图基础上增加一个下拉电阻需要配置为下拉输入模式或浮空输入模式5.总结上面两种接法按下时时低电平松手时是高电平下面两种解法按下时是高电平松手是低电平左边两种解法必须要求引脚是上拉或下拉输入模式右边两种解法可以允许引脚是浮空输入模式因为已经外置了上拉下拉电阻7.C语言数据类型stdint关键字指的是在stdint头文件下原来数据类型的名称1.宏定义2.typedef1.和宏定义的区别宏定义新名字在左边typedef新名字在右边宏定义不需要分号typedef后面必须加分号宏定义任何名字都可以换typedef只能给变量类型换名字3.结构体4枚举8.GPIO输入1.GPIO读取函数uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);1.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);1.用途读取输入数据寄存器某一个端口输入值2.参数用来指定某一个端口3.返回值代表这个端口的高低电平2.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);1.用途读取整个输入数据寄存器2.参数指定外设3.返回值16位数据每一位代表一个端口值3.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);1.用途用来读取输出数据寄存器的某一个位用于输出模式下用来看一下自己输出的值4.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)1.用途读取整个输出寄存器9.oled1.简介2.调试方式1.串口调试通过串口通信将调试信息发送到电脑电脑使用串口调试助手显示调试信息1.优势可以借助强大的电脑来调试电脑端的软件不仅可以显示单独的参数而且可以显示曲线、图形、图像等还可以自制软件来实现一个强大的用户交接界面2.弊端调试时需要依赖电脑而且通常的串口助手只能以信息流的方式呈现数据即只能一行一行打印如果有很多不断变化的数据需要显示只能在电脑上刷屏显示用起来不太方便2.显示屏调试直接将显示屏连接到单片机将调试信息打印在显示屏上1.优势对于不断变化的数据可以刷新覆盖显示而且显示屏可以始终接在单片机上显示方式很直接一般我们做一些稍微复杂的东西都会需要有一个人机交互的界面这样就可以直接把显示屏当作产品的一部分2.弊端屏幕太小显示内容有限没有电脑软件那么强大的功能3.keil调试模式借助keil软件的调试模式可使用单步运行、设置断点、查看寄存器即变量等功能3.硬件电路1.接线原理GND接地VCC接3.3伏SCL和SDA是I2C的通信引脚需要接在I2C通信引脚上4.oled驱动函数图中江科大将屏幕分为了16*4的小区块10.中断系统1.简介2.作用1.使用中断系统可以极大提升程序运行效率2.安排中断优先级可以更好安排中断事件防止紧急的事件被别的中断耽误3.中断嵌套可以对中断程序进行二次中断这样新的紧急中断就可以立即执行了3.执行流程图注为了程序在中断完成时继续工作在中断执行前会对程序现场进行保护中断执行后会再还原现场这样就可以保证主程序即使被中断了回来之后也能继续运行4.STM32中断1.内核中断1.复位中断当产生复位事件时程序就会自动执行复位中断函数也就是我们复位后程序开始执行的位置2.剩余部分为外设中断1.窗口看门狗由于检测程序运行状态的中断2.PVD电源电压监测如果你供电电压不足PVD电路就会申请中断3.外设电路检测到有什么异常或者事件需要提示CPU时就可以申请中断让程序颠倒对应中断函数里运行一次用来处理这个异常或事件5.中断地址程序中的中断函数的地址是由编译器来分配的是不固定的但是中断跳转由于硬件限制只能跳到固定的地址执行程序。为了能让硬件跳转到一个不固定的中断函数里这里就需要再内存中定义一个地址的列表这个列表地址是固定的中断发生后就跳到这个固定位置然后在这个固定位置由编译器再加上一条跳转到中断函数的代码这样中断函数就可以跳转到任意位置了这个中断地址的列表就叫中断向量表相当于中断跳转的一个跳板6.NVIC基本结构嵌套中断向量控制器1.作用在STM32中它是用来统一分配中断优先级和管理中断的2.NVIC是一个内核外设是CPU的小助手3.一个外设可能会同时占用多个中断通道所以这里有n条线4.NVIC只有一个输入口NVIC根据每个中断优先级分配中断先后顺序之后通过右边这一个输出口告诉CPU你该处理哪个中断7.NVIC分组1.NVIC的中断优先级由优先级寄存器的4位0-15决定值越小优先级越高者4位可以进行切分分为高n位的抢占优先级和地4-n位的响应优先级2.抢占优先级高的可以中断嵌套响应优先级高的可以有限排队抢占优先级和相应优先级均相同的按中断号排队8.EXTI简介1.EXTI外部中断2.可以监测指定GPIO口的电平信号当其指定的GPIO口产生电平变化时EXIT将立即向NVIC发送中断申请经过NVIC裁决后即可中断CPU主程序使CPU执行EXIT对应的中断程序3.支持的触发方式上升沿从低电平变到高电平的瞬间触发中断/下降沿高电平变为低电平/双边沿上升沿和下降沿均可/软件触发程序代码4.支持的GPIO口所有GPIO口但相同的PinPA0,PB0不能同时使用不能同时触发中断5.通道数16个GPIO_Pin外加PVD输出从电压过低恢复时中断RTC闹钟闹钟响时才唤醒之前中断USB唤醒以太网唤醒外部中断可以从低功耗模式的停止模式下唤醒STM326.触发相应方式中断响应申请中断让CPU执行中断函数/事件响应选择触发事件若选择触发事件那外部中断信号就不会通向CPU了而是通向其他外设用于执行其他外设的操作例如ADC转换触发DMA9.EXTI基本结构1.最左边是GPIO外设每个GPIO有16个外设所以引进来16根线2.AFIO中断引脚选择的电路模块它可以在前面2个GPIO外设的16个引脚里选择其中一个连接到后面的EXTI的通道里相同的pin在afio里只有一个能连接到EXTI的通道上3.经过EXTI过后分成了两种输出模式接到NVIC时用来触发中断外部中断的9-5和15-10会触发同一个中断函数在编程时我们在这两个中断函数里需要再根据标志位来区分到底是哪个中断进来的剩下20条线路用来触发其他外设操作也就是事件响应10.AFIO复用IO口1.AFIO主要用于引脚复用功能的选择和重定义2.再STM32中AFIO主要完成两个任务复用功能引脚重映射默认复用功能引脚换到重定义这个位置来中断引脚选择11.EXTI框图1.或门边沿检测电路左侧扇形模块可以有多个输入只有一个输出执行或的逻辑只要有一个是高电平1输出就是高电平1只有全部输入低电平0输出才为02.与门或门左侧半圆形模块可以有多个输入只有一个输出执行与的逻辑再输入端只要有一个是低电平0输出就是0只有全部输入1输出才为13.上路触发中断下路触发事件1.触发中断首先会置一个挂起寄存器这相当是一个中断标志位可以读取这个寄存器判断是哪个通道触发的中断如果中断挂起寄存器置1他就会继续向左走和中断屏蔽寄存器共同进入一个与门然后是至NVIC中断控制器这里的与门是开关作用对于与门来说1与任意数x等于x0与任意数为02.触发事件事件屏蔽寄存器进行开关控制最后通过一个脉冲发生器到其他外设这个脉冲发射器就是给一个电平脉冲用来触发其他外设的动作12.旋转编码器介绍1.旋转编码器用来测量位置速度或旋转方向的装置当其旋转轴旋转是其输出端可以输出与旋转速度和方向对应的方波信号读取方波信号的频率和相位信息即可得知旋转轴的速度和方向2.类型机械触电式/霍尔传感器式/光栅式3.对于STM32来说想要获取的信号是外部驱动的很快的突发信号13.旋转编码器工作原理1.使用对射式红外传感器来测速配合光栅编码盘当编码盘转动时红外传感器就会出现遮挡-透过现象对应模块输出的电平就是高低电平交替的方波。这个方波的个数表示了转过的角度方波的频率表示转速可以用外部中断来捕获方波的边沿以此判断位置和速度2.内部使用金属触点进行通断为机械触电式编码器左右是两部分开关触点内侧这两根细触点都是和中间这个引脚连接的外侧的触点左边的接在A右边的接在B中间的金属片是一个按键这个旋转编码器的轴是可以按下去的按键的轴按下上面两根线短路松手上面两根线断开3.编码盘再旋转式依次连接和断开两边的触点能让两侧触点的通断产生一个90度相位差最终配合以下外部电路生成以下波形注上侧为正转下侧为反转相位相差90度叫正交波形带正交输出的编码器是可以用来测方向的14.旋转编码器硬件电路1.模块电路图上面按键悬空在圆形模块下方是编码器触点旋转轴旋转时这两个触点以相位相差90度的方式交替导通而且要配合外围电路才能输出高低电平在10k上拉电阻默认没旋转的情况下这个点被上拉为高电平通过R3这个电阻输出到A端口的也就是高电平当旋转时内部触点导通那这个点就直接被拉低到GND了在通过R3输出A端口就是低电平了R3时输出限流电阻它是为了防止模块引脚电流过大的C1是输出滤波电容可以防止一些输出信号抖动右边同理2.接线方式3V3和GND接到正负极A,B相输出接到两个引脚上GPIOPin编号不同15.外设查找1.NVIC在Cortex-M3编程手册里就是内核和内核外设的详细介绍16.外设配置1.配置RCC把设计的外设时钟都打开不打开时钟外设没办法工作2.配置GPIO选择我们的端口为输入模式3.配置AFIO,选择我们用的这一路GPIO连接到后面的EXTI4.配置EXTI选择边沿触发方式比如上升沿下降沿或者是双边沿选择触发响应方式可以选择中断响应和事件响应5.配置NVIC给我们这个中断选择一个合适的优先级6通过NVIC外部信号就可以进入CPU了这样CPU才能收到中断信号才能跳转到中断函数里执行中断程序11.AFIO外设讲解1.void GPIO_AFIODeInit(void);用于复位AFIO外设调用此函数,AFIO外设配置就会全部清除2.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);用于锁定GPIO配置调用此函数参数指定某个引脚那这个引脚的配置就会被锁定防止意外更改3.void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);void GPIO_EventOutputCmd(FunctionalState NewState);用于配置AFIO事件输出功能的4.void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);用于进行引脚重映射第一个参数是你要选择重映射的方式第二个参数是新的状态5.void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);调用此函数就可以配置AFIO的数据选择器来选择我们想要的中断引脚1.GPIO_PortSource选择某个GPIO外设作为外部中断源参数为GPIO_PortSourceGPIOxx为A-G2. GPIO_PinSource指定要配置的外部中断线参数为GPIO_PinSourcexx为0-156.void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);和以太网有关12.EXTI库函数讲解1.void EXTI_DeInit(void);调用此函数就可以把EXTI的配置都清除恢复成上电默认的状态2.void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);调用此函数就可以根据这个结构体里的参数配置看到EXTI外设3.void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);调用此函数可以把参数传递的结构体变量赋一个默认值注上述3个函数在大多数外设均能见到就像是库函数模板一样基本每个外设都需要这些类型的函数这些模板函数使用方法和意思也都是一样的4.void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);用于触发软件外部中断调用此函数参数会给一个指定的中断线就能软件触发一次外部中断5.模板函数FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);void EXTI_ClearFlag(uint32_t EXTI_Line);ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);void EXTI_ClearITPendingBit(uint32_t EXTI_Line);在外设运行过程中会产生一些状态标志位当程序要看标志位时就要看这4个函数其中这前两个函数GetFlagStatus可以获取指定的标志位是否被置1ClearFlag可以对置1的标志位进行清除对于这些标志位有的比较紧急在置标志位后会触发中断在中断函数里若相查看标志位和清除标志位可以用下面两个函数在主程序里查看和清除标志位就用上面两个函数GetITStatus获取中断标志位是否被置1了ClearITPendingBit清除中断挂起标志位本质上这4个函数都是对状态寄存器的读写下面2个函数只能读写与终端有关的标志位并且对中断是否允许做出判断而上面的这两个函数只是一般的读写标志位没有额外处理能不能触发中断标志位都能读取6.exti参数exti初始化结构体因为exti只有一个所以不需要像GPIO一样先指定要配置的哪个exti1.参数EXTI_InitStructEXTI_InitTypeDef类型结构体指针包含了对于EXTI外设的配置信息7.配置NVIC1.位置查找因为NVIC是内核库函数我们需要打开misc.h文件2.函数介绍1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);1.作用用来中断分组参数是中断分组的方式2.参数取值可取下列列表任意一个来设置优先级对应的数字分别对应抢占和响应优先级2.void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);1.作用根据结构体里面的指定参数初始化NVIC2.参数含义1.NVIC_IRQChannel指定中断通道开启或关闭这个参数可以是IRQn_Type里面的任意一个值IRQn_Type定义在stm32f10x.h文件stm32f103c8t6适配MD2.NVIC_IRQChannelCmd指定中断通道使能或失能3.NVIC_IRQChannelPreemptionPriority,NVIC_IRQChannelSubPriority:指定抢占优先级和响应优先级3.void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);1.作用:设置中断向量表4.void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);1.作用系统低功耗配置注在配置中断之前先指定以下中断的分组然后使用NVIC_Init初始化NVIC就行了3.配置优先级分组1.先占优先级就是抢占优先级从占优先级就是响应优先级2.分组方式整个芯片只能用一种整个工程执行一次即可若把它放在模块里进行分组那么要确保每个模块都选的是同一个也可以把这个代码放在主函数最开始12.中断函数1.在stm32中中断函数的名字都是固定的每个中断通道都对应一个中断函数名字可以参考启动文件2.找到中断向量表如上图所示以IRQHandle结尾的字符串就是中断函数的名字3.中断函数都是无参数无返回值的4.在中断函数里一般都是先进行一个中断标志位的判断确保是我们想要的中断源触发的这个函数因为EXTI1-15都能进入所以要查看是不是在单片机定义的GPIO口需要到exti.h文件查看5.EXTI_GetITStatus函数1.鼠标右键查看定义2.复制参数EXTI_Linex把x改为定义的GPIO口3.返回值是SET和RESET4.注中断程序结束后一定要再调用以下清除中断标志位的函数因为只有中断标志位置1了程序就会跳转到中断函数如果不清除标志位那它就会一直申请中断这样程序就会不断响应中断执行中断函数那程序就卡死在终端函数里6.统计中断触发次数1.在模块上面定义一个变量类型为uint16_t名字是CountSensor_Count,在再中断函数里写CountSensor_Count7.写入get函数返回变量1.写入uint16_t CountSensor_Get(void);2.再函数体写入return CountSensor_Count3.放进头文件声明注可以将 EXTI_InitStructure.EXTI_Trigger参数改为EXTI_Trigger_Raising改为上升沿触发13.旋转编码器1.定义变量因为需要正反转所以定义一个带符号的变量2.判断另一个引脚的电平3.在每次调用这个函数后返回Count变化值用于外部加减一个变量需要返回Count然后清零4.定义临时引脚Temp将Count赋值给Temp在把Count清零最后返回Temp注1.在中断函数里最好不要执行耗时过长的代码要简短快速2.最好不要在中断函数和主函数用相同的函数或操作同一个硬件3.在实现功能是可以在中断里操作变量或标志位当中断返回时我再对这个变量进行显示和操作