#include "stm32f10x.h"

/* RCC时钟配置 */
void RCC_config(void)

ErrorStatus HSEStartUpStatus;

/* RCC寄存器设置为默认配置 */
RCC_DeInit();
/* 打开外部高速时钟 */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待外部高速时钟稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) 

/* 设置HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 设置PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 设置PCLK1 = HCLK / 2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置FLASH代码延时 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能预取址缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 设置PLL时钟源为HSE倍频9 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 设置PLL为系统时钟源 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待系统时钟源切换到PLL */
while(RCC_GetSYSCLKSource() != 0x08);
}
}

/* 毫秒延时函数 */
void delay_ms(uint16_t time)
{    
uint16_t i = 0;

while(time--)
{
i = 12000;
while(i--);    
}
}

/* GPIO配置 */
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 开启GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* 模拟输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/* ADC配置 */
void ADC_config(void)
{
ADC_InitTypeDef ADC_InitStructure;

/* 使能时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* 配置ADC时钟12MHz */
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* 独立模式 */
ADC_InitStructure.ADC_ScanConvMode = ENABLE; /* 扫描模式 */
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /* 连续转换模式 */
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 软件触发 */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 数据右对齐 */
ADC_InitStructure.ADC_NbrOfChannel = 3; /* 3个通道 */
ADC_Init(ADC1, &ADC_InitStructure);

/* 模拟通道0、采样序列1、采样周期55.5 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 3, ADC_SampleTime_55Cycles5);

/* 使能ADC */
ADC_Cmd(ADC1, ENABLE);

/* 重置校准寄存器 */
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));

/* 开始校准 */
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

/* 使能ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* 启动转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
/* 等待转换结束 */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
}

/* 转换值 */
uint16_t conv_value[3];

/* DMA配置 */
void DMA_config(void)
{
DMA_InitTypeDef DMA_InitStructure;

/* 使能时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* 将DMA1通道1重设为缺省值 */
DMA_DeInit(DMA1_Channel1);
/* 外设基地址 */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
/* 缓存基地址 */
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)conv_value;
/* 外设作为数据传输的来源 */
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
/* 缓存大小 */
DMA_InitStructure.DMA_BufferSize = 3;
/* 外设地址寄存器不变 */
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/* 内存地址寄存器递增 */
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/* DMA数据宽度16位 */
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
/* 外设数据宽度16位 */
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
/* 工作在循环缓存模式 */
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
/* DMA通道拥有非常高优先级 */
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
/* DMA通道没有设置为内存到内存传输 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/* 初始化该DMA通道 */
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* 使能该DMA通道 */
DMA_Cmd(DMA1_Channel1, ENABLE);
}

/* 主函数 */
int main(void)
{
/* RCC时钟配置 */
RCC_config();

/* IO配置 */
GPIO_config();

/* DMA配置 */
DMA_config();

/* ADC配置 */
ADC_config();

while(1)
{
delay_ms(1000);
}
}

STM32之ADC多通道连续例程相关推荐

  1. HAL库学习笔记ADC篇----ADC多通道连续转换+DMA方式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Cube配置(F407VET6) 二.使用步骤 1. 代码总览 2.代码注意事项以及解析 总结 前言 第一次写,无 ...

  2. stm32之ADC应用实例(单通道、多通道、基于DMA)

    硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗). 所用的芯片内嵌3个12位的模拟/数 ...

  3. STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)

    STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) ​ 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...

  4. STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换

    目录 一.ADC 模数转换器 1.1ADC简介 1.2 逐次逼近型ADC工作原理 1.3STM32中的ADC基本结构 1.4STM32中ADC的输入通道 1.5STM32中的ADC的四种转换模式 1. ...

  5. STM32 ADC多通道采集

    ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...

  6. STM32自学笔记ADC多通道扫描

    STM cubemx STM32F1 ADC多通道采集(非DMA) ADC模式介绍: 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了.这个模式就是自动扫描你开启的所有通道进行转换,直至 ...

  7. stm32 DMA转运ADC多通道

    一.DMA的使用方法 了解概念: 1.单次传输和循环传输:在DMA中源地址中的数据传输之后,如果要关闭DMA再打开才能继续传输.在如果传输玩后自动开始下一次传输,就是循环传输. 2.触发选择:软件触发 ...

  8. stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

  9. STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

最新文章

  1. 修改mysql+io算法_MySQL磁盘IO设置问题
  2. [网络流24题]太空飞行计划
  3. 【测试点5】1007 Maximum Subsequence Sum (25 分)
  4. 中文分句java_基于CRF序列标注的中文依存句法分析器的Java实现
  5. java中mvc事务_Spring MVC 事务配置
  6. Linux下Bash编程之算术运算符详解(三)
  7. 本特利振动变送器990-05-50-02-00
  8. 计算机核心期刊新排名(八大学报)
  9. 济南市公安局人口数据备份库项目(数据复制)之二
  10. 何为文件系统,何为根文件系统?
  11. 类的成员函数指针和静态成员函数指针 调用成员函数***
  12. python一些优秀第三方包
  13. matlab中电流表在哪儿,电流表的符号
  14. 快速删除包含指定数字的数据
  15. 【SW7203】智融新料号SW7203,支持1-4S,双向升降压,路径管理,可搭配SW2303,实现车充、移动电源100W
  16. “马云概念股”起舞 智慧物流大数据风起云涌
  17. 视频号品牌私域运营的困境与应对策略
  18. Scapy的下载和安装(二)
  19. 简户检测 | 上海可靠性——电子胶带剥离力测试、胶带初粘力试验、胶黏剂剪切强度试验、高速剥离力测试、拉力测试
  20. Brison归因与代码

热门文章

  1. python字典文件,python-文件转字典,字典转文件
  2. 计算机等级考试java题型_计算机等级考试报考建议
  3. jsp 导入java类_JSP页面导入问题。类文件放在WEB-INF / classes中的包中
  4. linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路
  5. jsp数据传入html页面_曾经风光无限的 JSP,为什么现在很少有人使用了?
  6. dev c++ 代码补全_学习干货——玩转DEV—C++
  7. 【C语言重点难点】数据类型、常量和变量
  8. 4-1:C/C++内存管理
  9. python numpy中数组.min()
  10. qt利用QSplitter任意拆分窗口