stm32 Tim1定时出发adc采集


其中配置代码如下:

void ADC1_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72M/6=12,ADC最大时钟不能超过14M
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1,ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
  /* Configure ADCCLK such as ADCCLK = PCLK2/6 */

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//AIN3
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//DMA外设ADC基地址
  DMA_InitStructure.DMA_MemoryBaseAddr     = (u32)Adc1DMAValue;//DMA内存基地址
  DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;//内存作为数据传输的目的地
  DMA_InitStructure.DMA_BufferSize         = 90;//DMA通道的DMA缓存的大小
  DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;//外设地址寄存器不变
  DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;//内存地址寄存器递增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度为16位
  DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;//数据宽度为16位
  DMA_InitStructure.DMA_Mode               = DMA_Mode_Circular;//工作在循环缓存模式
  DMA_InitStructure.DMA_Priority           = DMA_Priority_High;//DMA通道x拥有高优先级
  DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1工作在独立模式
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//模数转换工作在多通道模式
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//DISABLE;//模数转换工作在单次转换模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//转换由软件而不是外部触发启动
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 3;//顺序进行规则转换的ADC通道的数目
  ADC_Init(ADC1, &ADC_InitStructure);

  for(uint8 i=1; i<4; i++)
    ADC_RegularChannelConfig(ADC1,ADC_Channel_13, i, ADC_SampleTime_239Cycles5);//前面5路外置温度


#if 0
  /* ADC1 regular channel16 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);//ADC1,ADC通道16,规则采样顺序值为1,采样时间为239.5周期
  /* Enable the temperature sensor and vref internal channel */
  ADC_TempSensorVrefintCmd(ENABLE);
#endif

  ADC_DMACmd(ADC1, ENABLE);
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */
  ADC_ResetCalibration(ADC1);//重置指定的ADC1的校准寄存器
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC1重置校准寄存器的状态,设置状态则等待
  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);//开始指定ADC1的校准状态
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC1的校准程序,设置状态则等待

  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
}

 


/* 触发的定时器配置:*/

void TIM1_Configuration(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  //GPIO_InitTypeDef GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);    //使能定时器3时钟
 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIO外设
 /*Pin for TIM1 channel configuration*/
  /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//TIM1-CH1
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);*/
 
  TIM_DeInit(TIM1);  
 
  TIM_TimeBaseStructure.TIM_Period =400;//50us
  TIM_TimeBaseStructure.TIM_Prescaler = 8;//36分频
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//72M
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
  /* PWM1 模式配置: Channel3 Channel4*/
  TIM_OCStructInit(&TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//选择输出比较状态
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//选择互补输出比较状态
 
  TIM_OCInitStructure.TIM_Pulse = 333;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIMx在CCR3上的预装载寄存器
  TIM_CtrlPWMOutputs(TIM1, ENABLE); 
}

正常使用,出现的情况是我在TIM1配置PWM触发的adc采集的IO口管脚TIM1_CH1正好与SPI2的管脚处在的管脚TIM1_CH1N 一起,所以就需要把TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;改为Disable,奇怪的事情就出现了,我在用USART1进行的通信任务,怎么也不能按之前正常一样进行,总是接收不到完成的信息。

 

void Usart1Init( void )
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
 
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);    //使能DMA传输
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART2时钟
 
 
  DMA_DeInit(DMA1_Channel4);   //将DMA的通道1寄存器重设为缺省值
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外设ADC基地址
  DMA_InitStructure.DMA_MemoryBaseAddr     = (u32)g_rev_usart1.auch_send_buffer;//DMA内存基地址
  DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;//内存作为数据传输的目的地
  //DMA_InitStructure.DMA_BufferSize         = 10;//DMA通道的DMA缓存的大小
  DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;//外设地址寄存器不变
  DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;//内存地址寄存器递增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为16位
  DMA_InitStructure.DMA_MemoryDataSize     = DMA_PeripheralDataSize_Byte;//数据宽度为16位
  DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;//工作在非循环模式,发送完指定长度数据即停止
  DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;//DMA通道x拥有高优先级
  DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
 
  DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
 
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    //
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    //
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
 
//  RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口3
//  RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
    
  USART_DeInit(USART1);
  USART_InitStructure.USART_BaudRate = 115200;//波特率设置
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
  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);//初始化串口
 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 
  USART_Cmd(USART1, ENABLE);                    //使能串口
  USART_ClearFlag(USART1 , USART_FLAG_TC);
}

查看USART管脚和SPI2管脚,并没有什么联系冲突呀,唯一有联系的是USART1的tx和rx也是TIM1_CH2,TIM1_CH3,SPI2的MISO和MOSI也是TIM1_CH1N,TIM1_CH2N.除非定时器配置错了让两者有联系,所以这里又把TIM1的四个管脚给配置成TIM1_CH1为AF_PP模式,其他的为普通未设置,TM1_CH1N为Disable,还是不行

折腾了很久于是没办法把板子擦除重新烧了次程序,竟然所有任务都运行正常了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM