OpenEdv-开源电子网

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

TIM3通道4-->DMA1_Channel3问题何在?

[复制链接]

17

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2020-5-8
在线时间
153 小时
发表于 2020-8-10 22:11:19 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 新洲罗远 于 2020-8-10 22:13 编辑

这几天改进STM32F103C8驱动VGA
想用DMA写8位数据到PA口,
控制流程是 TIM3通道4-->DMA1_Channel3。运行结果是TIM3通道4工作(PB1有输出)但DMA没有工作(PA0-7无输出)
贴上有关程序大家看看 ,哪里错了?
void DMA_Configuration(void)
  {

     DMA_InitTypeDef  D;
           GPIO_InitTypeDef GPIO_InitStructure;
     NVIC_InitTypeDef nvic;
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
     TIM_OCInitTypeDef TIM_OCInitStructure;

     /////////////////////////////////////////////////////////////
                 ////////////////数据输出口 /////////////////////////////////////////////////
                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//端口使能        
                  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);        
//端口设置
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  
                ///////////////////////////////////////////////////////////////
//定时器设置
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    TIM_TimeBaseStructure.TIM_Period = 2;  //2 定时器 计数  次,为一个定时周期
    TIM_TimeBaseStructure.TIM_Prescaler =4;  //4设置预分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
    //TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
               
//PWM通道4模式设置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    //配置为PWM模式1
    TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;        
    TIM_OCInitStructure.TIM_Pulse =2;//2
//设置跳变值,当计数器计数到这个值时,电平发生跳变
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
//当定时器计数值小于CCR1_Val时为高电平
    TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4


  ///////////////////////////////////////////////////////////////
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
                DMA_DeInit(DMA1_Channel3);//将DMA的通道1寄存器重设为缺省值
               
                D.DMA_PeripheralBaseAddr = (uint32_t)&GPIOA->ODR; //DMA外设ADC基地址
    D.DMA_MemoryBaseAddr = (u32) &fb[0][0]; //DMA内存基地址
    D.DMA_DIR = DMA_DIR_PeripheralDST;//数据传输方向,从内存读取发送到外设
    D.DMA_BufferSize = VTOTAL; //DMA通道的DMA缓存的大小                   //=52
    D.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
    D.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
    D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位
    D.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度为8位
    D.DMA_Mode = DMA_Mode_Normal;//工作在正常缓存模式D.DMA_Mode =DMA_Mode_Circular; //工作在循环模式
    D.DMA_Priority = DMA_Priority_Low;//DMA通道 x拥有中优先级
    D.DMA_M2M = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输
      DMA_Init(DMA1_Channel3, &D);

      nvic.NVIC_IRQChannel = DMA1_Channel3_IRQn;
      nvic.NVIC_IRQChannelPreemptionPriority = 0;
      nvic.NVIC_IRQChannelSubPriority = 0;
      nvic.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&nvic);
                        DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);//DMA完成中断  
                        
    DMA_Cmd(DMA1_Channel3, ENABLE);     //DMA1_3使能               

    TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
    //TIM3 DMA请求使能,注:TIM3_Update请求对应DMA通道为DMA1_chanel3
                TIM_Cmd(TIM3, ENABLE); //TIM3使能
  }               

   __irq void TIM1_CC_IRQHandler(void)
  {
                u32 vt;
      if (vflag)
      {
                                    DMA1_Channel3->CNDTR = VTOTAL;  //=52
                                    DMA1_Channel3->CCR |= 0x01;  //开启DMA1通道3
                                
      }
      TIM1->SR = 0xFFFB; //~TIM_IT_CC2;         // 清TIM1中断标志位
                        //TIM_ClearITPendingBit(TIM1,TIM_IT_CC2);    // 清TIM1中断标志位
  }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2020-5-8
在线时间
153 小时
 楼主| 发表于 2020-8-11 22:12:10 | 显示全部楼层
问题在这里:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;应该使用GPIO_Mode_Out_PP;怎么就没有注意到呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 15:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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