void Adc_Init(void)
AD初始化设置
*******************************************************************************/
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*******************ADC**************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE ); //使能PORTC通道时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*******************TIM**************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //使能TIM1时钟
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
/* 定时计算:(1 /(72 / (36 - 1 + 1))) * 780 us = 390us */
TIM_TimeBaseStructure.TIM_Period = 780; //自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=36 - 1; //TIMx 时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化定时器
/* TIM1 通道1配置PWM工作模式 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1工作模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100; //占空比75%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //使能预装载寄存器
/*******************DMA**************/
/* 使能DMA时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 第1通道配置(对应外设ADC1) ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1); //开启DMA1的第1通道
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //DMA对应的外设基地址,即 ADC1_DR寄存器基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //内存存储基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA传输方向单向,转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize = AD_BUF_SIZE; //DMA缓存大小,1个
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
/* 使能 DMA1 第1通道 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/*******************ADC**************/
/* 使能ADC1和GPIOC时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* ADC1 配置 ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立的转换模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描模式(多通道)
// ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启 连续转换模式
// ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC外部开关,关闭状态
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭 连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //转换外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式,ADC为12位中,右对齐方式
ADC_InitStructure.ADC_NbrOfChannel = 5; //开启通道数,5个
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 规则模式通道配置 */
/* ADC1 通道组 第10~13个通道 采样顺序1~4,转换时间 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_239Cycles5);
/* ADC1 regular channel16 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 5, ADC_SampleTime_55Cycles5); //ADC1,ADC通道16
ADC_TempSensorVrefintCmd(ENABLE); //ADC内置温度传感器使能(要使用片内温度传感器,切记要开启它)
/* 使能 ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* 使能 ADC1 外部触发 */
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
/* 使能 ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 使能 ADC1 重新校准 */
ADC_ResetCalibration(ADC1);
/* 等待 ADC1 重新校准完成*/
while(ADC_GetResetCalibrationStatus(ADC1));
/* 开始 ADC1 校准 */
ADC_StartCalibration(ADC1);
/* 等待 ADC1 校准完成 */
while(ADC_GetCalibrationStatus(ADC1));
/* 连续转换开始,ADC1 通过 DMA 方式不断的更新RAM区。 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
/*******************TIM**************/
/* TIM1 使能 */
TIM_Cmd(TIM1, ENABLE);
/* TIM1 主输出使能 */
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA_IT_TC))
{
DMA_ClearITPendingBit(DMA_IT_TC); //清除全部中断标志
}
}
一周热门 更多>