江科大/江协科技 STM32学习笔记P9-11

文章目录


OLED

1、OLED硬件

SCL和SDA是I2C的通信引脚,需要接在单片机I2C通信的引脚上,在这里的驱动程序用的是GPIO口模拟的I2C通信,所以这两个端口可以接在任意的GPIO口上。

main.c

c 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	
	/*OLED显示*/
	OLED_ShowChar(1, 1, 'A');				//1行1列显示字符A
	
	OLED_ShowString(1, 3, "HelloWorld!");	//1行3列显示字符串HelloWorld!
	
	OLED_ShowNum(2, 1, 12345, 5);			//2行1列显示十进制数字12345,长度为5
	
	OLED_ShowSignedNum(2, 7, -66, 2);		//2行7列显示有符号十进制数字-66,长度为2
	
	OLED_ShowHexNum(3, 1, 0xAA55, 4);		//3行1列显示十六进制数字0xA5A5,长度为4
	
	OLED_ShowBinNum(4, 1, 0xAA55, 16);		//4行1列显示二进制数字0xA5A5,长度为16
											//C语言无法直接写出二进制数字,故需要用十六进制表示
	
	while (1)
	{
		
	}
}

EXTI外部中断

1、中断系统

2、中断执行流程图

在中断执行前会对程序的现场进行保护,中断执行后还原现场。

右边有中断函数,中断函数不需要我们调用,由硬件自动调用。

3、STM32中断

4、中断地址的作用

程序中的中断函数,它的地址是由编译器来分配的,是不固定的,但是中断跳转由于硬件的限制只能跳转到固定的地址执行程序,为了硬件能跳转到一个不固定的中断函数里,需要在内存中定义一个地址列表,这个列表地址是固定的,中断发生后就跳到这个固定位置,然后在这个固定位置,由编译器再加上一条跳转到中断函数的代码,这样中断跳转就可以跳转到任意位置了。说人话就是中断跳转认的固定地址由编译器担保,编译器对外用固定地址,对内自己再找地址存,类似中断向量表。

NVIC基本结构

在STM32中用来统一分配中断优先级和管理中断,NVIC是一个内核外设。为什么需要NVIC?因为STM32的中断非常多,如果都接到CPU上,CPU需要引出很多线,如果很多中断同时申请,或者中断很多产生了拥堵,难处理,所以需要NVIC。NVIC有很多输入口,只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,之后通过输出口让CPU处理中断。

NVIC优先级分组

类比医生看病,响应优先级高的可以等医生看完这个病人后优先看病,抢占优先级高的直接让正在看病的病人等着自己先看。

当抢占优先级和响应优先级均相同时,按上上图中表中的优先级顺序数字来排队,数字小的优先排队

5、EXTI

引脚电平变化,申请中断,上升沿,电平从低到高触发中断,下降沿,高到低触发中断,软件触发是引脚不变程序里的代码触发中断。

相同的Pin不能同时触发中断的意思是PA1、PB1、PC1这样的只能选1个作为中断引脚,所以如果有多个中断引脚,要选不同Pin的引脚,比如PA6和PA7、PA9和PB15这样的。

16个GPIO_Pin是外部中断的主要功能,后面四个是来外部中断"蹭网"的,为什么呢?因为外部中断有从低功耗模式的停止模式下唤醒STM32的功能,对于PVD电源电压监测,当电源从电压过低恢复时,需要PVD借助一下外部中断退出停止模式,对于RTC闹钟来说,有时为了省电,定一个闹钟后STM32进入停止模式,等到闹钟响的时候再唤醒,也需要借助外部中断。

中断响应:申请中断,让CPU执行中断函数。事件响应:当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但在STM32中也可以选择触发一个事件,如果触发事件那外部中断的信号就不通向CPU了,而是通向其他外设,用来触发其他外设的操作,比如触发ADC转化、触发DMA等。

6、EXTI基本结构

每个GPIO外设都有16个引脚,在AFIO中进行选择后接到EXTI边缘检测及控制电路,与下面4个蹭网的一起,经过EXTI电路后分为了两种输出,上面一直到ETH都是接NVIC用来触发中断,注意外部中断的9-5和15-10分到一个通道里,减少通道资源占用,也就是9-5触发同一个中断函数,编程时,在这个两个中断函数中需要再根据标志位来区分到底是哪个中断进来的。下面的20条输出线接到其他外设进行事件响应。

7、AFIO复用IO口

PA0、PB0...通过数据选择器接到EXTI0,这就清楚了为什么相同的Pin不能同时触发中断。

8、EXTI框图

输入线进入边沿检测电路,在上面的上升沿寄存器和下降沿寄存器选择触发方式,接着触发信号进入或门的输入端,通过或门后触发信号兵分两路,上面触发中断,下面触发事件。触发中断首先会置一个挂起寄存器,相当于中断标志位,读该寄存器可判断出是哪个通道触发的中断,如果寄存器置1就会继续向左走,和中断屏蔽寄存器共同进入一个与门,然后进NVIC中断控制器,这里的与门是开关的作用,只有中断屏蔽寄存器给1时才有可能让触发信号继续走。再看下面的触发事件的输出部分,首先是一个事件屏蔽寄存器进行开关控制,最后通过一个脉冲发生器到其他外设,脉冲发生器的作用是给一个电平脉冲,用来触发其他外设的动作。

或门和与门

或门一个为1则为1,与门一个为0就是0。

9、旋转编码器介绍

转动旋转编码器产生脉冲波形,信号突发,STM32不知道什么时候产生,同时是外部驱动,STM32只能被动读取,最后这个信号非常快,STM32稍晚一点读取就会错过很多波形。对于这种情况,考虑外部中断。

按键虽然也是外部驱动的突发事件,但外部中断不好处理按键抖动和松手检测的问题,对于按键来说,它的输出波形也不是转瞬即逝的,要求不高可以在主程序中循环读取,或定时器中断读取。

内部用金属触点进行通断,是一种机械触点式编码器,内侧的左右触电都接中间的C引脚,外侧的触电左接A引脚,右接B引脚,中间的圆的金属片是一个按键,可以按下,上面两根线引出。

右边是编码盘,是一系列金属触点,在旋转时依次通断两边的触点,还需注意金属盘的位置是经过设计的,能让两侧触点的通断产生一个90度的相位差,最终配合一下外部电路,两个输出AB就会输出如下,当正转时左边A相引脚输出一个方波信号,同时右边的B相引脚输出一个和它相位相差90度的波形,这种相位相差90度的波形叫正交波形,可以测方向,这就是单相输出和两相正交输出的区别。

我们用到的这种触点接触形式的旋转编码器适合调节音量但不适合测电机,另外几种非接触的形式可以用于电机测速。

10、硬件电路

编码器内部两个触点在旋转轴旋转时以相位相差90度的方式交替导通,需要配合外围电路输出高低电平,左图左下接10K的上拉电阻,默认不旋转时上拉为高电平,通过R3输出到A端口的也为高电平。当触电导通时,接到GND,低电平。R3是输出限流电阻,防止模块引脚电流过大,C1是输出滤波电容,可以防止输出信号抖动。

右边AC接两个引脚,C暂时不用。

相关推荐
重生之我在20年代敲代码2 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
2401_858286115 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
jiao000017 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠7 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond7 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
Navigator_Z9 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
菜菜想进步9 小时前
内存管理(C++版)
c语言·开发语言·c++
知星小度S10 小时前
C语言——自定义类型
c语言·开发语言
cleveryuoyuo10 小时前
二叉树的链式结构和递归程序的递归流程图
c语言·数据结构·流程图