打印

求助!关于STM32L152的DMA循环操作不能执行?

[复制链接]
3811|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZRJ8951|  楼主 | 2012-3-13 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我为了验证问题,在STM32F103测试上,DMA循环操作能正常运行。但在STM32L152上怎么都只能进二次中断。DMA循环操作不能执行。这个问题我都搞了一个星期了。希望得到帮助。
1.采用的3.5的库。MDK-ARM4.22A
2.DMA采用循环操作,设传半,全传中断
3.ADC用TIM1_CC1触发。采32次求平均值,用串口1,printf显示。
void ADC_DMAInit(void)
  {
  DMA_InitTypeDef    DMA_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
   /* DMA1 Channel1 Configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = N;
  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_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  /* Enable DMA1 Channel1 Transfer Complete interrupt */
  DMA_ITConfig(DMA1_Channel1,DMA_IT_TC|DMA_IT_HT,ENABLE);      /*使能DMA通道1传送中断*/
  

  /*开启DMA1_Channel1通道中断控制,*/
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  }
  void TIM1_Config(void)
  {
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  TIM_OCInitTypeDef         TIM_OCInitStructure;
    /* Time Base configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 0xFF;         
  TIM_TimeBaseStructure.TIM_Prescaler = 720;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  /* TIM1 channel1 configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
  TIM_OCInitStructure.TIM_Pulse = 0x7F;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
   }
void ADC_Configuration(void)
{
  ADC_InitTypeDef  ADC_InitStructure;

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
  /* ADC1 regular channel1 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);

  /* Set injected sequencer length */
  ADC_InjectedSequencerLengthConfig(ADC1, 1);
  /* ADC1 injected channel Configuration */
  ADC_InjectedChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_71Cycles5);
  /* ADC1 injected external trigger configuration */
  ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
  /* Enable automatic injected conversion start after regular one */
  ADC_AutoInjectedConvCmd(ADC1, ENABLE);
  
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  /* Enable ADC1 external trigger */
  ADC_ExternalTrigConvCmd(ADC1, ENABLE);
  
  /* Enable JEOC interrupt */
  //ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));
  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);
  /* TIM1 main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  

}
/*******************************************************************************
* 函数名    : USART_Configuration
* 函数描述     : 设置USART1
* 输入参数      : None
* 输出结果      : None
* 返回值        : None
*******************************************************************************/
void USART_Configuration(void)
{
    /* 定义USART初始化结构体 USART_InitStructure */
    USART_InitTypeDef USART_InitStructure;
   
    /*
    * 波特率为9600bps
    * 8位数据长度
    * 1个停止位,无校验
    * 禁用硬件流控制
    * 禁止USART时钟
    * 时钟极性低
    * 在第2个边沿捕获数据
    * 最后一位数据的时钟脉冲不从 SCLK 输出
    */
    USART_InitStructure.USART_BaudRate =115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1 , &USART_InitStructure);
   
    /* 使能USART1 */
    USART_Cmd(USART1 , ENABLE);
}
void VoltComputeOnly(void)
{
     uint8_t i;  

if(gDmaHalfTrans==1)
{
   gDmaHalfTrans=0;
   
   sum[0]=ADC_RegularConvertedValueTab[0];     /*32次采样的上半缓存*/
   for(i=1;i<32;i+=1)   
   {
  sum[0]=sum[0]+ADC_RegularConvertedValueTab[i];
   }
     Value= sum[0]/32   ; /*UA采样32次的平均值*/

  printf("\r\n The current AD value1 = 0x%04X \r\n", Value);
}
if(gDmaTransFinish==1)
{
    gDmaTransFinish=0;
sum[0]=ADC_RegularConvertedValueTab[32];   /*32次采样的下半缓存*/
for(i=33;i<64;i+=1)   
    {
  sum[0]=sum[0]+ADC_RegularConvertedValueTab[i];
}
   Value= sum[0]/32   ; /*UA采样32次的平均值*/

  printf("\r\n The current AD value2 = 0x%04X \r\n", Value);
}
}
沙发
ZRJ8951|  楼主 | 2012-3-13 15:41 | 只看该作者
上面这些代码是在STM32F103RB上能运行的。

使用特权

评论回复
板凳
ZRJ8951|  楼主 | 2012-3-13 17:29 | 只看该作者
香版主:能不能发个类似的STM32L152的测试程序。

使用特权

评论回复
地板
香水城| | 2012-3-13 17:42 | 只看该作者
香版主:能不能发个类似的STM32L152的测试程序。
ZRJ8951 发表于 2012-3-13 17:29


固件库里没有例程吗?

使用特权

评论回复
5
ZRJ8951|  楼主 | 2012-3-13 18:17 | 只看该作者
是的。没有。我前天又下最新的固件库。

使用特权

评论回复
6
yinyangdianzi| | 2012-3-15 14:24 | 只看该作者
有STM32L152VBT6

使用特权

评论回复
7
lksdhr| | 2012-12-13 17:16 | 只看该作者
对ADC的配置少了一句ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
因为遇到同样的问题所以看到这个帖子,但是很遗憾解决方法没有人回复就结贴了。

特此贴出来希望帮助新人!

使用特权

评论回复
8
njchenmin| | 2012-12-14 07:16 | 只看该作者
做的标记,以后会用到

使用特权

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

本版积分规则

97

主题

201

帖子

1

粉丝