stm32-10ADC实验(DMA方式)

该博客介绍了如何在STM32上使用DMA进行ADC实验,涉及ADC端口初始化、ADC和DMA模式配置、DMA及ADC结构体初始化、采样周期和触发方式设置,并详细解析了关键函数的实现过程。

stm32-10ADC实验(DMA方式)


一、ADC相关
1. 介绍

12位ADC是一种逐次逼近型模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

2. 框图

ADC功能框图

3. 方法

ADC采集转换 -> ADC数据寄存器 -> 内存ADC_ConvertedValue -> 串口

  • ADC1_GPIO_Config();//ADC端口初始化
  • 打开ADC,DMA,GPIO相关时钟
  • 配置GPIO引脚,模式等
  • ADC1_Mode_Config();//ADC模式设置
  • DMA初始化
    • 将 DMA 的通道 x 寄存器重设为缺省值
    • 为DMA_Init结构体赋值
      u32 DMA_PeripheralBaseAddr;
      u32 DMA_MemoryBaseAddr;
      u32 DMA_DIR;
      u32 DMA_BufferSize;
      u32 DMA_PeripheralInc;
      u32 DMA_MemoryInc;
      u32 DMA_PeripheralDataSize;
      u32 DMA_MemoryDataSize;
      u32 DMA_Mode;
      u32 DMA_Priority;
      u32 DMA_M2M;
    • 初始化DMA相关寄存器
  • ADC初始化:
    • 为ADC_Init结构体赋值
      uint32_t ADC_Mode;
      FunctionalState ADC_ScanConvMode;
      FunctionalState ADC_ContinuousConvMode;
      uint32_t ADC_ExternalTrigConv;
      uint32_t ADC_DataAlign;
      uint8_t ADC_NbrOfChannel;
    • 初始化ADC相关寄存器
  • ADC转换时间配置
    • 配置ADC时钟
    • 配置采样周期
  • 使能ADC1的DMA
  • 使能ADC1
  • ADC自校准
    • 复位校准寄存器
    • 等待复位完成
    • 校准ADC
    • 等待
  • 设置启动触发方式:软件开启转化
  • 读取转换的AD值
  • 打印到串口调试助手

二、程序分析
1. main.c
  1. 配置 USART1:将采集的模拟电压值显示到串口调试助手
  2. 配置ADC:采集电压值并用DMA传输到SRAM
  3. 打印
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_adc.h"

//time : pc1-1 0      1us
//       pc1-2 0 0.5us    1.5us
//		 pc1-3 0 0.5us 	  0.8us

// ADC1转换的电压值通过MDA方式传送到SRAM:ADC_ConvertedValue
extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转化计算后的电压值
float ADC_ConvertedValueLocal;

// 软件简单延时函数
void Delay(__IO uint32_t nCount)
{
   
   
  for(; nCount != 0; nCount--);
} 

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
   
   	
	/* USART1 config */
	USART1_Config();
	
	/* enable adc1 and config adc1 to dma mode */
	ADC1_Init();
	
	printf("\r\n ----这是一个ADC实验(采用DMA传输)----\r\n");
	
	while (1)
	{
   
   
		ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096 * 3.3; // 读取转换AD的值
	
		printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); 
		printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); 

		Delay(0xffffee);  
	}
}
2.ADC1_Init()
void ADC1_Init(void)
{
   
   
	ADC1_GPIO_Config();//ADC端口初始化
	ADC1_Mode_Config();//ADC模式设置
}
1.关于ADC1_GPIO_Config函数
/**
  * @brief  使能ADC1和MDA1的时钟,初始化PC.01
  * @param  
  * @retval 
  */
static void ADC1_GPIO_Config(void)
{
   
   
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* Enable DMA clock */
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值