硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7519|回复: 23
收起左侧

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

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2019-1-30 10:32:55 | 显示全部楼层 |阅读模式
这个高的频率不可以再使用中断方式,要使用DMA方式。
信号发生器输出12MHz的方波,引脚使用TIM1的PA10输入捕获
2222222.jpg

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




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2019-1-30 11:00:50 | 显示全部楼层
到13MHz的时候,采集双边沿已经不行了:

统计成了12.4MHz左右
QQ截图20190130110243.jpg

回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-1-30 22:39:25 | 显示全部楼层
有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2019-1-31 00:24:41 | 显示全部楼层
Tresordie 发表于 2019-1-30 22:39
有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧!

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

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-1-31 09:01:34 来自手机 | 显示全部楼层
手机版上论坛,效果不错。这性能不错哦
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2019-1-31 17:20:53 | 显示全部楼层
这里说的DMA方式是直接查询捕获寄存器吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2019-2-1 00:43:22 | 显示全部楼层
taobaofarmer 发表于 2019-1-31 17:20
这里说的DMA方式是直接查询捕获寄存器吗?

定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。
回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-2-1 17:05:54 | 显示全部楼层
eric2013 发表于 2019-2-1 00:43
定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2019-2-1 18:11:04 | 显示全部楼层
Tresordie 发表于 2019-2-1 17:05
应该是边沿触发了200次,你才输出一个方波吧?还是触发了100次,你的输出电平翻转一次?

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

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-2-14 14:19:22 | 显示全部楼层
eric2013 发表于 2019-2-1 18:11
一次触发一次DMA传输,100次为一轮,一轮后翻转一次IO,翻转2次是一个周期。

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

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-11-26 17:11:20 | 显示全部楼层
h7 发挥到极致啊
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2020-12-20 11:45:28 | 显示全部楼层
请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧,谢谢!
//定义数组
ALIGN_32BYTES( uint32_t buf[LEN]) = {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[TIM_DMA_ID_CC1], s_DMA_TIM3_CH1);
   
    HAL_DMA_Init( TimHandle.hdma[TIM_DMA_ID_CC1] );
//    /* 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 */
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2020-12-20 21:55:57 | 显示全部楼层
gallop020142 发表于 2020-12-20 11:45
请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧, ...

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

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-12-20 01:39:00 | 显示全部楼层
学习下,感谢楼主。
回复

使用道具 举报

4

主题

139

回帖

151

积分

初级会员

积分
151
发表于 2021-12-20 09:13:46 | 显示全部楼层
硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2021-12-20 09:14:17 | 显示全部楼层
浴火重生 发表于 2021-12-20 09:13
硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行

没有整理。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2022-4-12 09:43:06 来自手机 | 显示全部楼层
硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路信号的上升沿和下降沿进行补获,捕获后触发DMA,写CR1寄存器(主要为了修改DIR位),始终保持定时器使能,但是DMA只触发了一次,不知道为什么,请教一下!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-4-12 09:55:03 | 显示全部楼层
konan_sama 发表于 2022-4-12 09:43
硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路 ...

不清楚。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-9-6 13:36:30 | 显示全部楼层
硬汉大哥 有输入捕获+DMA传输的例子吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-9-7 01:45:16 | 显示全部楼层
weizheng115 发表于 2022-9-6 13:36
硬汉大哥 有输入捕获+DMA传输的例子吗

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

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 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啊,滤波计算与这里会有关么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2024-1-5 08:32:35 | 显示全部楼层
pisces 发表于 2024-1-4 16:25
你好,请问 使用外部时钟选择TIMER_SMCFG_TRGSEL_CI0FE0 时 , 以H7为例,
1、滤波的时间应该如何计算啊
...

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

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-8 23:30:52 | 显示全部楼层
准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2024-1-9 08:58:01 | 显示全部楼层
Edmund1964 发表于 2024-1-8 23:30
准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。

这个没有再使用中断了,使用的DMA玩法,而且DMA双缓冲。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 09:06 , Processed in 0.298050 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表