实现按键按下(低电平)检测到下降沿

按照流程进行编程

步骤1:

初始化函数

包括时基工作参数配置 输入通道配置 更新中断使能 使能捕获、捕获中断及计数器

HAL_TIM_IC_Init(&ic_handle) //时基参数配置

HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2) //输入通道配置

包括ICPolarity ICSelection ICPrescaler ICFilter 四种参数的设置 极性(初始设置检测下降沿还是上升沿) 定时器直接来接到输入捕获通道(映射) 分频 滤波

__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE); //更新中断使能

HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2); /使能捕获 捕获中断 及计数器

步骤2:

msp初始化 包括 定时器时钟 GPIO NVIC

步骤3:

中断服务函数,定时器2中断TIM2_IRQHandler(void) 要包含公共服务函数HAL_TIM_IRQHandler(&ic_handle)

步骤4:

回调函数 HAL_TIM_IC_CaptureCallback (TIM_HandleTypeDef *htim) 回调函数中 写你想要的代码

cs 复制代码
#include "ic.h"
#include "stdint.h"
#include "stdio.h"


TIM_HandleTypeDef ic_handle={0};

void ic_init(uint16_t arr,uint16_t psc)
{
    TIM_IC_InitTypeDef ic_config ={0};
    ic_handle.Instance = TIM2;
    ic_handle.Init.Period = arr;
    ic_handle.Init.CounterMode =TIM_COUNTERMODE_UP;
    ic_handle.Init.Prescaler = psc;
    HAL_TIM_IC_Init(&ic_handle);                       //时基工作参数配置
    
    
    ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;     //选择极性   刚开始捕获的是下降沿 故选择下降沿的模式
    ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;  //定时器2被直接连接到相应的输入捕获通道
    ic_config.ICPrescaler = TIM_ICPSC_DIV1;            //默认不分频
    ic_config.ICFilter =0;                            //滤不滤波   不滤波设置为0
    HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);       //输入通道的配置   捕获的边沿   映射   分频   滤波
    __HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);   //更新中断使能   第二个参数为更新中断的模式
    HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);  //使能捕获 捕获中断及计数器
   
}

void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{

    if(htim->Instance == TIM2)
    {
     //①定义初始化结构体
    GPIO_InitTypeDef gpio_initstruct;
       //打开时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();   //打开GPIO的时钟
    __HAL_RCC_TIM2_CLK_ENABLE();  //打开定时器的时钟
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_1 ;                         //LED1、LED2对应的引脚
    gpio_initstruct.Pull = GPIO_PULLUP;                        //上拉   
    gpio_initstruct.Mode =GPIO_MODE_INPUT;                //推挽复用输出
    gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;              //高速
    HAL_GPIO_Init(GPIOA,&gpio_initstruct);
    HAL_NVIC_SetPriority(TIM2_IRQn, 2,2);           //设置NVIC
    HAL_NVIC_EnableIRQ(TIM2_IRQn);                  //设置NVIC               
        
        
    }
}


void TIM2_IRQHandler(void)
{

    HAL_TIM_IRQHandler(&ic_handle);
    
}
void HAL_TIM_IC_CaptureCallback (TIM_HandleTypeDef *htim)
{
    printf("捕获到下降沿\r\n");

}

主函数:

cs 复制代码
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"


int main(void) {
    HAL_Init();
    stm32_clock_init(RCC_PLL_MUL9);  // 设置时钟,72MHz
    led_init();
    uart1_init(115200);  // 初始化 UART
    
    printf("hello world!\r\n");  // 通过 UART 输出 "hello world"
    ic_init(65536-1,72-1);
    while(1) {
        led1_on();
        led2_off();
        delay_ms(500);
        led1_toggle();
        led2_toggle();
        delay_ms(500);
    }
}

最终显示结果

相关推荐
dlwlrma_5162 小时前
NUCLEO-G0B1RE STM32G0B1RET6的学习(1)——STM32CubeIDE的安装、新建工程和配置硬件SPI
stm32
三品吉他手会点灯3 小时前
stm32f103学习笔记-16-RCC(第2节)-讲解系统时钟配置函数SetSysClockTo72()
笔记·stm32·单片机·嵌入式硬件·学习
范纹杉想快点毕业3 小时前
100道关于STM32的问题解答共十万字回答,适用入门嵌入式软件初级工程师,筑牢基础,技术积累,校招面试。
驱动开发·单片机·嵌入式硬件·fpga开发·硬件工程
国科安芯5 小时前
多输出电压条件下同步整流效率测试与优化
网络·单片机·嵌入式硬件·安全
李宥小哥6 小时前
创建型设计模式1
stm32·嵌入式硬件·设计模式
std860216 小时前
嵌入式软件与单片机的核心技术与应用
单片机·嵌入式硬件
Shylock_Mister7 小时前
弱函数:嵌入式回调的最佳实践
c语言·单片机·嵌入式硬件·物联网
bbxyliyang7 小时前
基于430单片机多用途定时提醒器设计
单片机·嵌入式硬件·51单片机
d111111111d7 小时前
STM32外设学习-ADC模数转换器(代码部分)四个模块,光敏,热敏,电位,反射式红外。
笔记·stm32·单片机·嵌入式硬件·学习
范纹杉想快点毕业7 小时前
STM32百问百答:从硬件到软件全面解析
单片机·嵌入式硬件