stm32只用ADC中断问题

2019-08-14 19:42发布

void ADC2_DMA_Config(void)
{
  ADC_InitTypeDef ADC_InitStructure;//定义ADC结构体

     NVIC_InitTypeDef NVIC_InitStructure;
       GPIO_InitTypeDef GPIO_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = 18;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级2级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器   














  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2| RCC_APB2Periph_GPIOA, ENABLE ); //使能ADC1及GPIOA时钟
  /*作为ADC1的6通道模拟输入的GPIO初始化配置*/
  //PA2,3,4,5,6,7配置为模拟输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
  GPIO_Init(GPIOC, &GPIO_InitStructure);



  /*下面为ADC1的配置*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1工作在独立模式
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//模数转换工作在扫描模式(多通道)
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//模数转换工作在连续模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 10;//转换的ADC通道的数目为6
  ADC_Init(ADC2, &ADC_InitStructure);//要把以下参数初始化ADC_InitStructure

  /* 设置ADC1的6个规则组通道,设置它们的转化顺序和采样时间*/
  //转换时间Tconv=采样时间+12.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //ADC1通道2转换顺序为1,采样时间为7.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);//ADC1通道3转换顺序为2,采样时间为55.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); //ADC1通道2转换顺序为1,采样时间为7.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5);//ADC1通道3转换顺序为2,采样时间为55.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 5, ADC_SampleTime_239Cycles5); //ADC1通道2转换顺序为1,采样时间为7.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 6, ADC_SampleTime_239Cycles5);//ADC1通道3转换顺序为2,采样时间为55.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 7, ADC_SampleTime_239Cycles5); //ADC1通道2转换顺序为1,采样时间为7.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 8, ADC_SampleTime_239Cycles5);//ADC1通道3转换顺序为2,采样时间为55.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 9, ADC_SampleTime_239Cycles5); //ADC1通道2转换顺序为1,采样时间为7.5个周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 10, ADC_SampleTime_239Cycles5);//ADC1通道3转换顺序为2,采样时间为55.5个周期
  /*使能ADC1的DMA传输方式*/
//  ADC_DMACmd(ADC2, ENABLE);
  /*使能ADC1 */
  ADC_TempSensorVrefintCmd(ENABLE);
  ADC_Cmd(ADC2, ENABLE);
  /*重置ADC1的校准寄存器 */   
  ADC_ResetCalibration(ADC2);
  /*获取ADC重置校准寄存器的状态*/
  while(ADC_GetResetCalibrationStatus(ADC2));
  ADC_StartCalibration(ADC2); /*开始校准ADC1*/
  while(ADC_GetCalibrationStatus(ADC2)); //等待校准完成
  ADC_SoftwareStartConvCmd(ADC2, ENABLE);//使能ADC1软件转换
  ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);
}
//void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)         
//{
//        u32 temp;       
//        u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址
//        u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
//        IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
//        MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
//        temp=NVIC_PreemptionPriority<<(4-NVIC_Group);          
//        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
//        temp&=0xf;//取低四位
//
//        if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
//        else NVIC->ISER[1]|=1<<(NVIC_Channel-32);   
//        NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级                                                           
//}
void ADC1_2_IRQHandler(void)
{

adcval[i]=ADC2->DR;
//adcval[i]=JOFR1;
UART_Put_Num(i)        ;
printf("ADC:%d ",adcval[i]);
i++;
if(i>9)
i=0;

//        printf("ADC:%d ",adcval);
ADC2->SR&=~(1<<1);        //清除中断
}
没用dma,想只用中断去到10个通道的值,把pa0引脚接地,中断串口打印结果如下
0ADC:0
1ADC:2267
2ADC:0
3ADC:2058
4ADC:0
5ADC:2109
6ADC:0
7ADC:2190
8ADC:0
9ADC:0
0ADC:2192
1ADC:0
2ADC:2065
3ADC:0
4ADC:2110
5ADC:0
6ADC:2188
7ADC:0
8ADC:2220
9ADC:0
0ADC:0
1ADC:2221
2ADC:0
3ADC:2126
4ADC:3
5ADC:2188
6ADC:0
7ADC:2187
8ADC:1
9ADC:0
0ADC:2186
1ADC:0
2ADC:2120
3ADC:0
4ADC:2193
5ADC:0
6ADC:2196
7ADC:1
结果是这这个引脚的电压值不出现在固定位置,我想知道进中断时DR里的数到底应该时那个,不用DMA能不能同事采集10个通道


0条回答

一周热门 更多>