前言
达到的目标:
1、使能ADC1通道0
2、使用该通道口采集开发板的电源电压和GND
3、计算模拟电压值并打印信息
1、新建工程
2、打开board.h头文件
3、在board.h中打开ADC1的注释
4、打开RT-Thread Settings
5、点击右侧小箭头
6、打开ADC设备驱动程序
7、打开CubeMX Settings
8、打开ADC通道0
9、顺便配下时钟
10、自动计算时钟
11、串口1也打开一下,因为新建工程的时候默认使用了串口1
12、生成代码
13、打开hal_msp.c文件
14、将ADC初始化函数复制
15、粘贴到board.c文件的末尾
16、使能ADC模块
17、在主函数中写入如下代码,可以直接复制
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-11-11 RT-Thread first version
*/
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <board.h>
#include <rtdevice.h>
#define ADC_DEV_NAME "adc1" /* ADC 设备名称 */
rt_adc_device_t adc_dev; /* ADC 设备句柄 */
#define ADC_DEV_CHANNEL 0 /* ADC 通道 */
#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS (1 << 12) /* 转换位数为12位 */
rt_thread_t th1;
void read_adc1_entry(void *parameter)
{
rt_uint32_t val = 0,vol = 0; //ADC实际值,ADC转换后的电压值
while(1)
{
val = rt_adc_read(adc_dev, 1); //读取ADC通道采样值
rt_kprintf("val:%d\n",val);
/* 转换为对应电压值 */
vol = val * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
rt_thread_mdelay(1000);
}
}
int main(void)
{
rt_err_t ret = 0;
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);//查找ADC设备
if(adc_dev == RT_NULL)
{
LOG_E("rt_devide_find(adc1)failed...");
return -EINVAL;
}
ret = rt_adc_enable(adc_dev,ADC_DEV_CHANNEL); //使能ADC通道
if(ret < 0)
{
LOG_E("rt_adc_enable(adc1)...\n ");
return ret;
}
th1 = rt_thread_create("th1",read_adc1_entry,NULL,512,10,5);//创建adc通道打印线程1
if(th1 == NULL)
{
LOG_E("rt_adc_enable(adc1)failed...\n");
return -ENOMEM;
}
rt_thread_startup(th1); //开启线程调度
return RT_EOK;
}
18、编译发现报错
19、跳转进去注释掉这段代码
18、编译还有报错,它说函数重定义了
19、因为我们刚刚把ADC初始化函数复制到board.c里面,故现在又两处对该函数进行定义,打开hal_msp.c文件把这里的ADC初始化函数注释
20、再编译无报错
21、接好下载线和串口1到电脑,然后下载程序
22、下载好程序后打开串行终端,选择好你所对应的端口,点击确认
23、不知道端口号的可以打开设备管理器进行查看端口