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个通道
一周热门 更多>