你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助帖:DMA传输控制PWM的输出占空比遇到了问题

[复制链接]
sunyang111 提问时间:2018-9-5 21:59 /
问题是这样的:
定义了一个数组,内容为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)
{}
}


收藏 评论4 发布时间:2018-9-5 21:59

举报

4个回答
feixiang20 回答时间:2018-9-5 23:23:40
示波器上检测下捕获脉冲宽度
wenyangzeng 回答时间:2018-9-6 07:19:46
TIM_OCInitStructure.TIM_Pulse大于TIM_TimeBaseStructure.TIM_Period就没有PWM输出了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

sunyang111 回答时间:2018-9-6 09:32:21
wenyangzeng 发表于 2018-9-6 07:19
TIM_OCInitStructure.TIM_Pulse大于TIM_TimeBaseStructure.TIM_Period就没有PWM输出了。

没有大于它
00dd 回答时间:2018-9-29 15:08:45
attribute

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版