news 2026/5/27 19:10:37

树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)

树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)

当你在开发树莓派Pico项目时,可能会遇到这样的情况:硬件重置按钮突然失效,外围设备(比如LED)无法正常复位。传统的BOOTSEL按钮组合操作在某些场景下可能无法彻底解决问题。这时候,我们就需要一种更可靠的软件重置方案。

1. 为什么需要软件重置方案

硬件重置失效通常发生在以下几种场景:

  • 外围设备(如PWM控制的LED)在程序崩溃后仍保持活动状态
  • 固件更新后部分硬件模块未正确初始化
  • 多线程程序中某个硬件模块被意外锁定

传统的硬件重置方法(BOOTSEL+RUN)虽然简单,但存在明显局限性:

  1. 不完全复位:某些硬件模块可能不会随主芯片一起复位
  2. 状态保留:部分外设寄存器值可能被保留
  3. 依赖物理按钮:在嵌入式系统中可能无法随时操作

提示:当发现LED持续闪烁或外设无响应时,建议优先尝试软件重置方案

2. 准备开发环境

在开始编写重置程序前,需要确保开发环境配置正确:

2.1 安装必要工具链

# 安装编译工具 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi

2.2 获取Pico SDK

git clone -b master https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init export PICO_SDK_PATH=`pwd`

2.3 项目目录结构

建议按以下结构组织代码:

hello_reset/ ├── CMakeLists.txt ├── pico_sdk_import.cmake └── hello_reset.c

3. 编写重置程序

3.1 核心代码解析

下面是完整的hello_reset.c实现:

#include <stdio.h> #include "pico/stdlib.h" #include "hardware/resets.h" int main() { stdio_init_all(); printf("Starting hardware reset...\n"); // 重置PWM模块 reset_block(RESETS_RESET_PWM_BITS); unreset_block_wait(RESETS_RESET_PWM_BITS); // 重置PWM和RTC模块 reset_block(RESETS_RESET_PWM_BITS | RESETS_RESET_RTC_BITS); unreset_block_wait(RESETS_RESET_PWM_BITS | RESETS_RESET_RTC_BITS); // 添加更多需要重置的模块 reset_block(RESETS_RESET_ADC_BITS); unreset_block_wait(RESETS_RESET_ADC_BITS); printf("Reset completed successfully!\n"); return 0; }

关键函数说明:

  • reset_block():将指定硬件模块置入复位状态
  • unreset_block_wait():解除复位并等待模块就绪

3.2 可重置的硬件模块

Pico支持重置的硬件模块如下表所示:

模块名称宏定义典型应用场景
PWMRESETS_RESET_PWM_BITSLED控制异常
RTCRESETS_RESET_RTC_BITS时钟不同步
ADCRESETS_RESET_ADC_BITS采样值异常
SPIRESETS_RESET_SPI0_BITS通信失败
UARTRESETS_RESET_UART0_BITS串口无响应

4. 构建与部署

4.1 CMake配置

创建CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.12) include(pico_sdk_import.cmake) project(hello_reset) pico_sdk_init() add_executable(hello_reset hello_reset.c) target_link_libraries(hello_reset pico_stdlib) pico_add_extra_outputs(hello_reset)

4.2 构建流程

# 复制CMake配置文件 cp $PICO_SDK_PATH/external/pico_sdk_import.cmake . # 创建构建目录 mkdir build cd build # 生成Makefile并编译 cmake .. make -j4

构建完成后,会在build目录下生成hello_reset.uf2文件。

4.3 部署到Pico

  1. 按住BOOTSEL按钮连接Pico到电脑
  2. 将生成的hello_reset.uf2拖入出现的U盘
  3. 程序会自动运行并执行重置操作

5. 高级应用技巧

5.1 批量重置多个模块

可以一次性重置多个硬件模块:

