ra6m3之adc踩坑日志(基于rt-thread )
问题描述
1.已经用fsp工具正确配置Pins
2.已经用fsp工具正确配置Stacks
3.问题是根本没有在RT-Thread Studio看到HAL相关的ADC代码,也没看到Settings里边的ADC配置选项
问题分析
RT-Thread跟Linux内核一样,采用Kconfig来配置驱动和组件,既然没有看到有ADC选项,可以考虑自己添加一个;再者,HAL_Drivers目录下的SConscript代码是这样的 :
Import('RTT_ROOT') Import('rtconfig') from building import * cwd = GetCurrentDir() # add the general drivers. src = Split(""" drv_common.c """) if GetDepend(['BSP_USING_UART']): if GetDepend(['RT_USING_SERIAL_V2']): src += ['drv_usart_v2.c'] else: print("\nThe current project does not support serial-v1\n") Return('group') if GetDepend(['BSP_USING_GPIO']): src += ['drv_gpio.c'] if GetDepend(['BSP_USING_WDT']): src += ['drv_wdt.c'] if GetDepend(['BSP_USING_ONCHIP_RTC']): src += ['drv_rtc.c'] if GetDepend(['BSP_USING_I2C', 'RT_USING_I2C_BITOPS']): if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'): src += ['drv_soft_i2c.c'] if GetDepend(['BSP_USING_I2C', 'BSP_USING_HW_I2C']): src += ['drv_i2c.c'] if GetDepend(['BSP_USING_SPI']): src += ['drv_spi.c'] if GetDepend(['BSP_USING_SCI_SPI']): src += ['drv_sci_spi.c'] if GetDepend(['BSP_USING_ADC']): src += ['drv_adc.c'] if GetDepend(['BSP_USING_DAC']): src += ['drv_dac.c'] if GetDepend(['BSP_USING_ONCHIP_FLASH']): src += ['drv_flash.c'] if GetDepend(['BSP_USING_PWM']): src += ['drv_pwm.c'] if GetDepend(['BSP_USING_ETH']): src += ['drv_eth.c'] if GetDepend(['BSP_USING_CAN']): src += ['drv_can.c'] if GetDepend(['BSP_USING_SDHI']): src += ['drv_sdhi.c'] if GetDepend(['BSP_USING_LCD']): src += ['drv_lcd.c'] path = [cwd] path += [cwd + '/config'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) Return('group')
可以了解到drv_adc.c
在HAL_Drivers目录下是存在的,只是它没有添加到整个RT-Thread工程里边来,只要开启BSP_USING_ADC
宏即可;于是乎,编写Kconfig开启ADC支持,RT_USING_ADC
是RT-Thread支持ADC的宏开关,代码如下:
config BSP_USING_ADC bool "Enable ADC" select BSP_USING_ADC0 select RT_USING_ADC default y
重新编译,但是编译报错
很明显,需要开启BSP_USING_ADC0这个宏,于是乎,又在Kconfig加上一下代码:
config BSP_USING_ADC0 bool "Enable ADC0" default y
重新打开Settings,终于看到两个开关,重新编译工程也没有问题了
测试
示例程序,在hal_entry.c加入以下代码:
/* * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-10-10 Sherman first version */ #include <rtthread.h> #include "hal_data.h" #include <rtdevice.h> #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */ #define ADC_DEV_NAME "adc0" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 1 /* 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); void hal_entry(void) { rt_kprintf("\nHello RT-Thread!\n"); while (1) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); } }
烧写运行demo,P001接板子电源口,运行结果如下,电压还是算合理的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)