如何使用ADC驱动库
1  实现如下两个函数
a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断
b:HAL_ADC_MspDeInit() 与 HAL_ADC_MspInit()作用相反,用来关闭ADC,可选 DMA,中断
2  配置ADC参数,详细参数描述参考ADC属性定义。通过HAL_ADC_Init()来加载参数
3  配置ADC通道,包括使用的通道,采样时间等 HAL_ADC_ConfigChannel()
4  校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准),必须在ADC转换启动前或停止后
5  使用下面函数中的一个激活ADC外设:
HAL_ADC_Start() -- 轮询模式
HAL_ADC_Start_IT(), -- 中断模式
HAL_ADC_Start_DMA(). -- DMA模式
ADC属性定义

•  uint32_tClockPrescaler--时钟源,同步PLL,异步HSI  ADC_CLOCK_ASYNC,ADC_CLOCK_SYNC_PCLK_DIV2,ADC_CLOCK_SYNC_PCLK_DIV4,ADC_CLOCKPRESCALER_PCLK_DIV2,ADC_CLOCKPRESCALER_PCLK_DIV4
•  uint32_tResolution  -- ADC分辨率(6,8,10,12)ADC_RESOLUTION12b........
•  uint32_tDataAlign   --数据对齐方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT
•  uint32_tScanConvMode--配置规则组序列,该参数可以关联“DiscontinuousConvMode”对主序列细分,如果设置多个通道则序列自动使能;如果只有一个通道,执行单一转换模式;如果有多个通道,执行序列转换模式;Rank(队列)定义为通道号,rank0->channel0,rank1-->channel1.....;扫描方向可以递增(0-->18)或递减(18-->0)ADC_SCAN_DIRECTION_FORWARD,ADC_SCAN_DIRECTION_BACKWARD,ADC_SCAN_ENABLE
•  uint32_tEOCSelection   -- EOC(EndOfConversion),用来做轮询或中断标记;每个rank转换结束,或序列转换结束;EOC_SINGLE_CONV,EOC_SEQ_CONV,EOC_SINGLE_SEQ_CONV(保留供以后用)
•  uint32_tLowPowerAutoWait
•  uint32_tLowPowerAutoPowerOff
•  uint32_tContinuousConvMode  --定义当选择的触发事件(软件触发 or 外部触发)发生后规则组执行单一转换还是连续转换 ENABLE or DISABLE
•  uint32_tDiscontinuousConvMode---指定当规则组是完整序列/非连续序列(序列分布在)时是否转换序列;只有在Continuous禁用时,DisContinuous才有效;如果ContinuousConvMode使能,则该参数抛弃
•  uint32_tExternalTrigConv  --触发方式 ADC_SOFTWARE_START 外部触发禁止,使用软件触发
•  uint32_tExternalTrigConvEdge  --外部触发规则,ADC_EXTERNALTRIGCONVEDGE_NONE,ADC_EXTERNALTRIGCONVEDGE_RISING,ADC_EXTERNALTRIGCONVEDGE_FALLING,ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING
•  uint32_tDMAContinuousRequests--//DMA转换请求,指定DMA执行单次(当转换数达标时停止传送)or连续请求模式;备注:连续模式:
//DMA必须配置为循环模式,否则当DMA buffer存满时将触发溢出; ENABLE or DISABLE
•  uint32_tOverrun--选择数据溢出时的行为:保存数据或覆盖数据;这个参数只作用于规则组,包含DMA

说明:
ContinuousConvMode DiscontinuousConvMode   通道结束 序列结束    
DISABLE DISABLE 单次转换 EOC EOS 单次转换 触发一次,转换一个序列(转换所有被选通道),转换结束后停止
ENABLE 无效 连续转换 EOC EOS 连续转换 触发一次,转换一个序列(转换所有被选通道),转换结束后自动重新开始
DISABLE ENABLE 断续转换 EOC EOS 断续转换 触发一次,转换一个通道,在触发,在转换。在所选转换通道循环

ADC方法:
1  初始化函数
a  自定义初始化

 HAL_ADC_Init()       用户自行调用 加载ADC属性HAL_ADC_MspInit()    由HAL_ADC_Init()调用,对底层初始化,主要包括时钟,IO,DMA等

b 缺醒初始化

  HAL_ADC_DeInit()       用户自行调用,退出ADCHAL_ADC_MspDeInit()    由 HAL_ADC_DeInit()调用,操作底层,关闭时钟,IO等

2   IO操作函数(轮询,中断,DMA 3中编程模型)

        a  激活ADC,启动转换规则组           
  •  HAL_ADC_Start()•  HAL_ADC_Start_IT()  中断模式ADC_EOC_SINGLE_CONV通道转换结束,EOC_SEQ_CONV序列转换结束•  HAL_ADC_Start_DMA()

b  关闭ADC,停止转换规则组

  •  HAL_ADC_Stop()•  HAL_ADC_Stop_IT()•  HAL_ADC_Stop_DMA()

        C  读取ADC值
             •  HAL_ADC_GetValue()
        d  其他
•  HAL_ADC_PollForConversion()      等待转换结束,不适用一下情况:DMA模式且轮询每个转换(ADC_EOC_SINGLE_CONV)
•  HAL_ADC_PollForEvent()
•  HAL_ADC_IRQHandler()             ADC中断请求,在<stm32fxx_it.c>中调用

