【原创】【原创】stm32f407stm32f407stm32f407之
之ADC 与DMA 2012-05-0116:31:00|
分类:stm32|标签:stm32cortex-m4dma printf adc |字号大中小订
阅昨天调试了stm32f407的ADC 功能,因为那个恼人的printf 函数问题这篇ADC 文章一直没有发表出来,今天5.1归来抽空补上。功能为实现ADC 的单通道电压采集,并实现DMA 数据管理,同时加了ADC 看门狗功能,并用printf 函数通过串口返回采集值与换算后的实际电压值。代码如下:
/************************************************************
Copyright (C),
2012-2022,yin.FileName:
main.c Author:
小枣年糕Date:2012\05\01
Description:ADC3DMA printf
Version:V3.0
IDE:MDK 4.22a
HardWare:stm32F407IG HSE =25M PLL =168M
History:
V1.0***********************************************************/
#include<stm32f4xx.h>
#include<stdio.h>
/*定义ADC3的数据寄存器地址,DMA 功能要用到外设的数据地址
*ADC3的数据地址为外设基地址+偏移地址,基地址在RM0090Reference *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);
stm32怎么使用printfvoid 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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。