使用 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);  //使能指定的ADC1ADC_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 类。

转载于:https://www.cnblogs.com/aobosir/p/5928562.html

STM32 C++编程 004 Adc (数模转换)类相关推荐

  1. 5.STM32外设都有哪几类寄存器?(详解)

    STM32外设都有以下几类寄存器:

  2. STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式,也有间断模式,间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作,在实际工程应用中,可以利用间断模式实现一些特殊应用.关于间断模式,在STM32 ...

  3. STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...

  4. python机械编程_机器学习编程作业3——多类分类(Python版)

    本次编程作业的实现环境是Python3.Anaconda3(64-bit).Jupyter Notebook.是在深度之眼"机器学习训练营"作业基础上完成的,个别代码有修改,供交流 ...

  5. C# 网络编程之使用Socket类Send、Receive方法的同步通讯

    经过几天学习,终于解决了再C#网络编程中使用Socket类Send和Receive方法开发的客户端和服务端的同步通讯程序:实现了又客户端想服务器发送消息的界面程序.主要使用的方法是:       1. ...

  6. iTOP-4412开发板实现3路ADC数模转换驱动例程

    学习下 linux 数模程序驱动的编写,本节我们实现的功能是实现三路 ADC 数模转换. 驱动程序 驱动程序的名字:"itop4412_adc.c". 要想把这个驱动注册到内核,先 ...

  7. 编程题【System类】计算一千万个数添加到集合的时间

    import java.util.ArrayList;/*** ## 编程题[System类]* <p>* 请定义一个集合,并将1至1千万这1千万个数字添加到集合中* ,计算这个行为运行的 ...

  8. 编程题【Math类】计算类

    /*** ## 编程题[Math类]* 参考API文档完成下面需求:* 编程进行以下运算:* 请计算3的5次幂* 请计算3.2向上取整的结果* 请计算3.8向下取整的结果* 请计算5.6四舍五入取整的 ...

  9. php面向对象异常处理,PHP面向对象编程——自定义PHP异常处理类

    /* ?* WEB开发笔记 www.chhua.com 每日练习 PHP面向对象编程--自定义PHP异常处理类 ?* 这所以用自定义的异常类,主要是区分异常来自程序的哪一部分,比如是来自MYSQL的还 ...

最新文章

  1. linux 正则查找email_Linux生产环境上,最常用的一套“Sed“技巧
  2. ML基石_3_TypesOfLearning
  3. php上传图片k,PHP fastcgi模式上传大文件(大约有300多K)报错,
  4. iOS开发网络篇—NSURLConnection基本使用
  5. Cocos-2d 坐标系
  6. 五行塔怎么吃第五个_红毛丹怎么吃 吃红毛丹的五个好处
  7. OpenCV提炼角点位置的实例(附完整代码)
  8. Office文档模型深入---Outlook文档模型与开发实战(1)
  9. apache kafka_Apache Kafka简介
  10. n维向量,n维向量空间,n维向量空间的维数
  11. 企业IT机房中使用什么灭火器?
  12. 【拓展】谈谈字符编码:Unicode编码与emoji表情编码
  13. GitHub使用教程、注册与安装
  14. SpringBoot 微信点餐系统学习记录六-订单表和订单详情表的后端开发
  15. 滴滴研究院副院长叶杰平 | 大规模稀疏和低秩学习
  16. Katalon自动化测试
  17. android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程
  18. 鸭子心包积液发病比较多是因为什么该怎么治疗
  19. 咖说丨一文说清“链上”和“链下”
  20. 基于STM32的环境检测系统(DHT11、BMP280、1602、MQ2)

热门文章

  1. SQL Server 查询性能优化——覆盖索引(一)
  2. hbuilderx的快捷键整理pdf_47个电脑快捷键大全,让你工作提升100倍,一般人我不告诉他...
  3. 写篇技术博客被简书锁定是一种什么样的体验
  4. c语言用链表实现成绩管理系统,C语言写的学生成绩管理系统(链表)
  5. .net core WebAPI 初探及连接MySQL
  6. .NET Core Linux环境搭建(CentOS 7)
  7. python多项式求导_Python求离散序列导数的示例
  8. asp.net mvc 压缩html代码,浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
  9. Spark Streaming保存到HDFS目录中案例
  10. Hadoop hdfs编程案例和java交互