方式1:TIM+EXTI
此方式需要频繁中断,占用CPU资源,不适合高频场合;
main.c:
#include "stm32f4xx.h" // Device header
#include "serial.h"
#include "delay.h"
#include "tim.h"
#include "exti.h"
extern uint16_t count;
uint16_t exti_count;
uint16_t speed_value;
int main(void)
{
Serial_Init();
TIM_Init();
EXTI_InitFunc();
printf("123success");
while (1)
{
printf("speed_value=%d\r\n",speed_value);
exti_count=0;
}
}
void TIM3_IRQHandler(){
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET){
speed_value=exti_count;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
void EXTI1_IRQHandler(){
if(EXTI_GetITStatus(EXTI_Line1)==SET){
exti_count++;
}
EXTI_ClearITPendingBit(EXTI_Line1);
}
TIM.c:
#include "stm32f4xx.h" // Device header
#define PSC 1680-1
uint16_t count=0;
void TIM_Init(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitTypeDef TimeBaseInitStructure;
TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TimeBaseInitStructure.TIM_Period=100-1;
TimeBaseInitStructure.TIM_Prescaler=PSC;
TIM_TimeBaseInit(TIM3,&TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//深入理解
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//关联TIM3与NVIC
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);
}
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
关联TIM3与NVIC,TIM3 产生中断时,NVIC就知道需要交给EXTI1_IRQHandler()处理中断
EXTI.c:
#include "stm32f4xx.h" // Device header
void EXTI_InitFunc(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_EXTIT,ENABLE);不需要此设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//EXTI需要使用SYSCFG时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource1);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line1;//如何选择
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
}
注意:SYSCFG负责为外部中断(EXTI)提供配置选项,因此在配置外部中断时,需要先使能SYSCFG的时钟;