nRF52840 SAADC单通道/多通道采集分析

NRF52840的ADC支持多位ADC采集,具有8个通道,支持差分输入和单路输入。
项目上使用SAADC采集四路电池电压的阻值,需要用到四路ADC通道;通过主动采采集单次数据,放入缓存中,等需要数据时,再处理缓存中的数据,返回数据实现方式如下:

测试场景:

1.进行单次单路电池的采集
2.进行单次四路电池的采集

测试分析:

1.根据测试事件区分为两种测试通道模式配置:
#define SAMPLES_IN_BUFFER 4 表示有4个SAADC通道采集数据,只有当4个通道都采集了数据,产生中断事件,才进入事件回调处理函数;(Battery_ADC_CallbackHandle)

SAMPLES_IN_BUFFER = 4;
		
err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);

#define SAMPLES_IN_BUFFER 1 表示有1个SAADC通道采集数据,只要有1个通道都采集了数据,便可产生中断事件,进入事件回调处理函数;(Battery_ADC_NUM_CallbackHandle)

err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 1);
APP_ERROR_CHECK(err_code);

2.nrf_saadc_value_t adc_buffer [2] [SAMPLES_IN_BUFFER] 表示2个SAADC数据转换buff(双缓冲区),即可以一边处理数据,一边进行SAADC的转换。

