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接板子电源口,运行结果如下,电压还是算合理的

阅读剩余
THE END