问题是这样的: 定义了一个数组,内容为PWM波的占空比对应的脉冲数,本人利用DMA通道将数组传输至TIM1的CCR,TIM1设置为PWM输出,从而改变PWM波的脉冲比,发现传输至TIM1的CCR,TIM1的CH1一直输出高电平,而不是占空比变化的PWM波。而传输至TIM2或TIM3等通用定时器的CH口,PWM波的输出及占空比均正常。 下面是传输至TIM1的代码: #include "stm32f10x.h" u16 buf1[20] = {5,14,22,30,37,44,49,53,56,57,57,56,53,49,44,37,30,22,14,5}; void DMA_Configuration(void) { DMA_InitTypeDef D; //????????90??? DMA_DeInit(DMA1_Channel2); //DMA1_3????? D.DMA_PeripheralBaseAddr = (u32)0x40000034; //DMA???? TIM3_CCR1_Address TIM3-1£º40000434 TIM1-1£º40012C34 TIM1-2£º40012C38 D.DMA_MemoryBaseAddr = (u32)buf1; //DMA???? TIM2-1£º40000034 TIM3-2:40000438 D.DMA_DIR = DMA_DIR_PeripheralDST; //DST????????????,SRC?????? D.DMA_BufferSize = 20; //DMA???? D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //?????????? D.DMA_MemoryInc = DMA_MemoryInc_Enable; //?????????? D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //????16bit D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //????16bit D.DMA_Mode = DMA_Mode_Circular; //??????? D.DMA_Priority = DMA_Priority_High; //DMA?????? D.DMA_M2M = DMA_M2M_Disable; //?????????? DMA_Init(DMA1_Channel2, &D); //???DMA1 DMA_Cmd(DMA1_Channel2, ENABLE); //DMA1_3?? } static void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); //TIM3?? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE); //PA?PB?? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //GPIOA ??: TIM3 channel 1 ? 2 ???? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ?????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_0 | GPIO_Pin_7; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; SystemInit();//???????72MHz GPIO_Config(); //???? DMA_Configuration(); //??DMA //????? TIM_TimeBaseStructure.TIM_Period = 71; //?????0???999,??1000?,??????? TIM_TimeBaseStructure.TIM_Prescaler = 0; //?????:????,??36MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; //????????:??? TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //?????? //TIM_TimeBaseStructure.TIM_RepetitionCounter = 2; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //PWM??1???? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //???PWM??1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = buf1[0]; //?????,???????????,?????? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //?????????CCR1_Val????? TIM_OC1Init(TIM2, &TIM_OCInitStructure); //????1 TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE); //TIM3 DMA????,?:TIM3_Update????DMA???DMA1_chanel3 // TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE); //TIM3 DMA????,?:TIM3_CC1????DMA???DMA1_chanel6 TIM_Cmd(TIM2, ENABLE); //TIM3?? //TIM_CtrlPWMOutputs(TIM3, ENABLE); //PWM?? while (1) {} } |
评分
查看全部评分
没有大于它