RT-Thread:ADC 框架应用,通过 STM32CubeMX 配置 STM32 ADC驱动

关键词:ADC,RT-Thread ADC,STM32 ADC应用

说明:本笔记是记录如何开启 RT-Thread 框架的ADC功能,使用系统自带的ADC函数,并通过 STM32CubeMX 配置 STM32  ADC驱动 。

1. 打开board.h 文件,找到ADC 使用配置的流程,按流程操作。

* if you want to use adc you can use the following instructions. * 如果您想使用adc,可以使用以下说明。** STEP 1, open adc driver framework support in the RT-Thread Settings file  ,* 步骤1,在RT线程设置文件中打开adc驱动程序框架支持** STEP 2, define macro related to the adc  * 第2步,定义与adc相关的宏*                 such as     #define BSP_USING_ADC1  例如:  #define BSP_USING_ADC1** STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file* STEP 3, 将adc init函数从stm32cubemx生成的stm32xxxx_hal_msp.c复制到board.c文件的末尾*                 such as     void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)** STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro related to the peripherals* STEP 4,修改stm32xxxx_hal_config.h文件以支持adc外围设备。定义与外围设备相关的宏*                 such as     #define HAL_ADC_MODULE_ENABLED**/

2.配置驱动

第1步:打开配置

* STEP 1, open adc driver framework support in the RT-Thread Settings file ,

* 步骤1,在RT线程设置文件中打开adc驱动程序框架支持

勾选如下 ADC 配置

第2步:如图打开 ADC 相关的宏,根据硬件实际使用的是 ADC1或者其他打开对应的ADC。

* STEP 2, define macro related to the adc

* 第2步,定义与adc相关的宏

* such as #define BSP_USING_ADC1 例如: #define BSP_USING_ADC1

第3步:设置ADC通道,配置ADC。(具体的生成过程参考专门的ADC驱动生成文件)

* STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file

* STEP 3, 将adc init函数从stm32cubemx生成的stm32xxxx_hal_msp.c复制到board.c文件的末尾

* such as void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)

按流程配置后点击下图生成代码

找到生成的代码 adc.c

把如下代码 复制到board.c文件的末尾

/* USER CODE BEGIN 0 *//* USER CODE END 0 */ADC_HandleTypeDef hadc1;/* ADC1 init function */
void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};/** Common config */hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 2;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}/** Configure Regular Channel */sConfig.Channel = ADC_CHANNEL_7;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}/** Configure Regular Channel */sConfig.Channel = ADC_CHANNEL_8;sConfig.Rank = ADC_REGULAR_RANK_2;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}}void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspInit 0 *//* USER CODE END ADC1_MspInit 0 *//* ADC1 clock enable */__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**ADC1 GPIO Configuration    PA7     ------> ADC1_IN7PB0     ------> ADC1_IN8 */GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USER CODE BEGIN ADC1_MspInit 1 *//* USER CODE END ADC1_MspInit 1 */}
}void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspDeInit 0 *//* USER CODE END ADC1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_ADC1_CLK_DISABLE();/**ADC1 GPIO Configuration    PA7     ------> ADC1_IN7PB0     ------> ADC1_IN8 */HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7);HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);/* USER CODE BEGIN ADC1_MspDeInit 1 *//* USER CODE END ADC1_MspDeInit 1 */}
} /* USER CODE BEGIN 1 *//* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

第4步:打开ADC的宏

* STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro related to the peripherals

* STEP 4,修改stm32xxxx_hal_config.h文件以支持adc外围设备。定义与外围设备相关的宏

* such as #define HAL_ADC_MODULE_ENABLED

第5步:移植ADC应用函数

官方ADC应用介绍:Docs » 设备和驱动 » ADC设备

https://www.rt-thread.org/document/site/programming-manual/device/adc/adc/

1. ADC 设备使用示例

        ADC 设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下:
1.首先根据 ADC 设备名称 “adc1” 查找设备获取设备句柄。
2.使能设备后读取 adc1 设备对应的通道 5 的采样值,然后根据分辨率为 12 位,参考电压为 3.3V         计算实际的电压值。
3.最后关闭 ADC 设备对应通道。
运行结果:打印实际读取到的转换的原始数据和经过计算后的实际电压值。

2.移植以下代码到工程里面测试

/** 程序清单: ADC 设备使用例程* 例程导出了 adc_sample 命令到控制终端* 命令调用格式:adc_sample* 程序功能:通过 ADC 设备采样电压值并转换为数值。*           示例代码参考电压为3.3V,转换位数为12位。
*/#include <rtthread.h>
#include <rtdevice.h>#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     5           /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */static int adc_vol_sample(int argc, char *argv[])
{rt_adc_device_t adc_dev;rt_uint32_t value, vol;rt_err_t ret = RT_EOK;/* 查找设备 */adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);if (adc_dev == RT_NULL){rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);return RT_ERROR;}/* 使能设备 */ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);/* 读取采样值 */value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);rt_kprintf("the value is :%d \n", value);/* 转换为对应电压值 */vol = value * REFER_VOLTAGE / CONVERT_BITS;rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);/* 关闭通道 */ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);

第6步:调试修改过的移植代码

