如何使用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分辨率(,,,)ADC_RESOLUTION12b........
• uint32_tDataAlign --数据对齐方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT
• uint32_tScanConvMode--配置规则组序列,该参数可以关联“DiscontinuousConvMode”对主序列细分,如果设置多个通道则序列自动使能;如果只有一个通道,执行单一转换模式;如果有多个通道,执行序列转换模式;Rank(队列)定义为通道号,rank0->channel0,rank1-->channel1.....;扫描方向可以递增(-->)或递减(-->)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()       用户自行调用,退出ADC
HAL_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. 这样就是把第一次扫描转换的三个通道值存在数组的第一行的三个元素中,第二次扫描转换的值放在第二行的三个元素中。这样就可以方便后面的数字滤波处理了。
 

HAL驱动库学习-ADC的更多相关文章

  1. HAL驱动库学习-SPI

    如何使用SPI库1 声明SPI hanlde, 例如: SPI_HandleTypeDef hspi2 通过实现HAL_SPI_MspInit()函数初始化底层资源 以下两个必须进行初始化 a 使能s ...

  2. HAL驱动库学习--如何使用HAL库

    一 概述 下图是表述了用户层和HAL_Driver的交互过程,基本上从用户APP调用HAL_Driver APIs并且视情况当使用DMA或者专用中断时通过中断处理程序调用HAL_Driver APIs ...

  3. 第9章 初识HAL固件库

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.<Cortex-M3权威指南>, STM32 HAL库帮助文档:<STM32F ...

  4. STM32 HAL固件库编程的文件构架

    对于我这种以前只接触过51和AVR单片机编程的小菜来说,现在开始学习STM32的编程,对于函数的功能以及C语言的语法都还好理解,难的是它提供的那一套硬件抽象层(HAL)驱动是怎么和其他的东东搭配在一起 ...

  5. uTenux——重新整理底层驱动库

    重新整理底层驱动库 1. 整理chip.h 在chip.h文件中的07----13的宏定义设置位如下,这样我们就不用在工程配中定义sam3s4c这个宏了,为我们以后通用少了一件麻烦事. //#if d ...

  6. DSP基础学习-ADC同步采样

    DSP基础学习-ADC同步采样 彭会锋 2015-04-28 20:31:06 在DSP28027 LauchPad学习过程中,关于ADC同步采样和顺序采样的区别稍加研究了一下,发现里面还真有些门道, ...

  7. HAL驱动的串口编程陷阱

    http://bbs.elecfans.com/jishu_464356_1_1.html 手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL ...

  8. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  9. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

随机推荐

  1. easy ui插件

    简介: easy UI是类似于jQuery UI的插件库 注意:多脚本同时使用时,注意脚本冲突问题. 常用插件: 1.tree插件(tree插件实现动态树形菜单) 2.datagrid插件(datag ...

  2. Daily Scrum02 12.07

    最近大家都在赶编译的大作业,没日没夜的码代码,调试,大家都很辛苦,但是,我们团队的工作,大家也不能懈怠啊! 大家要顶住压力,加油努力啊! Member 任务进度 下一步工作 吴文会 就总结点进行汇报 ...

  3. bzoj1057: [ZJOI2007]棋盘制作--最大子矩阵

    既然要求最大01子矩阵,那么把应该为0的位置上的数取反,这样就变成求最大子矩阵 最大子矩阵可以用单调栈 #include<stdio.h> #include<string.h> ...

  4. ssh项目部署到weblogic中问题总结

    部署到weblogic还是比较费劲的 ,不过基本上问题全是由于classloader顺序的问题引起的. 首先在web-inf底下添加weblogic.xml文件如下 <?xml version= ...

  5. JavaScript、全选反选-课堂笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 安卓中級教程(9):pathbutton中的animation.java研究(2)

    src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...

  7. java内置数据类型

    常量在程序运行时,不会被修改的量. 在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似: finaldouble PI =3.1415927; 虽然常量名也可以用小写,但为了便于识 ...

  8. 手机端布局rem 与vm的使用

    手机端原来的时候,在项目中使用js判断出html的字体,然后根据rem设置字体,但是js本着少用的原则,考虑用vm,vh等(顺带说一句,vm vh是网页可视区域宽度 高度 即浏览器宽度减去约16px) ...

  9. PHP 正则表达式匹配中文字符

    例如在 MySQL 的 bin-log 文件中选取特定的数据库语句来恢复数据时,只要选出某个库的 INSERT INTO 操作(去掉了多余信息,只列出 SQL 语句) INSERT INTO `crm ...

  10. Unity字节序问题

    问题 Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理.今天遇到的很奇葩的问题是: 如果bytes文件U ...