认真你就输了,一直认真你就赢了。
1、任务计划
(1)看完外部中断的教学视频
(2)使用STM32编写外部中断的程序
(3)看通用定时器基本原理讲解
2、计划完成度
(1)今天视频分了两部分,1、外部中断的一般配置过程,2、根据1步骤编写外部中断实验。
外部中断一般配置过程有7个步骤:
[1]使能SYSCFG时钟;
[2]初始化IO口为输入; GPIO_Init
[3]设置IO口与中断线的映射关系; void SYSCFG_EXTILineConfig();
[4]初始化线上中断,设置触发条件等; EXTI_Init();
[5]配置终端分组(NVIC)并使能中断; NVIC_Init();
[6]编写中断服务函数; EXTI_IRQHandeler();
[7]清除中断标志位; EXTI_ClearITPendingBit();
(2)根据视频的教学,比较成功的编写了一个外部中断实验的程序。
这里和之前写的跑马灯实验、按键实验、按键跑马灯实验也是有很多的相似之处的,我们就可以在按键实验的基础上,添加一个exti.C和exti.h就好了,注意新建之后要加到相应的路径中去。
[1]exti.h和之前写的led.h、key.h一样,定义一下EXTI_H,然后把外部中断的初始化放在里面就好了。
exti.c先要include需要用到的头文件。比如这里是外部中断,需要按键触发,所以要加key.h进来。
[2]对照着(1)的步骤编写中断程序。需要注意的有:
*如EXTI_Init()函数(初始化线上中断),入口参数为指针类型,所以要在相应的函数开头就要定义个变量EXTI_InitTypeDef EXTI_InitStruct,之后在EITI_Init()取地址就好&EXTI_InitStruct。接着就在初始化函数的上面,去初始化结构体类型的每个成员变量。
*触发方式有三种:上升沿触发、下降沿触发、边沿触发。我们可以根据实际电路进行判断KEYx是上拉输入,还是下拉输入,以此决定触发方式。
比如KEY0是上拉输入。没有按下的时候是高电平,按下键就是低电平,我们就可以采用下降沿触发。
*一涉及中断,必然会有优先级的问题。抢占优先级和响应优先级首先是根据main函数设置的优先分组,对照着STM32的优先级分组表,我们可以知道抢占优先级和响应优先级是怎么分组的。在exti.c文件中编写NVIC的成员变量的时候,就会知道怎么去设置抢占优先级和响应优先级的参数。
这边还应该要注意的就是数制问题了,一定要分清楚是二进制、十进制,还是16进制。
*void EXTI4_IRQHandler(void)是没有入口参数,也没有返回值的,所以()中要写void。其中EXTI4_IRQHandler在启动文件CORE中。
*main.c就和之前一样步骤,先include对应着HARDWARE的头文件,在初始化需要用到的头文件,接着就可以写运行的函数了~
(3)通用定时器的基本原理,主要是从三个方面来讲的,1、三种定时器的区别,2、通用定时器的特点,3、通用定时器工作过程。
[1]三种定时器包括高级定时器、通用定时器和基本定时器。
*高级定时器可以产生带编程死区的互补输出;
*通用定时器可以用来计时计数,PWM输出,输入捕获和输出比较。
*基本定时器只能计时,所以主要应用于驱动DAC。
[2]通用定时器的特点是就通用TIMx(TIM2-TIM5)展开的。
*16位(TIM3和TIM4)或32位(TIM2和TIM5)递增、递减和递增/递减自动重载计
数器。
数器。
*16位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于1到65536之间。
*4个独立通道(TIMx_CH1~4),可用于输入捕获、输出比较、PWM生成(边沿和中心对齐模式)、单脉冲模式输出;
~使用外部信号控制定时器且可实现多个定时器互连的同步电路。
~发生如下事件时生成中断/DMA请求:
~更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
~触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
~输入捕获
~输出比较
~输出比较
~ 支持定位用增量(正交)编码器和霍尔传感器电路
~外部时钟触发输入或者周期电流管理。
[3]通用定时器的工作过程,也是在TIM2-TIM5展开的。工作区分为五部分:
*时钟源。有4大类来源:内部时钟、内部触发输入、外部引脚、外部捕捉比较引脚。
*实际电路。主要由预分频器、计数器、寄存器组成。
*输入捕获。
*输出比较。与输入捕获的通道相对应。
*相关寄存器。可以进行捕获/比较。