• stm32单片机测量外部脉冲宽度


    stm32单片机测量外部脉冲宽度

    在STM32上测量外部脉冲的宽度,我们可以使用定时器(TIM)的输入捕获模式。以下是一个示例,它使用STM32的HAL库和TIM2来测量脉冲宽度。

    1)首先,确保在stm32f4xx_hal_conf.h或相应的HAL配置文件中启用了TIM2和相关外设的HAL模块。

    #define HAL_TIM_MODULE_ENABLED  
    #define HAL_GPIO_MODULE_ENABLED
    
    • 1
    • 2

    2)然后,在主程序文件中,我们需要配置TIM2和相关的GPIO。

    #include "stm32f4xx_hal.h"  
      
    TIM_HandleTypeDef htim2;  
    GPIO_TypeDef* GPIO_Port;  
      
    void SystemClock_Config(void);  
    void GPIO_Init(void);  
    void TIM2_Init(void);  
      
    int main(void)  
    {  
      HAL_Init();  
      SystemClock_Config();  
      GPIO_Init();  
      TIM2_Init();  
        
      while (1)  
      {  
        // 此处添加代码以处理测量结果或进行其他操作  
        HAL_Delay(100); // 暂停100毫秒,仅用于演示  
      }  
    }  
      
    void SystemClock_Config(void)  
    {  
      // 请根据硬件配置和所需时钟频率进行相应的设置  
    }  
      
    void GPIO_Init(void)  
    {  
      GPIO_Port = GPIOA; // 根据硬件连接选择正确的GPIO端口  
        
      __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能所选GPIO端口的时钟  
        
      __HAL_GPIO_PIN_CONFIG(GPIO_Port, GPIO_PIN_x, GPIO_MODE_INPUT); // 将所选引脚设置为输入模式,其中GPIO_PIN_x是所连接的引脚编号  
    }  
      
    void TIM2_Init(void)  
    {  
      __HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2的时钟  
        
      htim2.Instance = TIM2; // 使用TIM2  
      htim2.Init.Prescaler = 8399; // 配置预分频值,这里我们设置为8400-1,以获取1MHz的计数频率(假设系统时钟为72MHz)  
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式  
      htim2.Init.Period = 999; // 配置自动重装载值,这里我们设置为1000-1,以在每个计数周期结束时触发中断  
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 配置时钟分频因子,这里我们不进行分频  
      htim2.Init.RepetitionCounter = 0; // 配置重复计数器,这里我们不用重复计数功能  
      HAL_TIM_Base_Init(&htim2); // 初始化TIM2的基本参数  
      HAL_TIM_IC_Init(&htim2); // 初始化TIM2的输入捕获模式  
      HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); // 配置中断优先级,这里我们设置为最高优先级  
      HAL_NVIC_EnableIRQ(TIM2_IRQn); // 使能TIM2的中断请求  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    3)最后,我们需要在中断处理程序中读取输入捕获的值,并计算脉冲宽度。在stm32f4xx_hal.h或相应的HAL配置文件中找到HAL_TIM_PeriodElapsedCallback函数的原型,然后添加以下代码。

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  
    {  
      if (htim->Instance == htim2.Instance) // 确保是TIM2的中断请求  
      {  
        uint32_t capture = __HAL_TIM_GET_IC2(&htim2); // 读取输入捕获寄存器的值,这里假设我们使用IC2通道,根据硬件连接选择正确的通道  
        uint32_t pulseWidth = capture - htim2.Instance->CCR2; // 计算脉冲宽度,CCR2是输入捕获的比较值寄存器,用于存储上一个捕获周期的值  
        // 此处添加代码以处理脉冲宽度或进行其他操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    5-Dubbo架构设计与底层原理-服务导出源码分析(中)
    云计算正当时!将你的Java项目容器化
    推荐!十个平台工程工具助力开发人员提升效率和体验
    主辅助服务市场出清模型研究【旋转备用】(Matlab代码实现)
    ChatGPT在电子健康记录和医疗信息查询中的应用前景如何?
    Rust常见集合
    MacBook Pro的touchbar疯狂闪烁 通过写程序不断点亮touchbar,从而避免其闪烁
    docker容器里面的java进程内存泄露排查
    前端作业(17)
    闲鱼面试:说说JWT工作原理?
  • 原文地址:https://blog.csdn.net/techenliu/article/details/132910783