STM32 C++编程 004 Adc (数模转换)类
2016-09-07 22:16
429 查看
使用 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 类。
相关文章推荐
- 二叉树基本操作C++
- 32位机和64位机下面各类型sizeof的大小
- LeetCode 34. Search for a Range(binary search)
- C++ 引用计数技术及智能指针的简单实现
- C++算法,将一个图像逆时 针旋转 90 度
- 《Effect C++》学习------条款10:令 operator= 返回一个 reference to *this
- 《Effect C++》学习------条款09:绝不在构造和析构过程中调用virtual函数
- 《Effect C++》学习------条款08:别让异常逃离析构函数
- 初试C++文件流
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- c++继承赋值兼容
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
- 第二周项目1--C/C++语言中函数参数传递的三种方式
- C++版的顺序表
- [置顶] C++的多态及实现
- 第二周项目1-C/C++语言中函数参数传递的三种方式
- C语言之函数printf()的用法
- C++之内联函数
- C语言中的声明以及static关键字