|
6. ADC模数转换--多通道-DMA方式 - TIM4_CH4外部触发
普中6806L的板子,扩展程序里面的6. ADC模数转换--多通道-DMA方式 - TIM4_CH4外部触发
初始化定时器4,ADC触发选择的是ADC_ExternalTrigConv_T3_TRGO
查阅其他资料发现还要用TIM_SelectOutputTrigger选择触发源,但是这个程序里面都没有,却可以正确运行,有大神可以帮忙看看吗- oid ADCx_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
- ADC_InitTypeDef ADC_InitStructure;
- DMA_InitTypeDef DMA_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
- // 打开DMA时钟
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- // 复位DMA控制器
- DMA_DeInit(DMA1_Channel1);
-
- // 配置 DMA 初始化结构体
- // 外设基址为:ADC 数据寄存器地址
- DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( & ( ADC1->DR ) );
-
- // 存储器地址,实际上就是一个内部SRAM的变量
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertValue;
-
- // 数据源来自外设
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
-
- //数据数
- DMA_InitStructure.DMA_BufferSize = 5;
-
- // 外设寄存器只有一个,地址不用递增
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- // 存储器地址固定
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
-
- // 外设数据大小为半字,即两个字节
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
-
- // 内存数据大小也为半字,跟外设数据大小相同
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
-
- // 循环传输模式
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
- // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
-
- // 禁止存储器到存储器模式,因为是从外设到存储器
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
-
- // 初始化DMA
- DMA_Init(DMA1_Channel1, &DMA_InitStructure);
-
- // 使能 DMA 通道
- DMA_Cmd(DMA1_Channel1 , ENABLE);
-
-
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
-
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//ADC
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
- GPIO_Init(GPIOC,&GPIO_InitStructure);
-
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
- ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//打开连续转换
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;//禁止触发检测,使用软件触发
- ADC_InitStructure.ADC_DataAlign = ADC_ExternalTrigConv_T4_CC4;//右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 5;//1个转换在规则序列中 也就是只转换规则序列1
- ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
-
- ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度
- ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度
- ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_239Cycles5);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_239Cycles5);
-
- ADC_Cmd(ADC1, ENABLE);//开启AD转换器
-
- // 使能ADC DMA 请求
- ADC_DMACmd(ADC1, ENABLE);
-
- ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
- while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
-
- ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
- while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
- ADC_SoftwareStartConvCmd(ADC1, DISABLE);//使能或者失能指定的ADC的软件转换启动功能
-
- }
- 定时器部分
- void TIM4_Init(u16 per,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
-
- TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
- TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
- TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
-
- TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
- TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure);
-
- TIM_Cmd(TIM4,ENABLE); //使能定时器
- }
- /*******************************************************************************
- * 函 数 名 : TIM4_IRQHandler
- * 函数功能 : TIM4中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- extern float vol[5];
- void TIM4_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM4,TIM_IT_Update))
- {
- //led2=!led2;
- vol[0]=(float)ADC_ConvertValue[0]*(3.3/4096);
- printf("检测vol[0]电压值为:%.2fV\r\n",vol[0]);
- vol[1]=(float)ADC_ConvertValue[1]*(3.3/4096);
- printf("检测vol[1]电压值为:%.2fV\r\n",vol[1]);
- vol[2]=(float)ADC_ConvertValue[2]*(3.3/4096);
- printf("检测vol[2]电压值为:%.2fV\r\n",vol[2]);
- vol[3]=(float)ADC_ConvertValue[3]*(3.3/4096);
- printf("检测vol[3]电压值为:%.2fV\r\n",vol[3]);
- vol[4]=(float)ADC_ConvertValue[4]*(3.3/4096);
- printf("检测vol[4]电压值为:%.2fV\r\n",vol[4]);
- }
- TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
- }
复制代码 |
|