|
发表于 2020-12-5 14:38:42
|
显示全部楼层
我详细说一下我这个需求和代码实现,硬汉兄有空就帮我看一下,
需求:检测输入脉冲的频率。
实现:通过stm32f407的PA11(TIM1_CH4),输入捕获获得CCR4的数值,使用DMA方式。
代码:
TIM_HandleTypeDef TIM_PWMINPUT_Handle;
DMA_HandleTypeDef TIM_DMA_Handle;
uint32_t IC4_value[2]={0,0};//读取CCR4寄存器的值
//输入捕获引脚配置
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__GPIOA_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_11;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*定时器模式设置*/
static void TIM_PWMINPUT_Config(void)
{
TIM_IC_InitTypeDef TIM_ICInitStructure;
TIM_SlaveConfigTypeDef TIM_SlaveConfigStructure;
__TIM1_CLK_ENABLE();
TIM_PWMINPUT_Handle.Instance = TIM1;
TIM_PWMINPUT_Handle.Init.Period = 0xFFFF;
// 高级控制定时器时钟源 TIMxCLK = HCLK=168MHz
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=1MHz
TIM_PWMINPUT_Handle.Init.Prescaler = 168 - 1;
TIM_PWMINPUT_Handle.Init.ClockDivision = 0;
TIM_PWMINPUT_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_IC_Init(&TIM_PWMINPUT_Handle);
TIM_ICInitStructure.ICPolarity = TIM_ICPOLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.ICFilter = 0x0;
HAL_TIM_IC_ConfigChannel(&TIM_PWMINPUT_Handle, &TIM_ICInitStructure, TIM_CHANNEL_4);
// HAL_TIM_IC_Start_IT(&TIM_PWMINPUT_Handle, TIM_CHANNEL_4);
}
/*DMA传输完成回调函数*/
void dma_tra_complete(DMA_HandleTypeDef *_hdma)
{
LOG_D("transfer finish!");
}
//DMA配置
void tim_dma_config(void)
{
__DMA2_CLK_ENABLE();
TIM_DMA_Handle.Instance = DMA2_Stream4;
TIM_DMA_Handle.Init.Channel = DMA_CHANNEL_6;
TIM_DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
TIM_DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;
TIM_DMA_Handle.Init.MemInc = DMA_MINC_ENABLE;
TIM_DMA_Handle.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD;
TIM_DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
TIM_DMA_Handle.Init.Mode = DMA_CIRCULAR;
TIM_DMA_Handle.Init.Priority = DMA_PRIORITY_HIGH;
TIM_DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
TIM_DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
TIM_DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE;
TIM_DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE;
__HAL_LINKDMA(&TIM_PWMINPUT_Handle,hdma[TIM_DMA_ID_CC4], TIM_DMA_Handle);
/* 复位 DMA */
if(HAL_DMA_DeInit(&TIM_DMA_Handle) != HAL_OK)
{
LOG_E("HAL_DMA_DeInit error!");
}
/* 初始化 DMA */
if(HAL_DMA_Init(&TIM_DMA_Handle) != HAL_OK)
{
LOG_E("HAL_DMA_Init error!");
}
HAL_DMA_RegisterCallback(TIM_PWMINPUT_Handle.hdma[TIM_DMA_ID_CC4],HAL_DMA_XFER_M1CPLT_CB_ID,dma_tra_complete);
// HAL_DMA_Init(TIM_PWMINPUT_Handle.hdma[TIM_DMA_ID_CC4]);
/* 配置 DMA 中断 */
HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn);
/* 启动 DMA 传输 */
HAL_TIM_IC_Start_DMA(&TIM_PWMINPUT_Handle,TIM_CHANNEL_4,IC4_value,2);
}
//DMA中断
void DMA2_Stream4_IRQHandler(void)
{
HAL_DMA_IRQHandler(TIM_PWMINPUT_Handle.hdma[TIM_DMA_ID_CC4]);
}
//测试函数
void pwm_test(void)
{
TIMx_GPIO_Config();
TIM_PWMINPUT_Config();
tim_dma_config();
while (1)
{
LOG_D("IC4_value[0]:%d \n",IC4_value[0]);
LOG_D("IC4_value[1]:%d \n",IC4_value[1]);
rt_thread_mdelay(500);
}
}
运行程序后,打印的数据如图:IC4_value[1]一直为0,而且并没有进去DMA传输完成回调函数,请教大佬哪里有问题。抱拳。
|
-
|