请选择 进入手机版 | 继续访问电脑版
搜索
查看: 4158|回复: 11

[求助] STM32F030 TIM3 ADC DMA

[复制链接]

该用户从未签到

6

主题

20

帖子

0

蝴蝶豆

初级会员

最后登录
2023-5-25
发表于 2021-3-30 13:36:15 | 显示全部楼层 |阅读模式
我使用STM32F030  用TIM3 触发ADC 然后使用DMA 将数据传出来 代码如下:void Adc_IO_Init(void)
{
       
        GPIO_InitTypeDef        GPIO_InitStructure;       
/* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* Configure PC8 and PC9 in output pushpull mode */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_2| GPIO_Pin_5| GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}
void ADC_Bsp_Init( void )
{

    ADC_InitTypeDef  ADC_InitStructure;  

                /*ÉèÖÃADC·ÖƵÒò×ÓΪ4 ,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M*/
                RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);       
       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

                ADC_StructInit(&ADC_InitStructure);
                ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
//                ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//??AD???????
                ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//??AD???????       
                ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;//?????????
//                ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None;//?????????       
                ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//???????????????????
//                ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Backward;
                ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; //CH0-18       
            ADC_Init(ADC1, &ADC_InitStructure);
       
        //   /* ADC DMA request in circular mode */
                ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

      //ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 0, ADC_SampleTime_28_5Cycles);
                ADC_ChannelConfig(ADC1, ADC_Channel_0|ADC_Channel_2|ADC_Channel_5,  ADC_SampleTime_28_5Cycles);        
       
       
  /* ADC Calibration */
                ADC_GetCalibrationFactor(ADC1);
   ADC_DMACmd(ADC1, ENABLE);
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);     

  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
       
                TIM_Cmd(TIM3, ENABLE);               
                DMA_Cmd(DMA1_Channel1, ENABLE);               
               
//                 ADC_StartOfConversion(ADC1);

}

void Tim3_Init(void)
{

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;       
       
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//????
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructure.TIM_ClockDivision=0;//48M
  TIM_TimeBaseStructure.TIM_Prescaler=480;//48k 1Tick=1ms
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period=1000-1;//10s??
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//??RepetitionCounter+1????????
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);//TIM15?Update??????TRGO
       
//    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//?????? TIM ???,?????1       
       
  TIM_ClearFlag(TIM3,TIM_FLAG_Update); //????????? ????????
//  TIM_Cmd(TIM3,ENABLE);//??TIM3       

       
}
void DMA_Bsp_Init(void)
{

    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    DMA_DeInit(DMA1_Channel1);
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&ADC1->DR;
//            DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->ADDR11;
    DMA_InitStructure.DMA_MemoryBaseAddr = (unsigned int)&g_usAdcBuff[0];
//        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC1_addr11;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = NUM_ADC_LENTH;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

//   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;       
       
//   DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);


                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);                       
               
               
    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC|DMA_IT_HT, ENABLE);                               
         
//   DMA_Cmd(DMA1_Channel1, ENABLE);


}


void DMA1_Channel1_IRQHandler(void)

死活进不了 DMA中断
然后我做了几个实验
1、将ADC 改成  外部中断,也就是不使用定时器触发,采用连续采样,可以进DMA 中断
2、 我配置好并且开TIM3 中断,TIM3 中断可以进

这样我就实在找不出来哪里设置不对,进不了 DMA 中断
哪位大侠能帮看看代码哪里有问题么




回复

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2021-3-30 16:20:04 | 显示全部楼层
楼主,看不到定时器中断对DMA的操作。可以考虑仿真进入TIM3中断后,对DMA进行配置。配置完成后,查看一下DMA的寄存器,按照手册解一下这时DMA的状态,我相信你很快解决问题。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

20

帖子

0

蝴蝶豆

初级会员

最后登录
2023-5-25
 楼主| 发表于 2021-3-30 17:35:50 | 显示全部楼层
安 发表于 2021-3-30 16:20
楼主,看不到定时器中断对DMA的操作。可以考虑仿真进入TIM3中断后,对DMA进行配置。配置完成后,查看一下DM ...

我定时器不是对DMA操作啊,我定时器是触发ADC,ADC采样后触发DMA啊
               ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;//?????????

回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2021-3-30 18:15:01 | 显示全部楼层
ADC_StartOfConversion(ADC1);
这句放开试试。
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

621

帖子

152

蝴蝶豆

论坛元老

最后登录
2023-11-13
发表于 2021-3-30 20:05:45 | 显示全部楼层
不用HAL库,弯路就多。 用HAL库,重新做一次也就是几个小时的事儿。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

20

帖子

0

蝴蝶豆

初级会员

最后登录
2023-5-25
 楼主| 发表于 2021-3-30 20:33:25 | 显示全部楼层
安 发表于 2021-3-30 18:15
ADC_StartOfConversion(ADC1);
这句放开试试。

不用TIM3 触发,采用外部触发  连续模式   
ADC_StartOfConversion(ADC1);   放开  DMA正常进中断

但是采用TIM3 终端  仅仅吧  
ADC_StartOfConversion(ADC1);放开 一样不行
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

20

帖子

0

蝴蝶豆

初级会员

最后登录
2023-5-25
 楼主| 发表于 2021-3-30 20:41:14 | 显示全部楼层
radio2radio 发表于 2021-3-30 20:05
不用HAL库,弯路就多。 用HAL库,重新做一次也就是几个小时的事儿。

我之前103   407 都这样用过 ADC TIM 加DMA 都没出问题,偏偏030被卡住了 头大
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2021-3-31 09:04:01 | 显示全部楼层
看一下寄存器的值,肯定能找到问题。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

中级会员

最后登录
2021-6-9
发表于 2021-3-31 10:42:16 | 显示全部楼层
看下TIM3 初始化后 TIM3-CR2 中MMS[2;0]是不是主模式 000状态,这样才输出 UPDATE TRGO 。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

20

帖子

0

蝴蝶豆

初级会员

最后登录
2023-5-25
 楼主| 发表于 2021-3-31 13:46:39 | 显示全部楼层
zxm3916 发表于 2021-3-31 10:42
看下TIM3 初始化后 TIM3-CR2 中MMS[2;0]是不是主模式 000状态,这样才输出 UPDATE TRGO 。
...

        TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);       
加了这一句
TIM3->CR2 = 0X20 还是进不了中断
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-28 18:27 , Processed in 0.179763 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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