首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32学习笔记之ADC--DMA方式

STM32学习笔记之ADC--DMA方式

程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据:

STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。
/************************************************************************
     Copyright (c) 2008 wormchen            
     All rights reserved            
文 件 名: main.c              
说    明: 将ADC转换值通过串口发送到PC端         
主要硬件: EMSTM32V1+miniSTMV100(外部8MRC)         
编译环境: MDK3.10              
当前版本: 1.0               
作    者: 陈崇               
完成日期: 2008年3月24日9:08:41           
取代版本: 1.0               
原作  者: 陈崇              
完成日期: 2008年3月24日9:08:46         
************************************************************************/
#include <stm32f10x_lib.h>
#include <stdio.h>

#define ADC1_DR_Address    ((u32)0x4001244C)
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

vu16 ADC_ConvertedValue;
void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
void ADC_Config(void);
void Put_String(u8 *p);
void Delay(vu32 nCount);
int main(void)
{
RCC_Config();
GPIO_Config();
USART_Config();
DMA_Config();
ADC_Config();


while(1)
{

  Delay(0x8FFFF);  
   printf("ADC = %X Volt = %d mv/r/n", ADC_ConvertedValue, ADC_ConvertedValue*3300/4096);
  
}
}
/*************************************************
函数: void RCC_Config(void)
功能: 配置系统时钟
参数: 无
返回: 无
**************************************************/
void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
RCC_DeInit();//复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好
    {

   RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)钟=AHB 1/2时钟
      RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟=PCLK2 1/4
      
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   //配置PLL时钟 == 外部高速晶体时钟*9
   RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟= PCLK2/4

      RCC_PLLCmd(ENABLE);//使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
       {
       }
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟
  
      while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
       {
       }
  }
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);//使能DMA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  //使能ADC1,GPIOC时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  //打开GPIOD和AFIO时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2时钟
}
/*************************************************
函数: void GPIO_Config(void)
功能: GPIO配置
参数: 无
返回: 无
**************************************************/
void GPIO_Config(void)
{
//设置RTS(PD.04),Tx(PD.05)为推拉输出模式
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//选择PIN4 PIN5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚频率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚设置推拉输出
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD
//配置CTS (PD.03),USART2 Rx (PD.06)为浮点输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//配置PC4为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}
继承事业,薪火相传
返回列表