一、工程建立
工程建立和时钟配置这里不再赘述,可以看上一篇文章,在PWM中详细的介绍了工程建立的每一步,时钟配置已经做了详细的步骤
二、驱动配置
1. 打开ADC驱动
我们直入主题,更改好时钟后,打开RT-Thread Studio的 RT-Thread Set
tings,使能ADC设备。
进入组件-设备驱动程序-使用ADC设备驱动程序
最后进入board.h中,取消掉ADC1的注释。
2. Cubemx配置
STM32最方便的工具就是cubemx了,我们打开cubemx配置管脚的ADC功能。
我使用的引脚是PA0,将其设置为ADC1的通道5。
然后点击左边的Analong-ADC1 将通道5设置为Single-ended,默认是12位ADC,如果需要配置其他ADC参数可下拉配置。
然后点击左上角文件,保存工程后点击右上角获取代码。
3. 修改驱动
打开 cubemx下的Src文件,打开stm32l4xx_hal_msp.c,找到下面这两个函数将其剪贴到board.c最下方。
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
到这里驱动就已经修改完成了,可以建立用户代码了。
三、构建代码
1. 新建.c文件
可以直接在applictation 文件目录右键新建一个源文件,可以随便命名,但是一定要加后缀.c
2. 导入我们头文件
#include 《rtthread.h》
#include 《rtdevice.h》
3. 定义ADC句柄,ADC设备名,通道、参考电压,位数
rt_adc_device_t adc_dev;
#define ADC_DEV_NAME “adc1” /* ADC 设 备 名 称 */
#define ADC_DEV_CHANNEL 6 /* ADC 通 道 */
#define REFER_VOLTAGE 330 /* 参 考 电 压 3.3V,数 据 精 度 乘 以100保 留2位 小 数 */
#define CONVERT_BITS (1 《《 12) /* 转 换 位 数 为12位 */
4. 编写设备代码
首先我们需要使用 这个API来查找设备获取设备句柄,
rt_device_t rt_device_find(const char* name);
其次使能设备
rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel);
再然后读取ADC结果
rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);
4. 这里放上这个.c文件的完整代码
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-03-14 desktop the first version
*/
#include 《rtthread.h》
#include 《rtdevice.h》
rt_adc_device_t adc_dev;
#define ADC_DEV_NAME “adc1” /* ADC 设 备 名 称 */
#define ADC_DEV_CHANNEL 6 /* 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_uint32_t value, vol;
/* 查 找 设 备 */
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;
}
/* 使 能 设 备 */
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);
return RT_EOK;
}
/* 导 出 到 msh 命 令 列 表 中 */
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
四、 使用方法
使用方法特别简单,我将这个函数导入了命令行中,可以输入adc_vol_sample这个关键词调用,可以直接输出其ADC电压。
原作者:乐乐爱学习