OLED介绍:
有机发光二极管
OLED硬件电路:
4针脚的右边两个针脚提供电源,剩下两个是I2C通信引脚,这里会使用GPIO口模拟I2C通信,因此可以接任意GPIO口。
7针脚也同理,两个供电,其余是SPI通信引脚,如果是GPIO口模拟SPI通信,则可以接任意GPIO
使用OLED中封装的函数在OLED显示屏显示各类型数据:
因为C语言不支持打印二进制因此只能使用OLED中的函数,即使打印也要写成16进制数,因为C语言中不能直接写二进制数字(会被认成10进制数)。
中断系统:
中断介绍:在主程序运行过程中,出现了中断特定触发条件(中断源),使得CPU暂停正在运行的程序,转而去处理中断程序,处理完成后又返回原来的程序继续执行。
中断优先级:当有多个中断源同时申请中断时,CPU 会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU 再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回
STM32中断:
- 68 个可屏蔽中断通道,包含 EXTI、TIM、ADC、USART、SPI、I2C、RTC 等多个外设
- 使用 NVIC 统一管理中断,每个中断通道都拥有 16 个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
NVIC(嵌套中段向量控制器)
NVIC用来统一分配中断优先级和管理中断的,是CPU管理中断的小助手。NVIC有多个输入口可以接多个中断线路,但只有一个输出口根据每个中断的优先级分配中断的先后顺序交给CPU进行运算。
NVIC 优先级分组
- NVIC 的中断优先级由优先级寄存器的 4 位(0~15)决定,这 4 位可以进行切分,分为高 n 位的抢占优先级和低 4-n 位的响应优先级
- 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
EXIT介绍:
EXIT外部中断
EXIT可以检测指定的GPIO口的电平变化,当指定的GPIO口发生电平变化时,EXIT立即向NVIC发送中断申请,经过NVIC裁定后即可中断CPU主程序去执行EXIT对应的中断程序。
支持的触发方式:上升沿/下降沿/双边沿/软件触发
支持的GPIO口:所有的GPIO口,但相同的Pin不能同时触发。
EXIT基本结构:
EXTI 共有 16 条中断线,每个 GPIO 端口都有 16 个引脚。AFIO 负责在所有 GPIO 的同一个 Pin 编号里,选择其中一路引脚连接到对应的 EXTI 中断线。
AFIO电路图:
AFIO主要用于引脚复用功能的选择和重定义。
EXTI内部框图
对射式红外传感器计次代码:
根据EXTI基本结构图进行编码。
对外部中断配置的代码:
配置了GPIO,AFIO,EXTI,NVIC。
第一步开启外设时钟,一共四个外设(两个需要打开时钟,两个不需要)用RCC开启GPIO与AFIO外设,因为NVIC是内核外设因此不需要开启时钟。
设置了计数函数与中断函数。(PB14 出现下降沿时中断)
主函数:
旋转编码器计次代码:
也是设置了GPIOB、AFIO、EXTI、NVIC四个外设。
AFIO作用将PB0、PB1映射到EXTI0、EXTI1。EXTI负责检测下降沿并产生中断。
NVIC作用:决定这个中断能不能让CPU相应,以及配置优先级
GetCount()计数函数负责将这一段时间的计数取出来并清零。
两个中断函数通过判断A/B相来判断顺时针还是逆时针,并计数。
主函数代码。
出现的错:
在这里通过两个if来判断A和B的相进而判断是逆时针还是顺时针。
而且应该加上清理中断。否则一直在中断。