本博客为实验室第三次作业。
中断
中断的定义:中断是计算机方面特有的名词,指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
中断的执行流程:
外部中断
外部中断的定义:外部中断指的是由外部引发的中断,具体到STM32就指的是由外设引发的中断,即外部中断源。
外部中断通用I/O映像
STM32单片机的每一个GPIO都可以被设置为外部中断输入,根据引脚序号的不同可以将外部中断分为不同的组,分别为PA0-PG0为EXTI0组,以此类推,PA15-PG15为EXTI15组,共16组,并且每一组中同一个时刻只能有一个中断源工作,所以,STM32单片机最多允许同时有16个外部中断。外部中断的分配方式如下表所示:
GPIO引脚 | 中断标志位 | 中断处理函数 |
PA0~PG0 | EXTI0 | EXTI0_IRQHandler |
PA1~PG1 | EXTI1 | EXTI1_IRQHandler |
PA2~PG2 | EXTI2 | EXTI2_IRQHandler |
PA3~PG3 | EXTI3 | EXTI3_IRQHandler |
PA4~PG4 | EXTI4 | EXTI4_IRQHandler |
PA5~PG5 | EXTI5 | EXTI9_5_IRQHandler |
PA6~PG6 | EXTI6 | |
PA7~PG7 | EXTI7 | |
PA8~PG8 | EXTI8 | |
PA9~PG9 | EXTI9 | |
PA10~PG10 | EXTI10 | EXTI15_10_IRQHandler |
PA11~PG11 | EXTI11 | |
PA12~PG12 | EXTI12 | |
PA13~PG13 | EXTI13 | |
PA14~PG14 | EXTI14 | |
PA15~PG15 | EXTI15 |
其中5-9,10-15采用并线,所以STM32EXTI结构如图所示
另外还有四条 EXTI 线的连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件 ( 只适用于互联型产品 )
外部中断的配置:
初学者会觉得外部中断的配置是一个相当繁琐的过程,因为配置外部中断需要将上图所示的四个部分全部打穿
配置外部中断一般的步骤为:
开启IO口时钟,初始化IO口为输入。调用函数:
GPIO_Init();
2)开启IO口复用时钟。调用函数:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3)设置IO口与中断线的映射关系。调用函数:
GPIO_EXTILineConfig();
4)初始化线上中断,设置触发条件等。调用函数:
EXTI_Init();
5)配置中断分组(NVIC),并使能中断。调用函数:
NVIC_Init();
6)编写中断服务函数。调用函数:
EXTIx_IRQHandler();
7)清除中断标志位。调用函数:
EXTI_ClearITPendingBit()。
NVIC优先级分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
串口
定义:串行接口简称串口,也称串行通信接口
划分标准:
同步串行接口(英文:Synchronous Serial Interface,SSI)是一种常用的工业用通信接口。
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。
和USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器
Other
波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。
波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。
单工:只能一个方向传输。
半双工:可以两个方向传输,但需要分时复用。
全双工:两个方向传输。
串口配置的一般步骤:
1.串口时钟使能:先使能GPIO时钟:
RCC_APB2PeriphClockCmd();
2.GPIO端口模式设置 GPIO_Init(); ——模式设置为GPIO_Mode_AF_PP
GPIO_Mode_IN_FLOATING;
3.串口参数初始化
USART_Init();
5.开启中断并且初始化NVIC (如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig(0);
6.使能串口:
USART_ Cmd();
7.编写中断处理函数:
USARTX_IRQHandler();
8.串口数据收发:
void USART SendData();//发送数据到串口,DR
uint16 tUSART_ ReceiveData(;//接受数据,从DR读取接受到的数据
9.串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USARTL_FLAG);
void USART_ClearlTPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT;