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搬移数据吗?不想在中断中进行数据搬移。希望各位大佬帮忙看看!!
看到你的代码中确实开启了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);
我目前代码烧在板子上,数据出不来
– 菜鸟小飞机 1年前