树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)
树莓派Pico硬件重置失效试试这个C语言强制重置方案附完整代码当你在开发树莓派Pico项目时可能会遇到这样的情况硬件重置按钮突然失效外围设备比如LED无法正常复位。传统的BOOTSEL按钮组合操作在某些场景下可能无法彻底解决问题。这时候我们就需要一种更可靠的软件重置方案。1. 为什么需要软件重置方案硬件重置失效通常发生在以下几种场景外围设备如PWM控制的LED在程序崩溃后仍保持活动状态固件更新后部分硬件模块未正确初始化多线程程序中某个硬件模块被意外锁定传统的硬件重置方法BOOTSELRUN虽然简单但存在明显局限性不完全复位某些硬件模块可能不会随主芯片一起复位状态保留部分外设寄存器值可能被保留依赖物理按钮在嵌入式系统中可能无法随时操作提示当发现LED持续闪烁或外设无响应时建议优先尝试软件重置方案2. 准备开发环境在开始编写重置程序前需要确保开发环境配置正确2.1 安装必要工具链# 安装编译工具 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi2.2 获取Pico SDKgit clone -b master https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init export PICO_SDK_PATHpwd2.3 项目目录结构建议按以下结构组织代码hello_reset/ ├── CMakeLists.txt ├── pico_sdk_import.cmake └── hello_reset.c3. 编写重置程序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按住BOOTSEL按钮连接Pico到电脑将生成的hello_reset.uf2拖入出现的U盘程序会自动运行并执行重置操作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.1681.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: vectorstring 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; } vectorstring restoreIpAddresses(string s) { if (s.size() 4 || s.size() 12) return ans; backtracking(s, 0, 0); return ans; } };4. 心得回溯法注意终止条件以及判断是否有效。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470659.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!