OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 493|回复: 0

H743输入捕获+DMA调试不通

[复制链接]

1

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2024-6-12
在线时间
14 小时
发表于 2024-7-19 16:37:41 | 显示全部楼层 |阅读模式
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中断,感觉是配置出了问题,希望大家可以帮我看看

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 12:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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