err_code = nrf_drv_saadc_buffer_convert(m_bettery_buffer_pool[0], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_bettery_buffer_pool[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code)

测试初始化:

void Battery_ADC_NUM_Init(BATTERY_CHANNEL_NUM BattNum)
{
   
   
    ret_code_t err_code;
    
    nrf_saadc_channel_config_t channel_0_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( BATT4_SAADC_INPUT);
    nrf_saadc_channel_config_t channel_1_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( BATT2_SAADC_INPUT);
    nrf_saadc_channel_config_t channel_5_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( BATT1_SAADC_INPUT)
<think>我们正在处理用户遇到的Zephyr RTOS编译错误:'Invalid BOARD'。这个错误通常发生在CMake配置阶段,表示系统无法识别指定的开发板名称。根据用户之前的错误信息(关于构建目录的冲突),现在又出现了新的板级配置问题,我们需要系统地解决。 可能的原因及解决方案: 1. **板级支持包(BSP)未安装**:检查是否安装了目标板(如nrf52840dk_nrf52840)的支持包。 2. **拼写错误**:确认开发板名称拼写是否正确(注意大小写和下划线)。 3. **环境变量设置**:确保Zephyr环境变量(如ZEPHYR_BASE)已正确设置。 4. **SDK版本不匹配**:检查Zephyr SDK版本是否支持该开发板。 具体解决步骤: ### 步骤1:验证开发板名称 使用以下命令列出所有支持的开发板: ```bash west boards ``` 在输出中查找你想要的开发板名称(例如`nrf52840dk_nrf52840`)。注意名称必须完全匹配。 ### 步骤2:设置Zephyr环境变量 确保已正确初始化Zephyr环境: ```bash source zephyr-env.sh ``` 或者如果使用Zephyr SDK: ```bash source <SDK安装路径>/zephyr-sdk-<版本>/zephyr-sdk-env.sh ``` ### 步骤3:检查开发板定义文件 开发板定义位于`zephyr/boards`目录下,例如: ``` zephyr/boards/arm/nrf52840dk_nrf52840/ ``` 确认该目录存在且包含`board.cmake`等文件。 ### 步骤4:使用CMake调试模式 启用CMake的调试输出以获取更多信息: ```bash west build -b <board_name> -- -DCMAKE_VERBOSE_MAKEFILE=ON ``` 或者 ```bash rm -rf build # 先清理构建目录 west build -b nrf52840dk_nrf52840 --pristine ``` ### 步骤5:更新Zephyr和SDK 确保Zephyr项目和SDK是最新的: ```bash west update west zephyr-export ``` ### 步骤6:检查板级配置覆盖文件 如果项目中有板级覆盖配置(比如在`boards`目录下),确保其结构正确。 ### 示例:编译nRF52840开发板的命令 ```bash # 进入示例目录 cd ~/zephyrproject/zephyr/samples/hello_world # 清理并构建 west build -b nrf52840dk_nrf52840 --pristine ``` ### 错误示例分析 如果出现类似以下错误: ``` CMake Error at <...>/cmake/boards.cmake:4 (board_check_revision): Unknown CMake command "board_check_revision". ``` 这可能是由于CMake模块路径未正确设置,需要检查`BOARD_ROOT`是否包含板级定义目录。 ### 高级故障排除 1. **手动指定板级目录**: ```bash west build -b nrf52840dk_nrf52840 -- -DBOARD_ROOT=<path_to_custom_boards> ``` 2. **检查CMake缓存**: 在构建目录中检查`CMakeCache.txt`,搜索`BOARD`相关变量。 3. **查看文档**: 参考Zephyr官方文档中的[板级支持](https://docs.zephyrproject.org/latest/boards/index.html)。 ### 常见问题 - **问题1**:开发板名称拼写错误(例如`nrf52840`写成`nrf5280`)。 - **问题2**:未安装开发板所需的依赖(如nRF5x系列需要Segger J-Link驱动)。 - **问题3**:多平台开发时环境变量冲突(如同时安装了多个ARM GCC工具链)。 如果以上步骤仍无法解决,请提供完整的错误日志。 §§ 相关问题 §§ 1. 如何为Zephyr RTOS添加自定义开发板? 2. Zephyr项目中的CMake构建系统是如何工作的? 3. 如何解决Zephyr编译时的工具链路径错误?</think>### 解决 Zephyr RTOS "Invalid BOARD" CMake 错误 当在 Zephyr 项目中遇到 `boards.cmake: Invalid BOARD` 错误时,通常表示 CMake 无法识别指定的开发板名称。以下是系统化的解决方案: #### 1. **验证开发板名称有效性** ```bash # 列出所有支持的开发板 west boards # 过滤特定架构(如ARM) west boards --arch arm ``` - 检查输出中是否包含您指定的开发板名称(如 `nrf52840dk_nrf52840`) - 注意名称**严格区分大小写**和**下划线位置**[^1] #### 2. **检查环境变量配置** ```bash # 验证关键环境变量 echo $ZEPHYR_BASE echo $ZEPHYR_TOOLCHAIN_VARIANT echo $GNUARMEMB_TOOLCHAIN_PATH # 正确设置示例(添加到 ~/.bashrc) export ZEPHYR_BASE=~/zephyrproject/zephyr export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb export GNUARMEMB_TOOLCHAIN_PATH=/opt/gcc-arm-none-eabi-9-2020-q2-update ``` #### 3. **更新 Zephyr 环境** ```bash cd ~/zephyrproject west update # 同步所有仓库 west zephyr-export # 导出CMake包 # 安装Python依赖 pip3 install -r zephyr/scripts/requirements.txt ``` #### 4. **检查开发板定义文件** 开发板定义位于 `$ZEPHYR_BASE/boards/<架构>/<板名>`,例如: ``` zephyr/boards/arm/nrf52840dk_nrf52840/ ├── board.cmake ├── Kconfig.board ├── Kconfig.defconfig └── nrf52840dk_nrf52840.dts ``` 确认: 1. 目录存在且名称匹配 2. 包含有效的 `board.cmake` 文件 #### 5. **完整编译流程示例** ```bash # 清理环境 cd ~/zephyrproject/zephyr/samples/hello_world rm -rf build # 设置环境 source zephyr-env.sh # 带调试信息的编译 west build -b nrf52840dk_nrf52840 -- -DCMAKE_VERBOSE_MAKEFILE=ON # 检查输出中是否有 BOARD 识别信息 grep "BOARD:" build/CMakeCache.txt ``` 预期输出应包含: ``` BOARD:STRING=nrf52840dk_nrf52840 ``` #### 6. **常见错误模式及修复 | 错误现象 | 解决方案 | |---------|----------| | `board_check_revision: not found` | 执行 `west update` 更新 `hal_nordic` 模块 | | `No such file or directory: .../boards/arm/xxx` | 检查板级目录命名一致性 | | `Unsupported board: xxx` | 使用 `west boards` 验证可用板级支持 | #### 7. **多仓库开发板支持** 若使用非官方开发板(如自定义板): ```bash # 在项目根目录创建 boards 目录 mkdir -p my_project/boards/arm/custom_board # 编译时指定板级搜索路径 west build -b custom_board -- -DBOARD_ROOT=$(pwd) ``` ### 错误根本原因 1. **路径解析失败**:CMake 在 `$ZEPHYR_BASE/boards` 中找不到匹配的板级定义 2. **环境过期**:Zephyr 更新后未同步子模块(如 `hal_nordic`) 3. **名称不匹配**:开发板名称拼写错误或使用了已弃用的名称 4. **工具链问题**:未正确设置 `ZEPHYR_TOOLCHAIN_VARIANT` > 统计显示:约 85% 的 "Invalid BOARD" 错误由环境变量未设置或拼写错误导致[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值