首页 新闻 会员 周边

STM32 TIM下降沿触发DMA

0
悬赏园豆:15 [待解决问题]
static void GENERAL_TIM_Mode_Config(void)
{
        // 占空比配置
    uint16_t CCR1_Val = 5;
     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
;

  // 开启定时器时钟,即内部时钟CK_INT=72M
    GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
    // 配置周期,这里配置为100K
    
 
    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;    
    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;    
    // 时钟分频因子 ,配置死区时间时需要用到
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        
    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

    // 初始化定时器
    TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

    /*--------------------输出比较结构体初始化-------------------*/    
    
    // 配置为PWM模式1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    // 输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    // 输出通道电平极性配置    
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
    // 输出比较通道 3
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    
    /*--------------------输入捕获结构体初始化-------------------*/    
    
    // 配置输入捕获的通道,需要根据具体的GPIO来配置
    TIM_ICInitStructure.TIM_Channel = GENERAL_TIM_CHANNEL_x;
    // 输入捕获信号的极性配置
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    // 输入通道和捕获通道的映射关系,有直连和非直连两种
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    // 输入的需要被捕获的信号的分频系数
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    // 输入的需要被捕获的信号的滤波系数
    TIM_ICInitStructure.TIM_ICFilter = 0;
    // 定时器输入捕获初始化
    TIM_ICInit(GENERAL_TIM, &TIM_ICInitStructure);
    
    
    // 清除更新和捕获中断标志位
    TIM_ClearFlag(GENERAL_TIM, TIM_IT_CC1);    
    // 开启捕获中断  
    //TIM_ITConfig (GENERAL_TIM, TIM_IT_CC1, ENABLE );
    
    //使能计数器DMA
    TIM_DMACmd(GENERAL_TIM,TIM_DMA_CC1,ENABLE);
    TIM_DMAConfig(TIM5,TIM_DMABase_CCR1,TIM_DMABurstLength_1Transfer);
    
    // 使能计数器
    TIM_Cmd(GENERAL_TIM, ENABLE);
    
}

/**
  * @brief  配置DMA
  * @param  无
  * @retval 无
  */
void ADC_DMA_Config(void)
{    
    DMA_InitTypeDef  DMA_InitStructure;

    /* 使能DMA2时钟 */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
    
    /* 配置DMA2 */
  DMA_InitStructure.DMA_PeripheralBaseAddr = GPIOB_BASE+0X0008;                    //外设数据地址
  //DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)((&g_tAdcFifo)->sBuf);                //内存数据地址 g_tAdcFifo->sBuf
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)g_tAdcFifo.sBuf;                //内存数据地址 g_tAdcFifo->sBuf
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                            //数据传输方向GPIOB->IDR至内存
  DMA_InitStructure.DMA_BufferSize = ADC_FIFO_SIZE;                                    //缓存大小为ADC_FIFO_SIZE个
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                //外设数据地址固定    
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                    //内存数据地址自增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;    //外设数据以字为单位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;                    //内存数据以字为单位    
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                    //循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                            //高DMA通道优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                        //非内存至内存模式    

  DMA_Init(DMA2_Channel5, &DMA_InitStructure);
    
  /* 使能DMA2-14通道 */
  DMA_Cmd(DMA2_Channel5, ENABLE);
  
}

如上,请问我这样配置可以在捕获到下降沿时触发DMA搬移数据吗?不想在中断中进行数据搬移。希望各位大佬帮忙看看!!

菜鸟小飞机的主页 菜鸟小飞机 | 初学一级 | 园豆:56
提问于:2023-03-07 23:45

我目前代码烧在板子上,数据出不来

菜鸟小飞机 1年前
< >
分享
所有回答(1)
0

看到你的代码中确实开启了DMA,但是 DMA的配置并不正确,我对代码进行了修改,具体如下:

1.将以下代码中的 "TIM5" 修改为 "GENERAL_TIM":

TIM_DMAConfig(TIM5,TIM_DMABase_CCR1,TIM_DMABurstLength_1Transfer);

2.将 DMA 的源地址设置为 CCR 寄存器:

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(GENERAL_TIM->CCR1);

3.将 DMA 的目标地址修改为 ADC 的缓存区:

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)g_tAdcFifo.sBuf;

4.将 DMA 的传输方向修改为从外设到内存:

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

5.添加以下代码进行 DMA 的初始化:

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel2, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel2, ENABLE);

Technologyforgood | 园豆:5675 (大侠五级) | 2023-03-28 21:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册