eric2013 发表于 2019-1-30 10:32:55

STM32H7的定时器输入捕获可以实现12MHz方波的双边沿捕获,单边沿可以做到24MHz

这个高的频率不可以再使用中断方式,要使用DMA方式。
信号发生器输出12MHz的方波,引脚使用TIM1的PA10输入捕获


DMA捕获100次输出一次IO翻转,由于是双边沿检测,正常应该输出120KHz方波才对。
下面是DMA的半传输完成中断和传输完成中断输出的方波,都是120KHz





eric2013 发表于 2019-1-30 11:00:50

到13MHz的时候,采集双边沿已经不行了:

统计成了12.4MHz左右


Tresordie 发表于 2019-1-30 22:39:25

有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧!

eric2013 发表于 2019-1-31 00:24:41

Tresordie 发表于 2019-1-30 22:39
有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧!

翻转两次输出一个周期波形

byccc 发表于 2019-1-31 09:01:34

手机版上论坛,效果不错。这性能不错哦

taobaofarmer 发表于 2019-1-31 17:20:53

这里说的DMA方式是直接查询捕获寄存器吗?

eric2013 发表于 2019-2-1 00:43:22

taobaofarmer 发表于 2019-1-31 17:20
这里说的DMA方式是直接查询捕获寄存器吗?
定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。

Tresordie 发表于 2019-2-1 17:05:54

eric2013 发表于 2019-2-1 00:43
定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。

应该是边沿触发了200次,你才输出一个方波吧?还是触发了100次,你的输出电平翻转一次?

eric2013 发表于 2019-2-1 18:11:04

Tresordie 发表于 2019-2-1 17:05
应该是边沿触发了200次,你才输出一个方波吧?还是触发了100次,你的输出电平翻转一次?

一次触发一次DMA传输,100次为一轮,一轮后翻转一次IO,翻转2次是一个周期。

Tresordie 发表于 2019-2-14 14:19:22

eric2013 发表于 2019-2-1 18:11
一次触发一次DMA传输,100次为一轮,一轮后翻转一次IO,翻转2次是一个周期。

哦,确实触发200次,出现一个周期方波!

hpdell 发表于 2019-11-26 17:11:20

h7 发挥到极致啊

gallop020142 发表于 2020-12-20 11:45:28

请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧,谢谢!
//定义数组
ALIGN_32BYTES( uint32_t buf) = {0};

    /* Clean Data Cache to update the content of the SRAM to be used by the DMA */
    SCB_CleanDCache_by_Addr( ( uint32_t * ) buf, sizeof( buf) );
//启用DMA
    if(HAL_TIM_IC_Start_DMA(&TimHandle, TIM_CHANNEL_1, (uint32_t*)buf, LEN) != HAL_OK)
    {
      Error_Handler(__FILE__, __LINE__);
    }   

//具体配置下(TIM3 CH1):

    //开启时钟
    TIMx_GPIO_CLK_ENABLE();
   
    //配置引脚
    /* Configure(TIMx_Channel) in Alternate function, push-pull and high speed */
    GPIO_InitStruct.Pin= TIMx_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = TIMx_GPIO_AF;
    HAL_GPIO_Init( TIMx_GPIO_PORT, &GPIO_InitStruct );

TIMx_CLK_ENABLE();   
    TimHandle.Instance               = TIMx;   
    TimHandle.Init.Period            = 0xFFFF;
    TimHandle.Init.Prescaler         = 19;
    TimHandle.Init.ClockDivision   = TIM_CLOCKDIVISION_DIV1;
    TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
    TimHandle.Init.RepetitionCounter = 0;
    if( HAL_TIM_IC_Init( &TimHandle ) != HAL_OK )
    {
      Error_Handler(__FILE__, __LINE__);
    }
   
    /*##-2- Configure the Input Capture channel ################################*/
    /* Configure the Input Capture of channel 1 */
    s_ICConfig.ICPolarity= TIM_ICPOLARITY_RISING;
    s_ICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
    s_ICConfig.ICPrescaler = TIM_ICPSC_DIV1;
    s_ICConfig.ICFilter    = 0;
    if( HAL_TIM_IC_ConfigChannel( &TimHandle, &s_ICConfig, TIM_CHANNEL_1 ) != HAL_OK )
    {
      Error_Handler(__FILE__, __LINE__);
    }


