前言:以下内容基于 百问网 黄老师的 7天实战训练的个人总结
第4节主要学习了基于STM32F103C8T6的中断系统,以及串口编程:
1、什么是中断:相当于在你正在做一件事情A时,突然有紧急事件B闯入,让你不得不放下手里的事情A马上先把紧急事件B处理好,然后再返回处理之前正在做的事情A。紧急事件B就相关于中断。下图比较清晰的描述了中断的过程。
2、STM32有哪些中断:
系统异常(内部中断):系统异常相关与内部中断,主要是一些系统异常的反馈。
外部中断:相关于外设在要执行一些重要的动作时和系统发出的优先处理申请。
打开工程文件,里面有中断向量表,可以看到I2C,UART,FLASH,TIMER等。
中断的优先级:中断的优先顺序由NVIC中断控制器进行管理,上面的图示中有表示优先级,-3最高,且-3-2-1的优先级是固定的不可修改,其余的可以通过NVIC进行修改。
所有的中断都要指定:
抢占优先级:数量越小优先级越高(0最高),如果抢占优先级相同,必须要先执行完前面的中断,然后再执行后面的。
子优先级:数量越小优先级越高(0最高),如果抢占优先级相同,子优先级高的先执行。
注:抢占优先级和子优先级完全相同的,按中断向量表中顺优先执行。
GPIO中断,如下图所示不同组同位GPIO共用同一个中断,比如PA0/PB0/~PG0共用EXTI0.可以配置PX0的任意接口但只能一个。
中断初始化:
static void MX_NVIC_Init(void) //向量表初始化
{
HAL_NVIC_SetPriority(EXTI0_IRQn,1,0);//设置抢占优先级1,子优先级0
HAL_NVIC_EnableIRQ(EXTI0_IRQn) //中断EXTI0使能
}
在中断函数中增加功能:KEY触发
EXTI0_IRQHandler(viod)
{
HAL_GPIO_EXTI_IRQHandler(KEY_pin)//按下KEY键触发中断
}
KEY 中断函数
static uint8_t key_flag =0 ;//KEY 标识位
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY_Pin) //如果按下KEY中断
{
key_flag = ~key_flag; //标识位取反
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,key_flag?GPIO_PIN_RESET:GPIO_PIN_SET);
//判断flag,如果是1就RESET,如果是0就SET
}
}
通信包括串行通信和并行通信:
串行:比如发送一个8位的数据,如果是1条数据线,每次发1位8次发完。
并行:比如发送一个8位数据,如果是8条线,1次发完。
全双工/半双工/单工传输
全双工:双方可以同时收发信息。
半双工:只能一边发完,另一边再发。
单工 :只能单向的收发。
同步/异步通信:
同步通信:收发端频率相同,共用时钟线,如I2C协议。
异步通信:收发端频率不同,是靠指定的传输协议方式收发信息,如串口,红外收发。
串口电平:因ARM本身只能支持3.3~5V的电压,串口TTL是近距离模块传输的方式,传输距离非常近。如果要提升传输距离,需要把0~5V的电压差提升来提高传输可靠性,如下图所示:
接下来的内容就是利用STM32CubeMX以及KEIL进行代码编写了,相关内容比较多,有兴趣的同学可以自行学习下。
本篇总结完成,内容学习及部分配图源于百问网相关教程