STM32H7的定时器输入捕获可以实现12MHz方波的双边沿捕获,单边沿可以做到24MHz
这个高的频率不可以再使用中断方式,要使用DMA方式。信号发生器输出12MHz的方波,引脚使用TIM1的PA10输入捕获
DMA捕获100次输出一次IO翻转,由于是双边沿检测,正常应该输出120KHz方波才对。
下面是DMA的半传输完成中断和传输完成中断输出的方波,都是120KHz
到13MHz的时候,采集双边沿已经不行了:
统计成了12.4MHz左右
有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧! Tresordie 发表于 2019-1-30 22:39
有个问题, 双边沿检测,示波器检测到的应该是240KHz才对应12M吧!
翻转两次输出一个周期波形 手机版上论坛,效果不错。这性能不错哦 这里说的DMA方式是直接查询捕获寄存器吗? taobaofarmer 发表于 2019-1-31 17:20
这里说的DMA方式是直接查询捕获寄存器吗?
定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。 eric2013 发表于 2019-2-1 00:43
定时器的CCR寄存器捕获到数据就会触发DMA传输,配置的是传输100次为一轮。
应该是边沿触发了200次,你才输出一个方波吧?还是触发了100次,你的输出电平翻转一次? Tresordie 发表于 2019-2-1 17:05
应该是边沿触发了200次,你才输出一个方波吧?还是触发了100次,你的输出电平翻转一次?
一次触发一次DMA传输,100次为一轮,一轮后翻转一次IO,翻转2次是一个周期。 eric2013 发表于 2019-2-1 18:11
一次触发一次DMA传输,100次为一轮,一轮后翻转一次IO,翻转2次是一个周期。
哦,确实触发200次,出现一个周期方波! h7 发挥到极致啊 请教硬汉兄弟,我想用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 */
}
gallop020142 发表于 2020-12-20 11:45
请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧, ...
不使用DMA,你这个代码整正常捕获不 学习下,感谢楼主。 硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行 浴火重生 发表于 2021-12-20 09:13
硬汉老师,有参考配置程序吗,我之前试过只有中断才起作用,DMA捕获不行
没有整理。 硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路信号的上升沿和下降沿进行补获,捕获后触发DMA,写CR1寄存器(主要为了修改DIR位),始终保持定时器使能,但是DMA只触发了一次,不知道为什么,请教一下! konan_sama 发表于 2022-4-12 09:43
硬汉你好,我将TIM2配置成为外部时钟模式1,CH1做外部时钟输入,CH3和CH4配置为输入捕获模式,分别对同一路 ...
不清楚。 硬汉大哥 有输入捕获+DMA传输的例子吗 weizheng115 发表于 2022-9-6 13:36
硬汉大哥 有输入捕获+DMA传输的例子吗
有点失误,制作玩这个例子后,我没即使分享,现在再找,不好找到了。
修改方法就是在官方输入捕获的例子基础上(例子在STM32CubeH7软件包里面),添加DMA实现。 你好,请问 使用外部时钟选择TIMER_SMCFG_TRGSEL_CI0FE0 时 , 以H7为例,
1、滤波的时间应该如何计算啊
2、timer_initpara.prescaler = n;如果采用外部时钟, 是不是 这里设置时 滤波用不到,一直以300m进行滤波时间计算
3、 timer_icinitpara.icfilter这个参数的意义是什么,只是采样个数进行/2 或/4或/8啊,滤波计算与这里会有关么 pisces 发表于 2024-1-4 16:25
你好,请问 使用外部时钟选择TIMER_SMCFG_TRGSEL_CI0FE0 时 , 以H7为例,
1、滤波的时间应该如何计算啊
...
这个滤波时间好像我没有管这个,这个参数没什么印象了。 准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。 Edmund1964 发表于 2024-1-8 23:30
准确来说不是Capture不到13MHz, 而是中断中处理数据的时间过长。
这个没有再使用中断了,使用的DMA玩法,而且DMA双缓冲。
页:
[1]