// 同时重置PWM、RTC和ADC模块 uint32_t reset_mask = RESETS_RESET_PWM_BITS | RESETS_RESET_RTC_BITS | RESETS_RESET_# 1. 题目 #### [93. 复原 IP 地址](https://leetcode-cn.com/problems/restore-ip-addresses/) 难度中等857 **有效 IP 地址** 正好由四个整数(每个整数位于 `0` 到 `255` 之间组成,且不能含有前导 `0`),整数之间用 `'.'` 分隔。 - 例如:`"0.1.2.201"` 和` "192.168.1.1"` 是 **有效** IP 地址,但是 `"0.011.255.245"`、`"192.168.1.312"` 和 `"192.168@1.1"` 是 **无效** IP 地址。 给定一个只包含数字的字符串 `s` ,用以表示一个 IP 地址,返回所有可能的**有效 IP 地址**,这些地址可以通过在 `s` 中插入 `'.'` 来形成。你 **不能** 重新排序或删除 `s` 中的任何数字。你可以按 **任何** 顺序返回答案。 **示例 1:**

输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]

**示例 2:**

输入:s = "0000" 输出:["0.0.0.0"]

**示例 3:**

输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

**提示:** - `1 <= s.length <= 20` - `s` 仅由数字组成 # 2. 题解 # 3. code ```c++ class Solution { public: vector<string> ans; bool isValid(const string& s, int start, int end) { if (start > end) { return false; } if (s[start] == '0' && start != end) { return false; } int num = 0; for (int i = start; i <= end; i++) { if (s[i] > '9' || s[i] < '0') { return false; } num = num * 10 + (s[i] - '0'); if (num > 255) { return false; } } return true; } void backtracking(string s, int startIdx, int pointNum) { if (pointNum == 3) { if (isValid(s, startIdx, s.size() - 1)) { ans.push_back(s); } return; } for (int i = startIdx; i < s.size(); i++) { if (isValid(s, startIdx, i)) { s.insert(s.begin() + i + 1, '.'); pointNum++; backtracking(s, i + 2, pointNum); pointNum--; s.erase(s.begin() + i + 1); } else { break; } } return; } vector<string> restoreIpAddresses(string s) { if (s.size() < 4 || s.size() > 12) return ans; backtracking(s, 0, 0); return ans; } };

4. 心得

回溯法,注意终止条件,以及判断是否有效。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 3:37:41

SpringBoot 接口测试:Postman 与 JUnit 5 实战

做后端开发&#xff0c;接口测试是绕不开的环节&#xff0c;既要保证接口能正常运行&#xff0c;又要应对前后端联调、线上稳定&#xff0c;所以今天就结合实际开发场景&#xff0c;来讲讲接口测试的方法。做后端这么久&#xff0c;发现很多同学要么只靠Postman手动测试&#x…

作者头像 李华
网站建设 2026/4/1 3:37:17

从“Hello World”到看寄存器:用Eclipse+Jlink深度调试杰发AC7840的完整心路

从“Hello World”到寄存器观察&#xff1a;EclipseJLink实战调试AC7840的思维跃迁 当LED第一次按照我们的代码节奏闪烁时&#xff0c;那只是嵌入式开发的起点。真正令人着迷的&#xff0c;是当程序不按预期运行时&#xff0c;如何像侦探一样逐层揭开硬件与软件交互的真相。本文…

作者头像 李华
网站建设 2026/4/1 3:37:04

NCMDump解密工具:5分钟解锁网易云音乐NCM加密文件播放限制

NCMDump解密工具&#xff1a;5分钟解锁网易云音乐NCM加密文件播放限制 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他设备播放而烦恼吗&#xff1f;NCMDump解密工具正是你需要的解决方…

作者头像 李华
网站建设 2026/4/1 3:35:35

NeoPixelBus驱动深度解析:WS281x/SK6812时序控制与跨平台实践

1. NeoPixelBus 库深度技术解析&#xff1a;面向嵌入式工程师的 WS281x/SK6812 驱动实践指南NeoPixelBus 是一个在嵌入式 LED 控制领域具有标杆意义的开源驱动库&#xff0c;其设计目标明确指向工程落地——为各类单线&#xff08;One-Wire&#xff09;与双线&#xff08;Two-W…

作者头像 李华
网站建设 2026/4/1 3:35:34

【T2I评估实战】DINO与CLIP Score在图像生成质量检测中的联合应用

1. 为什么需要联合评估DINO与CLIP Score&#xff1f; 在文本到图像生成&#xff08;T2I&#xff09;领域&#xff0c;评估生成图像的质量一直是个难题。传统方法往往依赖人工评分&#xff0c;效率低且主观性强。我去年参与过一个电商广告图生成项目&#xff0c;团队用Stable Di…

作者头像 李华