/* DMA controller clock enable */
    __HAL_RCC_DMA1_CLK_ENABLE();   
    s_DMA_TIM3_CH1.Instance   = DMA1_Stream0;
    s_DMA_TIM3_CH1.Init.Request = DMA_REQUEST_TIM3_CH1;
    s_DMA_TIM3_CH1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    s_DMA_TIM3_CH1.Init.PeriphInc = DMA_PINC_DISABLE;
    s_DMA_TIM3_CH1.Init.MemInc    = DMA_MINC_ENABLE;
    s_DMA_TIM3_CH1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    s_DMA_TIM3_CH1.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
    s_DMA_TIM3_CH1.Init.Mode   = DMA_CIRCULAR;
    s_DMA_TIM3_CH1.Init.Priority = DMA_PRIORITY_LOW;
    s_DMA_TIM3_CH1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

    __HAL_LINKDMA(&TimHandle, hdma, s_DMA_TIM3_CH1);
   
    HAL_DMA_Init( TimHandle.hdma );
//    /* DMA interrupt init */
//    /* DMA1_Stream0_IRQn interrupt configuration */
    HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 4);
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);



void DMA1_Stream0_IRQHandler(void)
{
    /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */
   
    /* USER CODE END DMA1_Stream0_IRQn 0 */
    HAL_DMA_IRQHandler(&s_DMA_TIM3_CH1);
    /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */

    /* USER CODE END DMA1_Stream0_IRQn 1 */
}

eric2013 发表于 2020-12-20 21:55:57

gallop020142 发表于 2020-12-20 11:45
请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧, ...

不使用DMA,你这个代码整正常捕获不

steven789 发表于 2021-12-20 01:39:00

学习下,感谢楼主。

浴火重生 发表于 2021-12-20 09:13:46

硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行

eric2013 发表于 2021-12-20 09:14:17

浴火重生 发表于 2021-12-20 09:13
硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行

没有整理。

konan_sama 发表于 2022-4-12 09:43:06

硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路信号的上升沿和下降沿进行补获,捕获后触发DMA,写CR1寄存器(主要为了修改DIR位),始终保持定时器使能,但是DMA只触发了一次,不知道为什么,请教一下!

eric2013 发表于 2022-4-12 09:55:03

konan_sama 发表于 2022-4-12 09:43
硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路 ...

不清楚。

weizheng115 发表于 2022-9-6 13:36:30

硬汉大哥 有输入捕获+DMA传输的例子吗

eric2013 发表于 2022-9-7 01:45:16

weizheng115 发表于 2022-9-6 13:36
硬汉大哥 有输入捕获+DMA传输的例子吗

有点失误,制作玩这个例子后,我没即使分享,现在再找,不好找到了。
修改方法就是在官方输入捕获的例子基础上(例子在STM32CubeH7软件包里面),添加DMA实现。

pisces 发表于 2024-1-4 16:25:08

你好,请问 使用外部时钟选择TIMER_SMCFG_TRGSEL_CI0FE0 时 , 以H7为例,
1、滤波的时间应该如何计算啊
2、timer_initpara.prescaler         = n;如果采用外部时钟, 是不是 这里设置时 滤波用不到,一直以300m进行滤波时间计算
3、 timer_icinitpara.icfilter这个参数的意义是什么,只是采样个数进行/2 或/4或/8啊,滤波计算与这里会有关么

eric2013 发表于 2024-1-5 08:32:35

pisces 发表于 2024-1-4 16:25
你好,请问 使用外部时钟选择TIMER_SMCFG_TRGSEL_CI0FE0 时 , 以H7为例,
1、滤波的时间应该如何计算啊
...

这个滤波时间好像我没有管这个,这个参数没什么印象了。

Edmund1964 发表于 2024-1-8 23:30:52

准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。

eric2013 发表于 2024-1-9 08:58:01

Edmund1964 发表于 2024-1-8 23:30
准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。

这个没有再使用中断了,使用的DMA玩法,而且DMA双缓冲。
页: [1]
查看完整版本: STM32H7的定时器输入捕获可以实现12MHz方波的双边沿捕获,单边沿可以做到24MHz