/*
本文件主要是实现ADC底层驱动的实现
*/
/* 包含主要头文件 */
#include "adc.h"
/* 定义存储ADC转换结果的内存 */
uint16_t ADC_Val[4];
/*
串口1初始化函数
参数:无
返回值:无
波特率:115200
停止位:1
奇偶校验:无
数据位:8
*/
void USART1_Configuration(void)
{
/* 定义串口初始化结构体 */
USART_InitTypeDef USART_InitStructure;
/* 开启USART1和GPIOA 的时钟 */
RCC->APB2ENR|=RCC_APB2Periph_USART1;
RCC->AHB1ENR|=RCC_AHB1Periph_GPIOA;
/* GPIOA9/A10 复用模式 */
GPIOA->MODER|=GPIO_Mode_AF<<2*9|GPIO_Mode_AF<<2*10;
/* GPIOA9/A10 复用到USART1--TX/RX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
/* 配置USART结构体 */
USART_InitStructure.USART_BaudRate=115200; /* 波特率设置为115200Hz,每秒钟传输115200个二进制位 */
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; /* 硬件流失能 */
USART_InitStructure.USART_Mode=USART_Mode_Tx; /* 设置为发送模式 */
USART_InitStructure.USART_Parity=USART_Parity_No; /* 不使用奇偶校验 */
USART_InitStructure.USART_StopBits=USART_StopBits_1;/* 停止位设置为1位 */
USART_InitStructure.USART_WordLength=USART_WordLength_8b; /* 数据位设置为8位 */
/* 初始化USART1 */
USART_Init(USART1,&USART_InitStructure);
/* 开启USART1 */
USART_Cmd(USART1,ENABLE);
}
/*
重映射printf
参数:待传输字符,文件指针
返回值:传输完成测字符串
*/
int fputc( int ch , FILE *f )
{
/* 给USART1->DR 赋值就可以发送 */
USART1->DR=ch;
/* 等到发送完成 */
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
/* 返回发送完成的字符 */
return ch;
}
/*
TIM2初始化函数
参数:无
返回值:无
实现定时1s
输出溢出事件
*/
void TIM2_Configuration(void)
{
/* 定义TIM初始化结构体 */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 开启TIM2的时钟 */
RCC->APB1ENR|=RCC_APB1Periph_TIM2;
/* 配置TIM结构体 */
TIM_TimeBaseStructure.TIM_ClockDivision=0; /* 时钟不分割 */
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
TIM_TimeBaseStructure.TIM_Period=9999; /* 进过9999+1个脉冲就会溢出 */
TIM_TimeBaseStructure.TIM_Prescaler=8399; /* 时钟分频值为8399+1 */
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; /* 重复计数器设置为 0 */
/* 初始化TIM_TimeBase */
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
/* 启动定时器 */
TIM_Cmd(TIM2,ENABLE);
/* 输出TIM2溢出事件 */
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
}
/*
DMA-->>ADC_Memory初始化函数
参数:无
返回值:无
*/
void DMA_ADC_Configuration(void)
{
/* 定义DMA初始化结构体 */
DMA_InitTypeDef DMA_InitStructure;
/* 开启DMA时钟 */
RCC->AHB1ENR|=RCC_AHB1Periph_DMA2;
/* 配置DMA结构体 */
DMA_InitStructure.DMA_Channel = DMA_Channel_2; /* ADC3 在DMA2_Stream0 的通道2 上 */
DMA_InitStructure.DMA_PeripheralBaseAddr =((uint32_t)&ADC3->DR); /* 外设地址 */
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC_Val; /* 内存地址 */
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; /* 从外设到内存传输 */
DMA_InitStructure.DMA_BufferSize =4; /* 传输数据量为4 */
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_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /* 不使用FIFO */
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; /* 不使用FIFO */
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /* 存储器突发单次传输 */
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /* 外设突发单次传输 */
/* 初始化DMA2_Stream0 */
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
/* 启动DMA */
DMA_Cmd(DMA2_Stream0, ENABLE);
}
/*
ADCC3 配置
参数:无
返回值:无
*/
void ADC3_Configuration(void)
{
/* 定义ADC控制结构体 */
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
/* 开启ADC时钟 */
RCC->APB2ENR|=RCC_APB2Periph_ADC3;
/* 开启GPIOF时钟 */
RCC->AHB1ENR|=RCC_AHB1Periph_GPIOF;
/* 初始化GPIOF7/8/9/10 */
GPIOF->MODER|=GPIO_Mode_AIN<<2*7|GPIO_Mode_AIN<<2*8|GPIO_Mode_AIN<<2*9|GPIO_Mode_AIN<<2*10;
/* 初始化所有ADC结构体 */
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_1; /* 使用DMA 模式1 */
ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent; /* ADC独立模式 */
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div2; /* 分频值为2 */
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles; /* 转换速度为5个周期 */
/* 初始化所有ADC */
ADC_CommonInit(&ADC_CommonInitStructure);
/* 初始化所有ADC3结构体 */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; /* 12位精度 */
ADC_InitStructure.ADC_ScanConvMode = ENABLE; /* 指定的通道扫描使能 */
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /* 启用连续扫描 */
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; /* 不使用外部促发 */
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; /* 外部触发源 定时器1的PWM输出通道1 */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换数据右对齐 */
ADC_InitStructure.ADC_NbrOfConversion =4; /* 转换的次数 */
/* 初始化ADC3 */
ADC_Init(ADC3, &ADC_InitStructure);
/* 初始化各个通道 */
ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_3Cycles); /* 第5通道的转换速度第1 */
ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 2, ADC_SampleTime_3Cycles); /* 第6通道的转换速度第2 */
ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 3, ADC_SampleTime_3Cycles); /* 第7通道的转换速度第3 */
ADC_RegularChannelConfig(ADC3, ADC_Channel_8, 4, ADC_SampleTime_3Cycles); /* 第8通道的转换速度第4 */
/* 使能ADC3 DMA的请求 */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* Enable ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);
/* Enable ADC3 */
ADC_Cmd(ADC3, ENABLE);
}
ADC_SoftwareStartConv(ADC3);/* 软件启动ADC3转换 */
Delay(1000000);
while(RESET == DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)); /* 等待转换完成 */
printf("v1=%d\tv2=%d\tv3=%d\tv4=%d\n",ADC_Val[0],ADC_Val[1],ADC_Val[2],ADC_Val[3]);
|