[stm32f407]测速

方式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的时钟;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值