高级会员

- 积分
- 664
- 金钱
- 664
- 注册时间
- 2019-1-30
- 在线时间
- 111 小时
|
10金钱
采用高级定时器TIM1,通过DMA把缓冲区数据发送到CCR1寄存器中,实现每一个定时器周期到来后触发DMA传输数据,从而改变占空比。因此预期的波形图应该是,每过一个周期,占空比都会发生一次变换。通过使用通用定时器,已经实现了这种预期效果,但是同样的设置用到高级定时器TIM1就有问题,占空比不是这样一个周期进行一次变换,而是变化的非常缓慢,不解为什么,请求大神指点一二。谢谢。下面是自己的一些初始化代码- void Init_TIMER_TIM1(void)
- {
- TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; //¶¨òåò»¸ö¶¨ê±Æ÷½á11ìå±äá¿
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ê1Äü¶¨ê±Æ÷1£¬ÖØòa£¡£¡
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öó
- GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer12¿·ÖÖØó3éä TIM1_CH1->Pa8
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1 éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM1 CH1μÄPWMÂö3å2¨DÎ GPIOA.8
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIO
-
- TIM_DeInit(TIM1); //½«TIM1¶¨ê±Æ÷3õê¼»ˉλ¸′λÖμ
- TIM_InternalClockConfig(TIM1); //ÅäÖÃ TIM1 Äú2¿ê±Öó
- TIM_BaseInitStructure.TIM_Period = 999; //éèÖÃ×Ô¶ˉÖØÔØ¼Ä′æÆ÷ÖμÎa×î′óÖμ 0~65535Ö®¼ä 1000000/1000=1000us=1ms //TIM_Period£¨TIM1_ARR£©=7200£¬¼ÆêyÆ÷ÏòéϼÆêyμ½7200oó2úéú¸üDÂê¼t£¬ //¼ÆêyÖμ1éáã ò2¾íêÇ 1MS2úéú¸üDÂê¼tò»′Î
- TIM_BaseInitStructure.TIM_Prescaler = 719; //×Ô¶¨òåÔ¤·ÖÆμÏμêyÎa0£¬¼′¶¨ê±Æ÷μÄê±ÖóÆμÂêÎa72Mìá1©¸ø¶¨ê±Æ÷μÄê±Öó 0~65535Ö®¼ä //éèÖÃÔ¤·ÖÆμÆ÷·ÖÆμÏμêy0
- TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ê±Öó·Ö¸îÎa0
- TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½ ′ó0¿aê¼ÏòéϼÆêy£¬¼Æêyμ½1000oó2úéú¸üDÂê¼t
- TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure); //¸ù¾YÖ¸¶¨2Îêy3õê¼»ˉTIMê±¼ä»ùêy¼Ä′æÆ÷
- TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
- TIM_ARRPreloadConfig(TIM1, ENABLE); //ê1ÄüTIMxÔú ARR éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
- TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
- TIM_DMAConfig(TIM1,TIM_DMA_Update,TIM_DMABurstLength_3Transfers);
- }
- void Init_PWM_TIM1(uint16_t Dutyfactor)
- {
- TIM_OCInitTypeDef TIM_OCInitStructure; //¶¨òåò»¸öí¨μàêä3ö½á11
- TIM_OCStructInit(&TIM_OCInitStructure); //éèÖÃè±ê¡Öμ
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM Ä£ê½ 1 êä3ö
- TIM_OCInitStructure.TIM_Pulse = send_buf[0]; //éèÖÃÕ¼¿Õ±è£¬Õ¼¿Õ±è=(CCRx/ARR)*100%»ò(TIM_Pulse/TIM_Period)*100%
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM êä3ö±è½Ï¼«DÔ¸ß
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //ê1Äüêä3ö×′ì¬ DèòaPWMêä3ö2ÅDèòaÕaDD′úÂë
- TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
- TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
- TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //¸ù¾Y2Îêy3õê¼»ˉPWM¼Ä′æÆ÷
- TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //ê1Äü TIMxÔú CCR1 éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
- TIM_CtrlPWMOutputs(TIM1,ENABLE); //éèÖÃTIM1 μÄPWM êä3öÎaê1Äü
- }
- void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* ??DMA?? */
- // delay_ms(5);
- DMA_DeInit(DMA_CHx);
- DMA1_MEM_LEN=cndtr;
- DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
- DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
- DMA_InitStructure.DMA_BufferSize = cndtr;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_ITConfig(DMA_CHx,DMA_IT_TC,ENABLE);
- DMA_Init(DMA_CHx, &DMA_InitStructure);
- }
复制代码
|
|