CH32定时器双边沿捕获

     看原子的stm32脉冲捕获demo好像是在中断中来回切换触发方式(上升沿与下降沿),CH32可以不用切换用两个通道去捕获一个引脚。此两个通道可以一个设为上升沿一个设为下降沿实现。

一、先附上ch32V307的datasheet的说明:

14.3.1 输入捕获模式

1) 配置 CCxS 域,选择 ICx 信号的来源。比如设为 10b,选择 TI1FP1 作为 IC1 的来源,而不可以使用默认设置,CCxS 域默认是使比较捕获模块作为输出通道;
2) 配置 ICxF 域,设定 TI 信号的数字滤波器。数字滤波器会以确定的频率,采样确定的次数,再输出一个跳变。这个采样频率和次数是通过 ICxF 来确定的;
3) 配置 CCxP 位,设定 TIxFPx 的极性。比如保持 CC1P 位为低,选择上升沿跳变;
4) 配置 ICxPS 域,设定 ICx 信号成为 ICxPS 之间的分频系数。比如保持 ICxPS 为 00b,不分频
5) 配置 CCxE 位,允许捕获核心计数器(CNT)的值到比较捕获寄存器中。置 CC1E 位;
6) 根据需要配置 CCxIE 和 CCxDE 位,决定是否允许使能中断或 DMA。

14.3.4 PWM 输入模式
      PWM 输入模式是用来测量 PWM 的占空比和频率的,是输入捕获模式的一种特殊情况。除下列区别外,操作和输入捕获模式相同:PWM 占用两个比较捕获通道,且两个通道的输入极性设为相反,其中一个信号被设为触发输入,SMS 设为复位模式。
例如,测量从 TI1 输入的 PWM 波

<think>好的,我现在需要帮助用户了解如何配置和使用STM32定时器的输入捕获功能。首先,我得回忆一下自己之前学过的相关知识,同时结合用户提供的三个引用内容来组织回答。 用户的问题是关于输入捕获的使用教程和配置示例,所以需要分步骤说明,结构要清晰。首先,我应该从基本的作用和工作流程开始,这样用户能有一个整体的认识。根据引用[1],输入捕获用于测量信号的频率或周期,而引用[3]提到还可以测量占空比等参数。这部分需要简明扼要地介绍。 接下来是硬件配置,引用[2]提到需要选择合适的微控制器和连接信号源到定时器通道,可能需要使用引脚复用功能。这里需要说明具体的步骤,比如如何选择定时器、配置GPIO引脚,以及时钟设置。这部分可能需要参考STM32的标准库函数,例如GPIO_Init和TIM_TimeBaseInit等。 然后是输入捕获的配置,引用[3]详细说明了输入捕获模式下的工作方式,比如边沿检测、捕获CCR值等。需要分步骤说明如何配置通道为输入捕获模式,设置极性(上升沿或下降沿),使能中断等。同时,用户可能需要知道如何编写中断服务函数来处理捕获事件,计算频率或占空比。 示例代码部分很重要,用户可能希望看到实际的代码片段,这样更容易理解。我需要确保代码结构正确,比如初始化函数、中断处理函数,以及主函数中的调用。代码中要使用标准库的函数,比如TIM_ICInit结构体配置输入捕获参数,NVIC配置中断优先级等。 此外,用户可能关心如何测量PWM的频率和占空比,引用[3]提到PWMI模式,这里可能需要说明如何配置两个通道(如TI1和TI2)分别捕获上升沿和下降沿,从而计算占空比。但根据用户的问题,可能先给出一个基本的频率测量示例,再扩展到占空比会更合适。 最后,生成的相关问题需要覆盖用户可能进一步询问的方向,比如高级模式、误差处理、应用场景等。这样可以帮助用户深入学习和解决问题。 在检查过程中,要确保所有的LaTeX公式都用$...$格式,比如频率公式$f = \frac{1}{T}$。独立公式如占空比计算需要用$$...$$,但根据示例中的要求,可能不需要太多独立公式,除非必要。同时,引用标识要正确添加在对应的段落末尾,例如关于硬件配置的部分引用[2],输入捕获模式引用[3]等。 需要确保回答结构清晰,步骤分明,代码示例正确,并且相关引用正确标注。可能还需要提醒用户参考数据手册和标准库文档,以确保配置符合具体的STM32型号和库版本。</think>### STM32定时器输入捕获功能配置教程 #### 一、输入捕获功能作用 输入捕获功能用于测量外部信号的$T$(周期)、$f$(频率)、占空比等参数。当检测到指定电平跳变(如上升沿/下降沿)时,定时器的当前计数器值$CNT$会锁存到捕获/比较寄存器$CCR$中[^3]。 #### 二、硬件配置步骤 1. **选择定时器与通道** - 选择支持输入捕获定时器(如TIM2-TIM5) - 确定物理引脚(如TIM2_CH1对应PA0引脚) - 通过GPIO复用功能连接信号源[^2] 2. **时钟配置** ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ``` 3. **GPIO初始化** ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` #### 三、定时器配置流程 1. **时基单元初始化** ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 72MHz/72=1MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ``` 2. **输入捕获通道配置** ```c TIM_ICInitTypeDef TIM_ICInitStructure; 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 = 0x0; // 无滤波 TIM_ICInit(TIM2, &TIM_ICInitStructure); ``` 3. **中断配置** ```c TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); // 使能捕获中断 NVIC_EnableIRQ(TIM2_IRQn); // 使能定时器中断 ``` #### 四、测量频率示例代码 ```c volatile uint32_t capture1, capture2; volatile uint8_t capture_flag = 0; void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { if(capture_flag == 0) { capture1 = TIM_GetCapture1(TIM2); capture_flag = 1; } else { capture2 = TIM_GetCapture1(TIM2); uint32_t period = (capture2 > capture1) ? (capture2 - capture1) : (0xFFFF - capture1 + capture2); float frequency = 1000000.0 / period; // 时基1MHz capture_flag = 0; } TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } } ``` #### 五、关键参数说明 - **预分频器**:决定时基分辨率,例如72分频后$1\mu s$计数 - **滤波器**:可设置$0-15$级数字滤波,消除信号抖动 - **捕获极性**:支持上升沿/下降沿/双边沿触发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值