STM32 C++编程 004 Adc (数模转换)类
使用 C++ 语言给 STM32 编写一个 Adc 类
我使用的STM32芯片:STM32F103ZET6
我们使用的STM32库版本:V3.5.0
注意:
想学习本套 STM32 C++编程 的专栏是有点门槛的。你需要有一点点 STM32 基础 和 一点点 C++ 语言基础。
完整的STM32 C++ Adc类 的下载地址可以在本篇博客的最下面找到。
Adc.cpp
#include "Adc.h"
using namespace stm32f10x;
Adc::Adc(ADC_TypeDef* ADCx, uint8_t ADC_Channel):adcx(ADCx), channel(ADC_Channel){
initialize();
start();
}
void Adc::initialize(){
switch(channel){
case 0:
a = new Gpio(PA, 0, GPIO_Mode_AIN); delete a; break;
case 1:
a = new Gpio(PA, 1, GPIO_Mode_AIN); delete a; break;
case 2:
a = new Gpio(PA, 2, GPIO_Mode_AIN); delete a; break;
case 3:
a = new Gpio(PA, 3, GPIO_Mode_AIN); delete a; break;
case 4:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PA, 4, GPIO_Mode_AIN); delete a; break;
case (uint32_t)ADC3:
a = new Gpio(PF, 6, GPIO_Mode_AIN); delete a; break;
}
break;
case 5:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PA, 5, GPIO_Mode_AIN); delete a; break;
case (uint32_t)ADC3:
a = new Gpio(PF, 7, GPIO_Mode_AIN); delete a; break;
}
break;
case 6:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PA, 6, GPIO_Mode_AIN); delete a; break;
case (uint32_t)ADC3:
a = new Gpio(PF, 8, GPIO_Mode_AIN); delete a; break;
}
break;
case 7:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PA, 7, GPIO_Mode_AIN); delete a; break;
case (uint32_t)ADC3:
a = new Gpio(PF, 9, GPIO_Mode_AIN); delete a; break;
}
break;
case 8:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PB, 0, GPIO_Mode_AIN); delete a; break;
case (uint32_t)ADC3:
a = new Gpio(PF, 10, GPIO_Mode_AIN); delete a; break;
}
break;
case 9:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PB, 1, GPIO_Mode_AIN); delete a; break;
}
break;
case 10:
a = new Gpio(PC, 0, GPIO_Mode_AIN); delete a; break;
case 11:
a = new Gpio(PC, 1, GPIO_Mode_AIN); delete a; break;
case 12:
a = new Gpio(PC, 2, GPIO_Mode_AIN); delete a; break;
case 13:
a = new Gpio(PC, 3, GPIO_Mode_AIN); delete a; break;
case 14:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PC, 4, GPIO_Mode_AIN); delete a; break;
}
break;
case 15:
switch((uint32_t)adcx){
case (uint32_t)ADC1:
case (uint32_t)ADC2:
a = new Gpio(PC, 5, GPIO_Mode_AIN); delete a; break;
}
break;
}
ADC_InitTypeDef ADC_InitStructure;
if((uint32_t)adcx < APB2PERIPH_BASE){
uint32_t RCC_APB1Periph = (uint32_t)(1<< ( ((uint32_t)adcx-APB1PERIPH_BASE)>>10));
RCC_APB1PeriphClockCmd(RCC_APB1Periph, ENABLE);
}
else{
uint32_t RCC_APB2Periph = (uint32_t)(1<< ( ((uint32_t)adcx-APB2PERIPH_BASE)>>10));
RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);
}
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
// ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(adcx, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(adcx, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(adcx); //使能复位校准
while(ADC_GetResetCalibrationStatus(adcx)); //等待复位校准结束
ADC_StartCalibration(adcx); //开启AD校准
while(ADC_GetCalibrationStatus(adcx)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
uint16_t Adc::read(){
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(adcx, channel, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(adcx, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(adcx, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(adcx); //返回最近一次ADC1规则组的转换结果
}
uint16_t Adc::read(uint8_t cout){
u32 temp_val=0;
u8 t;
for(t=0;t<cout;t++){
temp_val+= read();
}
return temp_val/cout;
}
void Adc::start(){
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
void Adc::stop(){
ADC_SoftwareStartConvCmd(ADC1, DISABLE); //使能指定的ADC1的软件转换启动功能
}
Adc.h
#ifndef __AOBO_Stm32f10x_Adc_H_
#define __AOBO_Stm32f10x_Adc_H_
#include "stm32f10x.h"
#include "Gpio.h"
namespace stm32f10x{
class Adc{
public:
Adc(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
void initialize();
uint16_t read();
uint16_t read(uint8_t cout);
void start();
void stop();
private:
Gpio *a;
ADC_TypeDef* adcx;
uint8_t channel;
};
}
#endif
main.cpp
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "Gpio.h"
#include "Usart.h"
#include "Adc.h"
using namespace stm32f10x;
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void){
Usart serial(USART1, 115200);
Adc adc1(ADC3, 11);
while(true){
serial.println("ADC1: %d", adc1.read());
}
}
搞定
你可以到这里下载我已经做好的 STM32 C++ Adc类:
百度云 链接:http://pan.baidu.com/s/1bpbZ2MV 密码:esam
也可以在CSDN里面下载:http://download.csdn.net/detail/github_35160620/9624596
小结:
下一讲,我们来使用 C++ 语言,创建一个 STM32 的 硬件 I2c 类。
STM32 C++编程 004 Adc (数模转换)类的更多相关文章
- STM32 C++编程 003 USART(串口)类
使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...
- STM32 C++编程 005 I2c(Soft)类
使用 C++ 语言给 STM32 编写一个 I2c(Soft)类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编 ...
- STM32 C++编程 002 GPIO类
使用 C++ 语言给 STM32 编写一个 Gpio 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专 ...
- STM32 C++编程 001 工程模板
将 STM32的官方工程模板 修改为我们这套教材的:STM32 C++工程模板 我使用的 STM32 库的版本 : V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏是有点门槛的.你需要 ...
- Socket网络编程(TCP/IP/端口/类)和实例
Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...
- Java学习day7面向对象编程1-对象和类
一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...
- Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象
什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...
- STM32库函数编程、Keli/MDK、stm32f103zet6
catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...
- 《寒江独钓_Windows内核安全编程》中修改类驱动分发函数
最近在阅读<寒江独钓_Windows内核安全编程>一书的过程中,发现修改类驱动分发函数这一技术点,书中只给出了具体思路和部分代码,没有完整的例子. 按照作者的思路和代码,将例子补充完整,发 ...
随机推荐
- javascript常用的数组操作
数组的定义 var arr=new Array(); var arr=[]; var arr=new Array(10);//定义一个长度为10的数组 数组元素的访问 var temp=arr[1]; ...
- nyoj-1016-德莱联盟(向量叉乘判断线段相交)
叉乘的坐标表示: A(X1,Y1), B(X2, Y2), C(XC,YC), D(XD, YD);AB = (X2-X1, Y2-Y1);CD = (XD-XC, YD-YC); 向量AB,CD的叉 ...
- codeforces C. Pearls in a Row map的应用
C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- apache php配置 虚拟目录 和 虚拟主机 多域名配置 原理解析
虚拟目录配置 就是说,我们放项目放在D盘,F盘,而不是默认的www文件夹下也可以访问.比如这里,我在 D:/PHP/work 放入的项目文件. 在httpd.conf加入: (位置一般是在 </ ...
- BZOJ3289:Mato的文件管理
浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...
- 首次db查询时延迟明显高于后面几次。
1.如果排查到时db相关的问题的话,一般都是连接池的配置问题. 在配置好连接池时一定要注意对连接也进行初始化配置,否则可能出现连接池初始化了,但是连接并没有初始化,这样在第一次查询的时候可能会出现较大 ...
- error: cast from ‘char*’ to ‘int’ loses precision
程序: char* addrCom; addrCom= ......//赋值 == (int)addrCom) //导致编译出错 { ...... } 编译时出现错误: error: cast fro ...
- C# Application Excel TreeView
三章 应用 20节客户表登陆 //动软--单表--Models --新建.net项目--简单三层管理--DBUtity--DbHelper.cs 21节客户表数据读取 增加 CEnterprise(企 ...
- 使用Spring Boot 和Spring Data JPA访问mysql数据库
在Spring中使用JdbcTemplate是一种基本的数据访问方式,但是仍然需要较多的代码,为了解决这些大量枯燥的数据操作语句,我们可以使用ORM框架,比如:Hibernate,通过整合Hibern ...
- 创建github怎样管理
创建版本库 第一步: 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录 $mkdir learngit $cd learngit $pwd mkdir learngit 创建一个名叫“ ...