树莓派3B裸机Rust代码实现板载SD卡指示灯闪烁故障求助
树莓派3B裸机Rust代码无法让SD卡活动指示灯闪烁
我尝试用裸机Rust代码让树莓派3B上的SD卡活动绿色指示灯闪烁,但通电后指示灯仅亮1秒(SD卡活动状态)就熄灭,没有闪烁效果。
已完成操作
- 确认板载SD卡活动指示灯硬连接至GPIO 16
- 在代码中设置GPIO 16为输出模式:
// Set pin 16 to output mode let mut reg = GPIO_GPFSEL1.read_volatile(); reg &= !(0b111 << 18); // Clear bits 18-20 reg |= 0b001 << 18; // Set bits 18-20 to output mode GPIO_GPFSEL1.write_volatile(reg); - 编写循环代码设置/清除引脚输出值:
GPIO_GPSET0.write_volatile(1 << LED_PIN); // ... GPIO_GPCLR0.write_volatile(1 << LED_PIN); - 根据BCM2837手册定义寄存器常量:
const GPIO_GPFSEL1: *mut u32 = (0x3F20_0004) as *mut u32; const GPIO_GPSET0: *mut u32 = (0x3F20_001C) as *mut u32; const GPIO_GPCLR0: *mut u32 = (0x3F20_0028) as *mut u32; // GPIO pin number for the onboard LED const LED_PIN: u32 = 16; - 编译为ARM架构,通过链接器将代码起始地址对齐至0x8000,
objdump -D的顶部输出如下:Disassembly of section .text: 00008000 <_start>: 8000: e24dd058 sub sp, sp, #88 @ 0x58 8004: e3001004 movw r1, #4 8008: e3431f20 movt r1, #16160 @ 0x3f20 800c: e58d1034 str r1, [sp, #52] @ 0x34 8010: e58d1038 str r1, [sp, #56] @ 0x38 8014: e5910000 ldr r0, [r1] 8018: e58d003c str r0, [sp, #60] @ 0x3c 801c: e59d003c ldr r0, [sp, #60] @ 0x3c 8020: e58d0000 str r0, [sp] .... - 使用以下命令将ELF文件转换为扁平二进制文件:
arm-none-eabi-objcopy -O binary target/armv7a-none-eabi/debug/blinking_led target/binary/kernel7.img - 将SD卡格式化为FAT32,复制树莓派固件仓库中的
bootcode.bin、fixup.dat、start.elf文件,以及生成的kernel7.img到SD卡
故障现象
通电后绿色指示灯仅亮1秒(显示SD卡活动)后熄灭,并未出现闪烁效果。由于裸机代码调试难度大,无法定位问题,希望有相关经验的人帮忙排查错误,若需要更多信息我会尽力提供。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

