[N32G45x] 关于TIMER触发ADC采样并且DMA传输问题

[复制链接]
988|6
 楼主| xmcxsta 发表于 2024-11-6 17:38 | 显示全部楼层 |阅读模式
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period    = 2000;
    TIM_TimeBaseStructure.Prescaler = 72-1;
    TIM_TimeBaseStructure.ClkDiv    = TIM_CLK_DIV1;                             //这个配置是PWM死区发生器频率和TIM频率得之间的分频系数,这里可以忽略
    TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;
    TIM_InitTimeBase(TIM8, &TIM_TimeBaseStructure);
    TIM_OCInitStructure.OcMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 10;                                       //0-1000
    TIM_OCInitStructure.OcPolarity  = TIM_OC_POLARITY_HIGH;                     //无影响
    TIM_InitOc1(TIM8, &TIM_OCInitStructure);

TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;这里如果不使能输出,有时候能触发采样,有时候不行,是怎么回事???应该是无需使能输出,如果使能输出,恰好对应的TIM8_CH的GPIO刚好在输出模式,就会周期输出尖脉冲,实际这个端口作为其它使用


 楼主| xmcxsta 发表于 2024-11-6 17:41 | 显示全部楼层
  1.     OCInitType TIM_OCInitStructure;
  2.     DMA_InitType DMA_InitStructure;
  3.     ADC_InitType ADC_InitStructure;
  4.     NVIC_InitType NVIC_InitStructure;
  5.     TIM_TimeBaseInitType TIM_TimeBaseStructure;

  6.     drv_gpio_mode_set(GPIOE,(GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
  7.                       GPIO_PIN_11 | GPIO_PIN_12),GPIO_Mode_AIN,GPIO_INPUT);

  8.     RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA2, ENABLE);
  9.     RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC3,ENABLE);
  10.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM8,ENABLE);

  11.     DMA_DeInit(DMA2_CH5);                                                       //DMA初始化
  12.     DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC3->DAT;
  13.     DMA_InitStructure.MemAddr        = (uint32_t)adc3_result_buff;
  14.     DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
  15.     DMA_InitStructure.BufSize        = ADC3_DMA_BUFF_LEN;
  16.     DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
  17.     DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
  18.     DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
  19.     DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
  20.     DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
  21.     DMA_InitStructure.Priority       = DMA_PRIORITY_LOW;
  22.     DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
  23.     DMA_Init(DMA2_CH5, &DMA_InitStructure);
  24.        
  25.         DMA_ConfigInt(DMA2_CH5, DMA_INT_TXC, ENABLE);
  26.     NVIC_InitStructure.NVIC_IRQChannel                   = DMA2_Channel5_IRQn;
  27.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  28.     NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
  29.     NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
  30.     NVIC_Init(&NVIC_InitStructure);
  31.        
  32.         DMA_EnableChannel(DMA2_CH5, ENABLE);                                                                                //先使能DMA中断,才能使能DMA,否则使能中断无效
  33.        
  34.     ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
  35.     ADC_InitStructure.MultiChEn      = ENABLE;                                  //扫描模式
  36.     ADC_InitStructure.ContinueConvEn =  DISABLE;                                //单次模式,TIM触发一次转换一次
  37.     ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_T8_CC1;
  38.     ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
  39.     ADC_InitStructure.ChsNumber      = 5;
  40.     ADC_Init(ADC3, &ADC_InitStructure);
  41.     ADC_ConfigRegularChannel(ADC3, ADC3_Channel_06_PE8, 1, ADC_SAMP_TIME_55CYCLES5);
  42.     ADC_ConfigRegularChannel(ADC3, ADC3_Channel_02_PE9, 2, ADC_SAMP_TIME_55CYCLES5);
  43.     ADC_ConfigRegularChannel(ADC3, ADC3_Channel_14_PE10, 3, ADC_SAMP_TIME_55CYCLES5);
  44.     ADC_ConfigRegularChannel(ADC3, ADC3_Channel_15_PE11, 4, ADC_SAMP_TIME_55CYCLES5);
  45.     ADC_ConfigRegularChannel(ADC3, ADC3_Channel_04_PE12, 5, ADC_SAMP_TIME_55CYCLES5);
  46.     ADC_EnableExternalTrigConv(ADC3, ENABLE);
  47.         ADC_EnableDMA(ADC3, ENABLE);

  48.     TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
  49.     TIM_TimeBaseStructure.Period    = 2000;
  50.     TIM_TimeBaseStructure.Prescaler = 72-1;
  51.     TIM_TimeBaseStructure.ClkDiv    = TIM_CLK_DIV1;                             //这个配置是PWM死区发生器频率和TIM频率得之间的分频系数,这里可以忽略
  52.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;
  53.     TIM_InitTimeBase(TIM8, &TIM_TimeBaseStructure);
  54.     TIM_OCInitStructure.OcMode      = TIM_OCMODE_PWM1;
  55.     TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
  56.     TIM_OCInitStructure.Pulse       = 10;                                       //0-1000
  57.     TIM_OCInitStructure.OcPolarity  = TIM_OC_POLARITY_HIGH;                     //无影响
  58.     TIM_InitOc1(TIM8, &TIM_OCInitStructure);
  59.    
  60.     ADC_Enable(ADC3, ENABLE);
  61.     while(ADC_GetFlagStatusNew(ADC3,ADC_FLAG_RDY) == RESET);
  62.     ADC_StartCalibration(ADC3);
  63.     while (ADC_GetCalibrationStatus(ADC3));
laocuo1142 发表于 2024-11-7 12:30 | 显示全部楼层
定时器的配置问题?
flycamelaaa 发表于 2024-11-7 14:00 | 显示全部楼层
如果您不需要从定时器通道输出PWM信号,那么可以将该通道的输出状态设置为 TIM_OUTPUT_STATE_DISABLE。
xch 发表于 2024-11-7 14:46 来自手机 | 显示全部楼层
换成t8溢出触发呢?
powerantone 发表于 2024-11-7 15:00 | 显示全部楼层
在可能的情况下,使用外部电路来稳定未使能的GPIO引脚的状态。
stormwind123 发表于 2024-11-7 16:26 | 显示全部楼层
检查并消除任何可能的干扰或噪声源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部