STM32开发

1.新建工程步骤

2.点亮LED灯

1.配置寄存器

1.RCC寄存器:使能GPIOC的时钟

2.IOPCEN:用于使能GPIOC时钟(打开时钟写1)

3.配置13口模式:

1.找到GPIOx_CRH(x可以是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-MOS,MOS管相当于一种电子开关,信号来控制开关的导通和关闭,开关负责将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函数中填入1,0代表开关灯,则需要强制转换为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.按键控制led

1.按键介绍

1.定义:常见的输入设备,按下导通,松手断开

2.按键抖动:由于按键内部使用机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

2.传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,在通过电压比较器进行二值化即可得到数字电压输出

1.传感器模块基本电路

1.AO电压由来:在上图中,N1代表传感器元件所代表的可变电阻,它的阻值可以根据环境的管线,温度等模拟量进行变化,R1是和N1进行分压的定值电阻,它和N1串联,一端接在VCC正极,一端接在GND负极,C2为滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑,一般遇到这种一端接在电路中,另一端接地的电容,都可以考虑一下是不是滤波电容的作用,如果是滤波电容的作用,那这个电容就是用来保证电路稳定的,并不是电路的主要框架,这是我们在分析电路时,就可以先把这个电容给抹掉,这样就可以使我们的电路分析更加简单,当N1阻值变小使,下拉作用会增强,中间的AO端电压就会降低,当N1阻值为0,AO输出被完全下拉,输出0伏,当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高,当N1阻值趋向正无穷,电路无限趋近于于断路,输出电压被R1无限拉高至VCC

2.数字输出:对AO进行二值化输出,二值化通过LM393完成输出,LM393是一个电压比较器芯片,里面有两个独立的电压比较器电路,C1为滤波电容,电压比较器相当于运算放大器,当同相输入端电压大于反相输入端的电压时,输出就会瞬间升高为最大值也就是输出接VCC,反之当同相输入端的电压小于反相输入端的电压时,输出就会瞬间降低为最小值也就是输出接GND这样就可以对一个模拟电压进行二值化了

3.指示灯:左边的是电源指示灯,通电就亮,右边的是DO输出指示灯,它可以指示DO的输出电平(低电平点亮,高电平熄灭),上拉电阻R5是为了保证默认输出为高电平的

4.P1排针:分别是VCC,GND,DO,AO

2.按键硬件电路

1.上图中上面两个是下接按键方式,下面两个是上接按键方式,在开发过程中多用下接方式

2.接法:

1.左上角图:随便选取一个GPIO口,然后通过K1接到地,当按键按下时,GPIO口直接下拉到GND,此时读取GPIO口的电压就是低电平,当按键松手时,GPIO口被悬空,引脚电压不确定,所以必须要求引脚是上拉输入模式,否则会出现电压不稳定的错误现象,在这种方式下,按下按键,引脚为低电平,松手,引脚为高电平

2.右上角图:在上一个图基础上增加一个上拉电阻,当按键松手时,引脚为高电平,按键按下时,引脚直接接到GND,也就是一股无穷大的理吧这个引脚往下拉,引脚为低电平,这种状态下,引脚不会出现悬空状态,此时引脚可以配置为浮空输入和上拉输入,若为上拉输入,那就是内外两个上拉电阻共同作用了,这时高电平就会更强些,对应高电平就更加稳定,但引脚被强行拉到低时,损耗也就会大一些

3.左下角图:引脚通过按键接到3.3伏,需要引脚必须配置为下拉输入模式,当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平

4.右下角图:在上一个图基础上增加一个下拉电阻,需要配置为下拉输入模式或浮空输入模式

5.总结:上面两种接法按下时时低电平松手时是高电平,下面两种解法按下时是高电平,松手是低电平,左边两种解法必须要求引脚是上拉或下拉输入模式,右边两种解法可以允许引脚是浮空输入模式,因为已经外置了上拉下拉电阻

7.C语言数据类型

stdint关键字指的是在stdint头文件下原来数据类型的名称

1.宏定义:

2.typedef

1.和宏定义的区别:宏定义新名字在左边,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.oled

1.简介

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口,但相同的Pin(PA0,PB0不能同时使用)不能同时触发中断

5.通道数:16个GPIO_Pin,外加PVD输出(从电压过低恢复时中断),RTC闹钟(闹钟响时才唤醒,之前中断),USB唤醒,以太网唤醒(外部中断可以从低功耗模式的停止模式下唤醒STM32)

6.触发相应方式:中断响应(申请中断,让CPU执行中断函数)/事件响应(选择触发事件,若选择触发事件,那外部中断信号就不会通向CPU了,而是通向其他外设,用于执行其他外设的操作,例如ADC转换,触发DMA)

9.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,输出才为0

2.与门(或门左侧半圆形模块):可以有多个输入,只有一个输出,执行与的逻辑,再输入端,只要有一个是低电平0,输出就是0,只有全部输入1,输出才为1

3.上路触发中断,下路触发事件

1.触发中断:首先会置一个挂起寄存器,这相当是一个中断标志位,可以读取这个寄存器判断是哪个通道触发的中断,如果中断挂起寄存器置1,他就会继续向左走,和中断屏蔽寄存器共同进入一个与门,然后是至NVIC中断控制器,这里的与门是开关作用,对于与门来说,1与任意数x等于x,0与任意数为0

2.触发事件:事件屏蔽寄存器进行开关控制,最后通过一个脉冲发生器,到其他外设,这个脉冲发射器就是给一个电平脉冲,用来触发其他外设的动作

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,连接到后面的EXTI

4.配置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_PortSourceGPIOx(x为A-G)

  1. GPIO_PinSource:指定要配置的外部中断线,参数为GPIO_PinSourcex(x为0-15)

6.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可以获取指定的标志位是否被置1,ClearFlag可以对置1的标志位进行清除,对于这些标志位,有的比较紧急,在置标志位后会触发中断,在中断函数里,若相查看标志位和清除标志位,可以用下面两个函数,在主程序里查看和清除标志位,就用上面两个函数,GetITStatus,获取中断标志位是否被置1了,ClearITPendingBit,清除中断挂起标志位,本质上,这4个函数都是对状态寄存器的读写,下面2个函数只能读写与终端有关的标志位,并且对中断是否允许做出判断,而上面的这两个函数只是一般的读写标志位,没有额外处理,能不能触发中断标志位都能读取

6.exti参数:exti初始化结构体(因为exti只有一个,所以不需要像GPIO一样,先指定要配置的哪个exti)

1.参数:EXTI_InitStruct:EXTI_InitTypeDef类型结构体指针,包含了对于EXTI外设的配置信息

7.配置NVIC

1.位置查找:因为NVIC是内核库函数,我们需要打开misc.h文件

2.函数介绍:

1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

1.作用:用来中断分组,参数是中断分组的方式

2.参数取值:可取下列列表任意一个来设置优先级,对应的数字分别对应抢占和响应优先级

2.void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

1.作用:根据结构体里面的指定参数初始化NVIC

2.参数含义

1.NVIC_IRQChannel:指定中断通道开启或关闭,这个参数可以是IRQn_Type里面的任意一个值(IRQn_Type定义在stm32f10x.h文件,stm32f103c8t6适配MD)

2.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和RESET

4.注:中断程序结束后,一定要再调用以下清除中断标志位的函数,因为只有中断标志位置1了,程序就会跳转到中断函数,如果不清除标志位,那它就会一直申请中断,这样程序就会不断响应中断,执行中断函数,那程序就卡死在终端函数里

6.统计中断触发次数

1.在模块上面定义一个变量,类型为uint16_t,名字是CountSensor_Count,在再中断函数里写CountSensor_Count++

7.写入get函数返回变量

1.写入uint16_t CountSensor_Get(void);

2.再函数体写入return CountSensor_Count

3.放进头文件声明

注:可以将 EXTI_InitStructure.EXTI_Trigger参数改为EXTI_Trigger_Raising改为上升沿触发

13.旋转编码器

1.定义变量:因为需要正反转,所以定义一个带符号的变量

2.判断另一个引脚的电平

3.在每次调用这个函数后,返回Count变化值,用于外部加减一个变量(需要返回Count,然后清零)

4.定义临时引脚Temp,将Count赋值给Temp,在把Count清零,最后返回Temp

注:1.在中断函数里,最好不要执行耗时过长的代码,要简短快速

2.最好不要在中断函数和主函数用相同的函数或操作同一个硬件

3.在实现功能是,可以在中断里操作变量或标志位,当中断返回时,我再对这个变量进行显示和操作

相关推荐
BT-BOX1 小时前
STM32简易数字电流表仿真_LCD1602显示
stm32·电流测量·lcd1602显示·电流表
LCG元2 小时前
STM32实战:基于STM32F103的I2C通信(AT24Cxx EEPROM读写)
stm32·单片机·嵌入式硬件
徐某人..2 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
博览鸿蒙2 小时前
从入门到工程师路径,快速建立FPGA认知
fpga开发
星恒讯工业路由器4 小时前
MCU+WiFi与CPU+WiFi模块区别
单片机·嵌入式硬件
LCMICRO-133108477464 小时前
长芯微LD7940完全P2P替代AD7940,是一款14位、逐次逼近型模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc
lf2824814315 小时前
06 AD9361 LVDS接口实现和仿真
fpga开发
进击的小头5 小时前
20_第20篇:嵌入式外设驱动开发基础:寄存器级开发与库函数开发对比实战
arm开发·驱动开发·单片机
guygg887 小时前
基于STM32的智能小区管理系统设计
stm32·单片机·嵌入式硬件