初级会员
- 积分
- 86
- 金钱
- 86
- 注册时间
- 2024-6-12
- 在线时间
- 14 小时
|
1金钱
有一个项目需要根据输入时钟的下降沿读取GPIO口的数据,就想用定时器的输入捕获触发DMA搬运数据。定时器和DMA的初始化代码如下
void gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc)
{
__HAL_RCC_DMA1_CLK_ENABLE();
g_timx_cap_chy_handle.Instance = GTIM_TIMX_CAP; /* 定时器x */
g_timx_cap_chy_handle.Init.Prescaler = psc; /* 预分频系数 */
g_timx_cap_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_cap_chy_handle.Init.Period = arr; /* 自动重装载值 */
HAL_TIM_IC_Init(&g_timx_cap_chy_handle); /* 初始化定时器 */
timx_ic_cap_chy.ICPolarity = TIM_ICPOLARITY_FALLING; /* 沿捕获 */
timx_ic_cap_chy.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上 */
timx_ic_cap_chy.ICPrescaler = TIM_ICPSC_DIV1; /* 配置输入分频,不分频 */
timx_ic_cap_chy.ICFilter = 0; /* 配置输入滤波器,不滤波 */
HAL_TIM_IC_ConfigChannel(&g_timx_cap_chy_handle, &timx_ic_cap_chy, GTIM_TIMX_CAP_CHY); /* 配置TIMx通道y */
/* 配置DMA A */
g_dma_tim_ch_a.Instance = DMA1_Stream1;
g_dma_tim_ch_a.Init.Direction = DMA_PERIPH_TO_MEMORY;
g_dma_tim_ch_a.Init.PeriphInc = DMA_PINC_DISABLE;
g_dma_tim_ch_a.Init.MemInc = DMA_MINC_ENABLE;
g_dma_tim_ch_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //16位
g_dma_tim_ch_a.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD; //16位
g_dma_tim_ch_a.Init.Mode = DMA_NORMAL; //普通模式
g_dma_tim_ch_a.Init.Priority = DMA_PRIORITY_LOW;
g_dma_tim_ch_a.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
g_dma_tim_ch_a.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
g_dma_tim_ch_a.Init.MemBurst = DMA_MBURST_SINGLE;
g_dma_tim_ch_a.Init.PeriphBurst = DMA_PBURST_SINGLE;
g_dma_tim_ch_a.Init.Request = DMA_REQUEST_TIM5_CH1;
HAL_DMA_Init(&g_dma_tim_ch_a);
__HAL_LINKDMA(&g_timx_cap_chy_handle, hdma[TIM_DMA_ID_CC1], g_dma_tim_ch_a); //连接句柄
/* 配置 DMA 中断 */
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
}
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP) /* 输入通道捕获 */
{
GPIO_InitTypeDef gpio_init_struct;
GTIM_TIMX_CAP_CHY_CLK_ENABLE(); /* 使能TIMx时钟 */
GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE(); /* 开启捕获IO的时钟 */
gpio_init_struct.Pin = GTIM_TIMX_CAP_CHY_GPIO_PIN; /* 输入捕获的GPIO口 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; /* 高速 */
gpio_init_struct.Alternate = GTIM_TIMX_CAP_CHY_GPIO_AF; /* 复用为捕获TIM5的通道1 */
HAL_GPIO_Init(GTIM_TIMX_CAP_CHY_GPIO_PORT, &gpio_init_struct); /* 初始化IO */
// HAL_NVIC_SetPriority(GTIM_TIMX_CAP_IRQn, 1, 3); /* 抢占1,子优先级3 */
// HAL_NVIC_EnableIRQ(GTIM_TIMX_CAP_IRQn); /* 开启ITMx中断 */
}
}
void TIM5_DMA_START_A(void)
{
TIM_CCxChannelCmd(TIM5, TIM_CHANNEL_1, TIM_CCx_ENABLE);
__HAL_TIM_ENABLE(&g_timx_cap_chy_handle);
__HAL_DMA_ENABLE(&g_dma_tim_ch_a);
/* 启动 DMA 传输 */
HAL_DMA_Start_IT(&g_dma_tim_ch_a, (uint32_t)TIM5->CCR1, (uint32_t)adc_a_data, 100);
}
单独调试输入捕获功能是没有问题的,加上触发DMA后就一直进不去DMA中断,感觉是配置出了问题,希望大家可以帮我看看
|
|