打印

定时器DMA启动问题

[复制链接]
4716|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
video_vb|  楼主 | 2012-1-5 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用软件启动DMA,能够正常通过SPI发送700个HalfWord.

但是通过TIM每10MS启动DMA发送,实际上每次只发了一个,为什么呀?
DMA用循环模式或者普通模式都不行.

u16 Buf[100][7];


void SPI2_Configuration(u8 sel)
{

  SPI_InitTypeDef SPI_InitStructure;

  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
               
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
                  
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  // Enable SPI2 TXE interrupt
  //SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, ENABLE);
  
  //SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);        
  SPI_Cmd(SPI2, ENABLE);

}

// DMA1 channel5 configuration ----------------------------------------------
void DMA_Configuration(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        
        DMA_DeInit(DMA1_Channel5);
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr =(u32)Buf;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = 700;      
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc =  DMA_MemoryInc_Enable; //DMA_MemoryInc_Disable
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;        //DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);


        // Enable DMA1 channel5
        DMA_Cmd(DMA1_Channel5, ENABLE);        
        
        
}

void TIM4_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;        ////

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* Prescaler configuration */
  TIM_PrescalerConfig(TIM4, 3599, TIM_PSCReloadMode_Immediate);

  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 200;        //10ms
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Disable);

  /* TIM IT enable */
  //TIM_ITConfig(TIM4, /*TIM_IT_CC1 | TIM_IT_CC2 |*/ TIM_IT_CC3, ENABLE);
  
  TIM_DMACmd(TIM4, TIM_DMA_CC3, ENABLE);
        
  /* TIM4 enable counter */
  TIM_Cmd(TIM4, ENABLE);
}


//STM32配置
void CPU_Configuration(void)
{
  /* System Clocks Configuration */
  RCC_Configuration();
        
  /* NVIC configuration */
  NVIC_Configuration();

  /* Configure the GPIO ports */
  GPIO_Configuration();

  /* USART1 and USART2 configuration ------------------------------------------------------*/
  //USART_Configuration();
  U2_init(2400);
         
  //SPI2
  SPI2_Configuration(0);
   TIM4_Configuration();   
   //DMA
  DMA_Configuration();
   
}
沙发
香水城| | 2012-1-5 11:04 | 只看该作者
TIM启动DMA就是每次触发只传送一个数据。

使用特权

评论回复
板凳
video_vb|  楼主 | 2012-1-5 14:06 | 只看该作者
只传送一个数据,下面这句没作用?
DMA_InitStructure.DMA_BufferSize = 700;

使用特权

评论回复
地板
香水城| | 2012-1-5 14:15 | 只看该作者
只传送一个数据,下面这句没作用?
DMA_InitStructure.DMA_BufferSize = 700;
video_vb 发表于 2012-1-5 14:06


当然有作用。

使用特权

评论回复
5
video_vb|  楼主 | 2012-1-6 15:06 | 只看该作者
每次传送一个,地址自动递加,直到700个数据传完,再等待重新启动DMA,是这样的吗?

使用特权

评论回复
6
香水城| | 2012-1-6 16:10 | 只看该作者
每次传送一个,地址自动递加,直到700个数据传完,再等待重新启动DMA,是这样的吗?
video_vb 发表于 2012-1-6 15:06


是的。 不难理解吧?! :lol

使用特权

评论回复
7
tianwzhen56| | 2017-2-21 11:14 | 只看该作者
你好,我在手册上看到TIM->DCR寄存器可以设置DMA连续发送字节数,但设置后还是传输一字节,不知楼主试过没有,能不能帮忙解惑一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:video_vb@163.com

14

主题

67

帖子

2

粉丝