// 回调函数,“weak”属性,使用时再在应用代码中实现
•  HAL_ADC_ConvCpltCallback()         转换完成后回调,DMA模式下DMA传输完成后调用
•  HAL_ADC_ConvHalfCpltCallback()  转换过程中回调
•  HAL_ADC_LevelOutOfWindowCallback()
•  HAL_ADC_ErrorCallback()

3  外设控制函数--动态配置外设参数

    •  HAL_ADC_ConfigChannel()  配置规则组通道
            •  HAL_ADC_AnalogWDGConfig()
   4  状态函数--返回运行状态获取错误信息
            •  HAL_ADC_GetState()
            •  HAL_ADC_GetError()

例子,ADC工作状态均为非阻塞 
1  轮询模式 -- 非阻塞    
/*##-3- Start the conversion process ######/
if(HAL_ADC_Start(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
/*##-4- Wait for the end of conversion ######/
HAL_ADC_PollForConversion(&AdcHandle, 10);
if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG)
{
/*##-5- Get the converted value of channel ##*/
uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
}

2  中断模式

/*##-3- Start the conversion process ######/
if(HAL_ADC_StartIT(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Get the converted value of regular channel */
uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
}

3  DMA模式

/*##-3- Start the conversion process ######/
if(HAL_ADC_StartDMA(&AdcHandle,&uhADCxConvertedValue,1) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Turn LED1 on: Transfer process is correct */
BSP_LED_On(LED1);
}

使用stm32cubemx设置

      
收集
数组设置   
  1. 更进一步将if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&uhADCxConvertedValue,1)!= HAL_OK),中的1改成6,然后将转换后的存储变量定义为二维数组uhADCxConvertedValue[2][3];再观察串口输出的情况如下:v
  2. alue[0][0] is 0
    value[0][1] is 255
    value[0][2] is 255
    value[1][0] is 0
    value[1][1] is 255
    value[1][2] is 255
    value[0][0] is 0
    value[0][1] is 255
    value[0][2] is 255
    value[1][0] is 0
    value[1][1] is 255
    value[1][2] is 255
    value[0][0] is 0
    value[0][1] is 255
    value[0][2] is 255
    value[1][0] is 1
    value[1][1] is 255
    value[1][2] is 255
    

  3. 这样就是把第一次扫描转换的三个通道值存在数组的第一行的三个元素中,第二次扫描转换的值放在第二行的三个元素中。这样就可以方便后面的数字滤波处理了。
来源: <http://www.stm32cube.com/question/16>

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/cat-li/p/4982510.html

HAL驱动库学习-ADC相关推荐

  1. 课程 | 基于STM32CubeMX和HAL驱动库的嵌入式系统设计

    帮成都这边一位老师友情分享一篇免费课程:基于STM32CubeMX和HAL驱动库的嵌入式系统设计. 如果想学习本课程,可以从文末给出的链接,或底部"阅读原文"进入报名,免费学习. ...

  2. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  3. 15、RDA8910(4GCAT1)CSDK二次开发:通过OneWire驱动库获取DS18B20/DHT11的数据

    目录 点击这里查看所有博文   本系列博客所述资料均来自合宙官方,并不是本人原创(只有博客是自己写的),csdk只是得到了口头的允许公开授权.出于热心,本人将自己的所学笔记整理并推出相对应的使用教程, ...

  4. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  5. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  6. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  7. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

  8. STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度

    STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...

  9. STM32F407霸天虎HAL库学习笔记——串口发送

    STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...

最新文章

  1. Matlab与线性代数 -- 矩阵的连接
  2. ElasticSearch之集群原理
  3. win8 查看 linux硬盘大小,如何查看显存大小_win8如何查看显存大小
  4. android中播放gif动画之二
  5. java epoll select_春招|Java开发实习面经(口头offer),感谢快手给我这个双非一次机会!...
  6. 仅用1天,为湖北黄冈中学搭建直播课堂!
  7. 2017.4.23 税收与补贴问题 思考记录
  8. android log长字符串显示不全,如何解决Android的Log显示不全的问题
  9. NSX发布Guest Introspection虚拟机时,主机报错的解决方法
  10. 操作系统学习笔记:文件管理
  11. 蚂蚁算法matlab
  12. ArcGIS和Fragstats的脚本化调用 ------以ArcPy和命令行的方式
  13. 初中会考计算机flash,初中信息技术考试flash.doc
  14. 软件调试方法及调试原则
  15. 南京应用计算机学校排名,南京软件工程专业比较好的17所大学推荐
  16. 微信小程序音频功能开发实(cai)践(keng)
  17. 一场胆战心惊的B站面试,哔哩哔哩也太难进了
  18. 求值:空间向量的法向量
  19. bootstrap 获取表格修改的结果_BootStrap实现带有增删改查功能的表格(DEMO详解)
  20. ElasticSearch 自定义分词器Analyzer示例

热门文章

  1. Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
  2. idea 中javax.servlet.http.HttpServlet包导不进来
  3. seo模拟点击软件_网站用软件刷排名好不好?
  4. layui多个file与提交同时进行_如何“不累”地完成多个同时进行的工作?
  5. Matlab---寻找峰值函数
  6. 一文搞定哈希(六种构建、四种冲突解决方法、查找算法总结)
  7. 仅完成部分的readprocessmemory或write_盘点2019年新能源车企销量目标完成率:广汽新能源超额完成/吉利、北汽紧随其后...
  8. 决策树准确率低原因_智能质检优化实践:召回率和准确率,哪个更重要?
  9. 4.2.3 OS之减少磁盘延迟时间的方法(交替编号、错位命名)
  10. 1.1.2 操作系统的特征(并发、共享、虚拟、异步)