嵌入式学习--step12 外部中断与定时器中断学习

来源:互联网 发布:新手用linux哪个版本好 编辑:程序博客网 时间:2024/05/21 11:06

/*********************/
外部中断:
1、STM32F4的每个IO都可以作为外部中断输入。
这里写图片描述
STM32F4供IO使用的中断线只有16个。EXT0–EXT15
但是STM32F4xx系列的IO口有112个。16*7=112( (A–I) 7个)
下面讲,它们的映射关系:
GPIOx.0 映射到 EXTI0
2、对于每个中断线,我们可以设置触发方式。
这里写图片描述
3、并不是16个中断线就有16个中断服务函数呢?
IO口外部中断在中断向量表中只分配了7个中断向量,也就只能使用7个中断服务函数。
这里写图片描述
IO口外部中断在中断向量表中只分配了7个中断,EXTI9_5 就是中断5到中断9在一起,中断10-中断15在一起。这样以来,就只能使用7个中断服务函数。
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI5_10_IRQHandler
//////////////////////////////////////////////////////////////
下面是讲讲外部中断常用库函数:
1、void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx,uint8_t EXTI_PinSoucex);
//设置IO口与中断线的映射关系**
例如:
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
2、void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线:触发方式等。
3、ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生
4、void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位
5、RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
//使能SYSCFG时钟
/////////////////////////////////////////////////////////////////

外部中断的一般配置步骤
1、使能SYSCFG时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
2、初始化IO口为输入
GPIO_Init();
3、设置IO口与中断线的映射关系
void SYSCFG_EXTILineConfig();
4、初始化线上中断,设置触发条件等
EXTI_Init();
5、配置中断分组(NVIC),并使能中断
NVIC_Init();
6、编写中断服务函数
EXTIx_IRQHandler();
7、清除中断标志位
EXTI_ClearITPendingBit();
///////////////////////////////////////////
讲解使用库函数配置外部中断的步骤:
1)使能IO口时钟,初始化IO口为输入
2)开启SYSCFG时钟,设置IO口与中断线的映射关系
首先,打开SYSCFG时钟,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
注意,只要我们使用外部中断,就必须打开SYSCFG时钟
接下来,配置GPIO与中断线的映射关系,配置GPIO与中断线的映射关系的函数SYSCFG_EXTILineConfig()来实现的:
例如:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource0) ;这样就将中断线0与GPIOA映射起来。
3)初始化线上中断,设置触发条件等
中断线上中断的初始化时通过函数EXTI_Init()实现的,EXTI_InitTypeDef EXTI_InitStructure;
EXTI_Init(&EXTI_InitStructure);
4)配置中断分组(NVIC),并使能中断
我们设置好中断线和GPIO映射关系,又设置好了中断的触发模式等初始化参数,既然是外部中断,所以还要设置NVIC中断优先级。
5)编写中断服务函数
配置完优先级后,接下来就是编写中断服务函数。
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
{….
EXTI_ClearITPendingBit(EXTI_Line3);//清除LINE上的中断标志位
….
}
}

定时器中断讲解:
1、通用定时器讲解
这里写图片描述
STM32F4 通用定时器(TIM2、TIM3、TIM4、TIM5)功能与特点包括:
1、16/32位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器。
2、16位可编程预分频器(TIMx_PSC),计数器时钟频率的分频系数为1—65535之间的任意数值。
3、4个独立通道(TIMx_CH1-4)输入捕获、输出比较、PWM生成、单脉冲模式输出
4、可使用外部信号控制定时器和定时器互连(可用1个定时器控制另外一个定时器)
2、如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器)
1、更新,计数器溢出,计数器初始化
2、触发事件
3、输入捕获
4、输出比较
5、支持针对定位的增量编码器和霍尔传感器电路
6、触发输入作为外部时钟或者按周期的电流管理

这里写图片描述

这里写图片描述

三种计数器模式:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

/*****************************************/
PWM波
PWM是指脉冲宽度调制,“Pulse Width Modulation”,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制。
这里写图片描述
STM32F4的定时器除了TIM6和TIM7,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出,而通用定时器也能同时产生多达4路的PWM输出,这里我们仅用TIM14的CH1产生一路PWM输出。
这里写图片描述

1 0
原创粉丝点击