您的位置:首页 > 其它

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

2016-08-25 20:16 369 查看
/[b]*********************[/b]/

外部中断:

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_APB2Per
4000
iphClockCmd(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、触发输入作为外部时钟或者按周期的电流管理





三种计数器模式:









/[b]*****************************************[/b]/

PWM波

PWM是指脉冲宽度调制,“Pulse Width Modulation”,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制。



STM32F4的定时器除了TIM6和TIM7,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出,而通用定时器也能同时产生多达4路的PWM输出,这里我们仅用TIM14的CH1产生一路PWM输出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: