找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2552|回复: 0
收起左侧

ADC-单通道采集(DMA)

[复制链接]
ID:297076 发表于 2018-3-26 10:04 | 显示全部楼层 |阅读模式

bsp_adc.h文件内容:

1. #ifndef __ADC_H__

2. #define __ADC_H__

3.  

4. /* 包含头文件----------------------------------------------------------------*/

5. #include "stm32f1xx_hal.h"

6.  

7. /* 类型定义------------------------------------------------------------------*/

8. /* 宏定义 --------------------------------------------------------------------*/

9. // 注意:用作ADC采集的IO必须没有复用,否则采集电压会有影响

10./********************ADC输入通道(引脚)配置**************************/

11.//#define ADCx_RCC_CLK_ENABLE()           __HAL_RCC_ADC1_CLK_ENABLE()

12.//#define ADCx_RCC_CLK_DISABLE()          __HAL_RCC_ADC1_CLK_DISABLE()

13.//#define DMAx_RCC_CLK_ENABLE()           __HAL_RCC_DMA1_CLK_ENABLE()

14.//#define ADCx                            ADC1

15.//#define ADC_DMAx_CHANNELn               DMA1_Channel1

16.//#define ADC_DMAx_CHANNELn_IRQn          DMA1_Channel1_IRQn

17.//#define ADC_DMAx_CHANNELn_IRQHANDLER    DMA1_Channel1_IRQHandler

18.

19.#define ADCx_RCC_CLK_ENABLE()           __HAL_RCC_ADC3_CLK_ENABLE()

20.#define ADCx_RCC_CLK_DISABLE()          __HAL_RCC_ADC3_CLK_DISABLE()

21.#define DMAx_RCC_CLK_ENABLE()           __HAL_RCC_DMA2_CLK_ENABLE()

22.#define ADCx                            ADC3

23.#define ADC_DMAx_CHANNELn               DMA2_Channel5

24.#define ADC_DMAx_CHANNELn_IRQn          DMA2_Channel4_5_IRQn

25.#define ADC_DMAx_CHANNELn_IRQHANDLER    DMA2_Channel4_5_IRQHandler

26.

27.#define ADC_GPIO_ClK_ENABLE()           __HAL_RCC_GPIOC_CLK_ENABLE()

28.#define ADC_GPIO                        GPIOC

29.//#define ADC_GPIO_PIN                  GPIO_PIN_0       // 连接至板载精密可调电阻(需加跳帽)

30.//#define ADC_CHANNEL                   ADC_CHANNEL_10    // 连接至板载精密可调电阻(需加跳帽)

31.#define ADC_GPIO_PIN                    GPIO_PIN_1       // 连接至板载光敏电阻(需加跳帽)

32.#define ADC_CHANNEL                     ADC_CHANNEL_11    // 连接至板载光敏电阻(需加跳帽)

33.              

34./* 扩展变量------------------------------------------------------------------*/

35.extern ADC_HandleTypeDef hadcx;

36.extern DMA_HandleTypeDef hdma_adcx;

37./* 函数声明------------------------------------------------------------------*/

38.void MX_ADCx_Init(void);

39.

40.#endif /* __ADC_H__ */

41.

42./******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

43.


bsp_adc.c文件内容:

1. /**

2.   ******************************************************************************

3.   * 文件名程: bsp_adc.c

4.   * 作    者: 硬石嵌入式开发团队

5.   * 版    本: V1.0

6.   * 编写日期: 2015-10-04

7.   * 功    能: 板载ADC电压采集底层驱动程序

8.   *******************************************************************************/

9. /* 包含头文件----------------------------------------------------------------*/

10.#include "adc/bsp_adc.h"

11.

12./* 私有类型定义--------------------------------------------------------------*/

13./* 私有宏定义----------------------------------------------------------------*/

14./* 私有变量------------------------------------------------------------------*/

15.ADC_HandleTypeDef hadcx;

16.DMA_HandleTypeDef hdma_adcx;

17./* 扩展变量 ------------------------------------------------------------------*/

18./* 私有函数原形--------------------------------------------------------------*/

19./* 函数体--------------------------------------------------------------------*/

20./**

21.  * 函数功能: AD转换初始化

22.  * 输入参数: 无

23.  * 返 回 值: 无

24.  * 说    明:无

25.  */

26.void MX_ADCx_Init(void)

27.{

28.  ADC_ChannelConfTypeDef sConfig;

29.

30.  // ADC功能配置

31.  hadcx.Instance = ADCx;

32.  hadcx.Init.ScanConvMode = ADC_SCAN_DISABLE;

33.  hadcx.Init.ContinuousConvMode = ENABLE;

34.  hadcx.Init.DiscontinuousConvMode = DISABLE;

35.  hadcx.Init.ExternalTrigConv = ADC_SOFTWARE_START;

36.  hadcx.Init.DataAlign = ADC_DATAALIGN_RIGHT;

37.  hadcx.Init.NbrOfConversion = 1;

38.  HAL_ADC_Init(&hadcx);

39.

40.  // 配置采样通道

41.  sConfig.Channel = ADC_CHANNEL;

42.  sConfig.Rank = 1;

43.  sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;

44.  HAL_ADC_ConfigChannel(&hadcx, &sConfig);

45.}

46.

47./**

48.  * 函数功能: ADC外设初始化配置

49.  * 输入参数: hadc:AD外设句柄类型指针

50.  * 返 回 值: 无

51.  * 说    明: 该函数被HAL库内部调用

52.  */

53.void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)

54.{

55.  GPIO_InitTypeDef GPIO_InitStruct;

56.  if(hadc->Instance==ADCx)

57.  {

58.    /* 外设时钟使能 */

59.    ADCx_RCC_CLK_ENABLE();

60.   

61.    /* AD转换通道引脚时钟使能 */

62.    ADC_GPIO_ClK_ENABLE();

63.   

64.    /* DMA时钟使能 */

65.    DMAx_RCC_CLK_ENABLE();

66.      

67.    /* AD转换通道引脚初始化 */

68.    GPIO_InitStruct.Pin = ADC_GPIO_PIN;

69.    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

70.    HAL_GPIO_Init(ADC_GPIO, &GPIO_InitStruct);

71.

72.    /* DMA外设初始化配置 */  

73.    hdma_adcx.Instance = ADC_DMAx_CHANNELn;

74.    hdma_adcx.Init.Direction = DMA_PERIPH_TO_MEMORY;

75.    hdma_adcx.Init.PeriphInc = DMA_PINC_DISABLE;

76.    hdma_adcx.Init.MemInc = DMA_MINC_ENABLE;

77.    hdma_adcx.Init.PeriphDataAlignment =DMA_PDATAALIGN_HALFWORD;

78.    hdma_adcx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

79.    hdma_adcx.Init.Mode = DMA_CIRCULAR;

80.    hdma_adcx.Init.Priority = DMA_PRIORITY_HIGH;

81.    HAL_DMA_Init(&hdma_adcx);

82.    /* 连接DMA */

83.    __HAL_LINKDMA(hadc,DMA_Handle,hdma_adcx);

84.   

85.    /* 外设中断优先级配置和使能中断 */

86.    HAL_NVIC_SetPriority(ADC_DMAx_CHANNELn_IRQn, 0, 0);

87.    HAL_NVIC_EnableIRQ(ADC_DMAx_CHANNELn_IRQn);

88.  }

89.}

90.

91./**

92.  * 函数功能: ADC外设反初始化配置

93.  * 输入参数: hadc:AD外设句柄类型指针

94.  * 返 回 值: 无

95.  * 说    明: 该函数被HAL库内部调用

96.  */

97.void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)

98.{

99.  if(hadc->Instance==ADCx)

100. {

101.    /* 禁用ADC外设时钟 */

102.    ADCx_RCC_CLK_DISABLE();

103.  

104.    /* AD转换通道引脚反初始化 */

105.    HAL_GPIO_DeInit(ADC_GPIO, ADC_GPIO_PIN);

106.

107.    /* DMA外设反初始化*/

108.    HAL_DMA_DeInit(hadc->DMA_Handle);

109.  }

110.}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表