/** 程序清单: ADC 设备使用例程* 例程导出了 adc_sample 命令到控制终端* 命令调用格式:adc_sample* 程序功能:通过 ADC 设备采样电压值并转换为数值。*           示例代码参考电压为3.3V,转换位数为12位。
*/
#include "user_cfg.h"#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     7           /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 *//* 线程 AIR_ADC_Thread 的入口函数 */
static void AIR_ADC_entry(void *param)
{rt_adc_device_t adc_dev;rt_uint32_t value, vol;rt_err_t ret = RT_EOK;while(1){/* 查找设备 */adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);if (adc_dev == RT_NULL){rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);//return RT_ERROR;}/* 使能设备 */ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);/* 读取采样值 */value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);rt_kprintf("the value is :%d \n", value);/* 转换为对应电压值 */vol = value * REFER_VOLTAGE / CONVERT_BITS;rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);/* 关闭通道 */ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);rt_thread_mdelay(1000);rt_thread_yield();/* 放弃剩余时间片,进行一次线程切换 */}}/* 线程创建 线程 函数 */
void AIR_ADC_Thread(void)
{rt_thread_t tid1;//创建线程控制块指针来接收线程创建函数的返回值,目的是通过返回值判断线程是否创建ok/* 创建线程 ,名称是 AIR_ZY_CON_Thread,入口是 AIR_ZY_CON_entry*/tid1 = rt_thread_create("AIR_ADC_Thread",AIR_ADC_entry, RT_NULL,500,//设置内存堆栈大小10, 50);//设置优先级,时间片参数,时间片是在有多个相同优先级线程时,这个线程每次被执行多少个时间片/* 如果获得线程控制块,启动这个线程 */if (tid1 != RT_NULL)rt_thread_startup(tid1);
}
INIT_APP_EXPORT(AIR_ADC_Thread);

第7步:调试成功:输出结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/334427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联络口译重要吗?怎样选择专业的翻译公司?

联络口译在当今全球化的时代扮演着至关重要的角色。随着国际交流与合作的日益频繁&#xff0c;无论是商务、政治还是文化领域&#xff0c;都需要专业的口译员进行准确的沟通。尤其是在跨语言、跨文化的背景下&#xff0c;联络口译对于保障沟通的顺利进行起着不可替代的作用。那…

IDEA在package下右键,没有new选项

正常情况下如下图&#xff0c;我们在文件夹上右键&#xff0c;是会出现New选项的。 但是今天我尝试将" add frameworks support"添加到右键时&#xff0c;竟然把New都删除了。如下图 搜遍全网&#xff0c;结果搜到的都是为什么在package或者文件夹上右键出现的Ne…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

软件测试|MySQL WHERE条件查询详解:筛选出需要的数据

简介 在数据库中&#xff0c;我们常常需要从表中筛选出符合特定条件的数据&#xff0c;以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询&#xff0c;使我们能够轻松地筛选数据。本文将详细介绍MySQL WHERE条件查询的用法和示例&#xff0c;帮助大家更好地理解和应…

FineBI实战项目一(7):每天每小时上架商品个数

1 明确数据分析目标 对所有商品的商家时间进行统计&#xff0c;统计每个小时上架商品的个数 2 创建用于保存数据分析结果的表 create table app_hour_goods(id int primary key auto_increment,daystr varchar(20),hourstr varchar(20),cnt int ); 3 编写SQL语句进行数据分析…

分析一个项目(微信小程序篇)一

分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 本次所介绍的是微信小程序项目&#xff08;甑选商场&#xff09;&#xff1a; 其首页…

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

Unity文字转语音(使用RT-Voice PRO [2023.1.0])

参考文章Unity插件——文字转朗读语音RtVioce插件功能/用法/下载_rtvoice-CSDN博客 一、使用步骤 1.导入进Unity&#xff08;插件形式为 .unitypackage&#xff09; https://download.csdn.net/download/luckydog1120446388/88717512 2.添加所需Prefab 1&#xff09;.右键可…

雅意2.0:打造专为中文优化的300亿参数多语言模型

前言 雅意2.0&#xff0c;作为一款专注于中文语境的开源大型语言模型&#xff0c;其在多语言处理方面的能力尤为突出。该模型不仅具有300亿参数规模的庞大体量&#xff0c;还在多个关键领域取得了显著的技术突破。 Huggingface模型下载&#xff1a;https://huggingface.co/wen…

SpringMVC-01

Spring MVC是一种基于Java的MVC&#xff08;Model-View-Controller&#xff09;架构的Web应用程序开发框架。它是Spring框架的一部分&#xff0c;用于构建灵活和高效的Web应用程序。 Spring MVC的核心思想是将应用程序的逻辑分成模型&#xff08;Model&#xff09;、视图&#…

串口乱码原因

开发板上外部时钟的晶振与代码中的外部时钟的晶振不一致&#xff0c;使用cubemx配置时钟时要格外注意&#xff0c;选好芯片之后再看外部晶振是啥&#xff0c;不然随便设置可能乱码 重写fputc函数之后&#xff0c;需要自己手动勾选下面选项

详解IDEA git 版本回滚

作者简介 目录 1.git分区 2.未commit&#xff0c;进行回滚 3.commit未push&#xff0c;进行回滚 3.1.undo commit 3.2.reset 4.已commit&push&#xff0c;进行回滚 1.git分区 git的版本回滚其实就是回滚不同的分区&#xff0c;所以在聊git回滚之前我们有必要简单了解…