OpenEdv-开源电子网

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

关于F1系列用DMA改变PWM脉宽的问题

[复制链接]

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
发表于 2020-4-23 19:00:13 | 显示全部楼层 |阅读模式
10金钱
采用高级定时器TIM1,通过DMA把缓冲区数据发送到CCR1寄存器中,实现每一个定时器周期到来后触发DMA传输数据,从而改变占空比。因此预期的波形图应该是,每过一个周期,占空比都会发生一次变换。通过使用通用定时器,已经实现了这种预期效果,但是同样的设置用到高级定时器TIM1就有问题,占空比不是这样一个周期进行一次变换,而是变化的非常缓慢,不解为什么,请求大神指点一二。谢谢。下面是自己的一些初始化代码
  1. void Init_TIMER_TIM1(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef         TIM_BaseInitStructure;                        //¶¨òåò»¸ö¶¨ê±Æ÷½á11ìå±äá¿
  4.   GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);           //ê1Äü¶¨ê±Æ÷1£¬ÖØòa£¡£¡
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öó
  7.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer12¿·ÖÖØó3éä  TIM1_CH1->Pa8
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1 éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM1 CH1μÄPWMÂö3å2¨DΠ       GPIOA.8
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIO
  12.        
  13.         TIM_DeInit(TIM1);                                                      //½«TIM1¶¨ê±Æ÷3õê¼»ˉλ¸′λÖμ
  14.         TIM_InternalClockConfig(TIM1);                                                         //ÅäÖÃ TIM1 Äú2¿ê±Öó          
  15.         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ò»′Î
  16.         TIM_BaseInitStructure.TIM_Prescaler = 719;                                  //×Ô¶¨òåÔ¤·ÖÆμÏμêyÎa0£¬¼′¶¨ê±Æ÷μÄê±ÖóÆμÂêÎa72Mìá1©¸ø¶¨ê±Æ÷μÄê±Öó        0~65535Ö®¼ä                                                                                                                        //éèÖÃÔ¤·ÖÆμÆ÷·ÖÆμÏμêy0
  17.         TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ê±Öó·Ö¸îÎa0
  18.         TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½ ′ó0¿aê¼ÏòéϼÆêy£¬¼Æêyμ½1000oó2úéú¸üDÂê¼t
  19.         TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure); //¸ù¾YÖ¸¶¨2Îêy3õê¼»ˉTIMê±¼ä»ùêy¼Ä′æÆ÷       
  20.         TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
  21.         TIM_ARRPreloadConfig(TIM1, ENABLE);        //ê1ÄüTIMxÔú ARR éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
  22.         TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
  23.         TIM_DMAConfig(TIM1,TIM_DMA_Update,TIM_DMABurstLength_3Transfers);
  24. }
  25. void Init_PWM_TIM1(uint16_t Dutyfactor)
  26. {
  27.         TIM_OCInitTypeDef  TIM_OCInitStructure;                                        //¶¨òåò»¸öí¨μàêä3ö½á11
  28.         TIM_OCStructInit(&TIM_OCInitStructure);                                        //éèÖÃè±ê¡Öμ
  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                   //PWM Ä£ê½ 1 êä3ö        
  30.         TIM_OCInitStructure.TIM_Pulse = send_buf[0];                         //éèÖÃÕ¼¿Õ±è£¬Õ¼¿Õ±è=(CCRx/ARR)*100%»ò(TIM_Pulse/TIM_Period)*100%                                                                 
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //TIM êä3ö±è½Ï¼«DԸߠ                                                                                                      
  32.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //ê1Äüêä3ö×′쬠 DèòaPWMêä3ö2ÅDèòaÕaDD′úÂë
  33.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  34.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  35.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  36.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  37.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                //¸ù¾Y2Îêy3õê¼»ˉPWM¼Ä′æÆ÷   
  38.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);                   //ê1Äü TIMxÔú CCR1 éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
  39.         TIM_CtrlPWMOutputs(TIM1,ENABLE);                                                  //éèÖÃTIM1 μÄPWM êä3öÎaê1Äü  
  40. }
  41. void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  42. {
  43.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        /* ??DMA?? */
  44. //        delay_ms(5);
  45.   DMA_DeInit(DMA_CHx);   
  46.         DMA1_MEM_LEN=cndtr;
  47.         DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
  48.         DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  
  49.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  50.         DMA_InitStructure.DMA_BufferSize = cndtr;  
  51.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  52.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  53.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
  54.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  55.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
  56.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  57.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  58.         DMA_ITConfig(DMA_CHx,DMA_IT_TC,ENABLE);

  59.         DMA_Init(DMA_CHx, &DMA_InitStructure);         
  60. }
复制代码


最佳答案

查看完整内容[请看2#楼]

自己定时器设置的问题,已解决。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2020-4-23 19:00:14 | 显示全部楼层
自己定时器设置的问题,已解决。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-24 01:39:14 | 显示全部楼层
帮顶
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2020-4-24 08:37:30 | 显示全部楼层
自己定时器设置的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 03:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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