zoukankan      html  css  js  c++  java
  • [STM32F103]PWM输入捕获配置

    l 初始化定时器和通道对应IO的时钟。

    l 初始化IO口,模式为输入:

      GPIO_Init();

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入

    l 初始化定时器ARR,PSC

      TIM_TimeBaseInit();

    l 初始化输入捕获通道

      TIM_ICInit();

    l 如果要开启捕获中断,

      TIM_ITConfig();

      NVIC_Init();

    l 使能定时器:

      TIM_Cmd();

    l 编写中断服务函数:

      TIMx_IRQHandler();

    l 源码:

    u8 TIM5CH1_CAPTURE_STA;
    u16 TIM5CH1_CAPTURE_VAL;
    void TIM5_Cap_Init(u16 arr, u16 psc)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
        NVIC_InitTypeDef    NVIC_InitStructure;
        TIM_ICInitTypeDef    TIM_ICInitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler = psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
        
        //捕获通道设置
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x00;
        TIM_ICInit(TIM5, &TIM_ICInitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&NVIC_InitStructure);
        
        TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1,ENABLE);
        TIM_Cmd(TIM5, ENABLE);
    }
    
    void TIM5_IRQHandler()
    {
        if((TIM5CH1_CAPTURE_STA & 0x80) == 0)
        {
            if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
            {
                if(TIM5CH1_CAPTURE_STA & 0x40)
                {
                    if((TIM5CH1_CAPTURE_STA & 0x3F) == 0x3F)
                    {
                        TIM5CH1_CAPTURE_STA |= 0x80;
                        TIM5CH1_CAPTURE_VAL = 0xffff;
                    }
                    else
                    {
                        TIM5CH1_CAPTURE_STA++;
                    }
                }    
            }
            
            if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
            {
                if(TIM5CH1_CAPTURE_STA & 0x40)
                {
                    TIM5CH1_CAPTURE_STA |= 0x80;
                    TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);
                    TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);
                }
                else
                {
                    TIM5CH1_CAPTURE_STA = 0;
                    TIM5CH1_CAPTURE_VAL = 0;
                    TIM_SetCounter(TIM5, 0);
                    TIM5CH1_CAPTURE_STA |= 0x40;
                    TIM_OC1PreloadConfig(TIM5, TIM_ICPolarity_Falling);
                }
            }
        }
        TIM_ClearITPendingBit(TIM5, TIM_IT_CC1 | TIM_IT_Update);
    }
    //main.c
    u32 temp = 0;
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        TIM5_Cap_Init(0xffff,72-1);
        uart_init(115200);
        while(1)
        {
            delay_ms(10);
            if(TIM5CH1_CAPTURE_STA & 0x80)
            {
                temp = TIM5CH1_CAPTURE_STA & 0x3f;
                temp *= 65536;
                temp += TIM5CH1_CAPTURE_VAL;
                printf("High:%d us
    ",temp);
                TIM5CH1_CAPTURE_STA = 0;
            }
        }
  • 相关阅读:
    关于控制地址控件的代码
    获取某个设计项列表界面上查询框中的值的代码
    js中不同值的替换
    js截取字符串方法实例
    抛异常语句的种类及区别
    从获取结果中去除重复记录
    泛微E8升级E9代码修改
    中控考勤数据转换
    WEB打印,分页首行自动带出栏目标题
    VS附加进程调试IIS网站
  • 原文地址:https://www.cnblogs.com/zhaohu/p/9975035.html
Copyright © 2011-2022 走看看