宁cc 2022-04-02 11:48 采纳率: 50%
浏览 20
已结题

PWM+DMA发送的占空比中混杂发占空比0的现象

PWM+DMA发送的占空比中混杂发占空比0的现象
stm32f4 PB5 TIM3 CH2 DMA1_Stream5 ch5
TIM_TimeBaseStructure.TIM_Prescaler= 1-1; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period= 105 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//初始化定时器3

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据指定的参数初始化外设TIM2 OC3

TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能
 
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM2在CCR3上的预装载寄存器



DMA_DeInit(DMA1_Stream5);
    
DMA_InitStructure.DMA_Channel = DMA_Channel_5;  //通道选择

DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32_t)(&(TIM3->CCR2)));//DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)headPixelBuffer;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
DMA_InitStructure.DMA_BufferSize = HEADPIXELNUM * GRBLen;//数据传输量
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_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA1_Stream5, &DMA_InitStructure);//初始化DMA Stream

发送函数
TIM_Cmd(TIM3, ENABLE);
DMA_SetCurrDataCounter(DMA1_Stream5, (uint16_t)(HEADPIXELNUM * GRBLen)); //DMA传输数据大小
TIM_DMACmd(TIM3, TIM_DMA_CC2, ENABLE);
DMA_Cmd(DMA1_Stream5, ENABLE);

while(!DMA_GetFlagStatus(DMA1_Stream5 ,DMA_FLAG_TCIF5)); 

DMA_Cmd(DMA1_Stream5, DISABLE);
DMA_ClearFlag(DMA1_Stream5, DMA_FLAG_TCIF5);    
TIM_Cmd(TIM3, DISABLE);
  • 写回答

1条回答 默认 最新

  • 宁cc 2022-04-07 17:11
    关注

    将数据宽度修改为32位

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效