stm32f407之ADC与DMA
/************************************************************
Copyright (C), 2012-2022, yin.
FileName: main.c
Author: 小枣年糕
Date:2012\05\01
Description: ADC3 DMA printf
Version: V3.0
IDE: MDK 4.22a
HardWare: stm32F407IG HSE = 25M PLL = 168M
History: V1.0
***********************************************************/
#include
#include
/*定义ADC3的数据寄存器地址,DMA功能要用到外设的数据地址
*ADC3的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference
*manual(参考手册)的地址映射表里,为0x40012200,ADC_DR
*偏移地址为0x4C,故实际地址为0x40012200+0x4C = 0x4001224C */
#define ADC3_DR_Addr ((uint32_t)0x4001224C)
__IO uint16_t ADCoverVaule;
//uint16_t Buffer2[] = {0x1122}; //这个是我进行内存测试用的,程序没用到
void GPIO_Config(void);
void ADC_Config(void);
void USART_Config(void);
void USART6_Puts(char * str);
void DMA_Config(void);
void NVIC_Config(void);
void Delay(uint32_t nCount);
/* printf函数重定向 */
int fputc(int ch, FILE *f);
int GetKey (void);
main()
{
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c”。
程序运行起始于启动文件的第175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M */
GPIO_Config();
ADC_Config();
USART_Config();
DMA_Config();
NVIC_Config();
GPIO_SetBits(GPIOG, GPIO_Pin_6); //关闭LED
ADC_SoftwareStartConv(ADC3); //如果不是外部触发则必须软件开始转换
while (1)
{
Delay(0x0ffffff);
//printf("size of int is %d \n", sizeof(int)); //测试可知32位系统的int占4个字节
printf("ADCoverVaule=%04X VolVaule=%d mV\n", ADCoverVaule, ADCoverVaule*3300/4096); //串口输出电压值
/*因为DMA工作是独立于CPU之外的,所以在DMA工作的同时CPU可以做其他事*/
}
}
/*************************************************
Function: void GPIO_Config(void)
Description: GPIO配置函数
Input: 无
Output:无
Return:无
*************************************************/
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOC\GPIOF\GPIOG时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
/* 初始化GPIOG的Pin_6为LED输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为快速
GPIO_Init(GPIOG, &GPIO_InitStructure); //调用IO初始化函数
/* 初始化GPIOG的Pin_9为模拟量输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* 配置GPIOC_Pin6为TX输出 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //设置为复用,必须为AF,OUT不行
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/* 配置GPIOC_Pin7为RX输入 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //这也必须为复用,与M3不同!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/* GPIO引脚复用功能设置 */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);//这相当于M3的开启复用时钟,只配置复用的引脚,
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);//
}
/*************************************************
Function: void ADC_Config(void)
Description: ADC配置函数
Input: 无
Output:无
Return:无
*************************************************/
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);//开ADC时钟
ADC_DeInit();
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精度为12位
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描转换模式失能,单通道不用
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换使能
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不用外部触发,软件触发转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,低字节对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;//规定了顺序进行规则转换的ADC通道的数目
ADC_Init(ADC3, &ADC_InitStructure);
stm32f407ADCDM 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)