You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8T6 ADC配置故障:LED无法随电位器阻值变化闪烁

STM32F103C8T6 ADC控制LED闪烁故障排查

问题背景

基于STM32F103C8T6(Cortex-M3)开发ARM汇编项目,需求为:PC13引脚的LED随PA0引脚10KΩ电位器阻值成比例闪烁——阻值越低,闪烁频率越高;反之则越低。

已完成操作:按RM0008手册配置必要时钟,将PA0设为模拟输入,通过ADON位开启ADC1。主循环逻辑为启动ADC转换→等待转换完成→读取ADC_DR寄存器值计算延时→控制LED闪烁。

故障现象:LED仅保持常亮,调节电位器无任何变化。已确认电气连接无损坏,使用GNU ld链接器、启用Thumb模式,指令参考ARM官方文档,现需排查故障原因。

汇编代码

// Enabling PA0 as analog input (used below by ADC)
LDR r0, =0x40010800  // GPIOA_CRL, sets up low pins; GPIOA starts from 0x40010800 (Reference Manual, p. 51)
LDR r1, [r0]
BIC r1, 0xF << 0  // Clear MODE0 and CNF0 bits for PA0 -> setting analog mode
STR r1, [r0]

// Configuring ADC1
LDR r0, =0x40012400 + 0x08 // ADC_CR2 register for ADC1 (Reference Manual, p. 240)
LDR r1, [r0]
ORR r1, 1 << 0  // ADON bit - power on ADC1
STR r1, [r0]

main_loop:
    // ADC conversion
    LDR r0, =0x40012400 + 0x08
    LDR r1, [r0]
    ORR r1, 1 << 22  // SWSTART bit - starts conversion
    STR r1, [r0]

    wait_adc:
        LDR r0, =0x40012400  // ADC_SR register for ADC1 (Reference Manual, p. 237)
        LDR r1, [r0]
        TST r1, 1 << 1  // 
        BEQ wait_adc

    LDR r0, =0x40012400 + 0x4C  // ADC_DR - regular data register (Reference Manual, p. 251)
    LDR r2, [r0]
    LDR r3, =1000000

    MUL r0, r2, r3
    MOV r4, r0

    // Loop for waiting:
    delay_loop:
        SUBS r4, #1
        BNE delay_loop

    // toggle PC13
    LDR r0, =0x40011000 + 0x0c  // GPIOC_ODR
    LDR r1, [r0]
    EOR r1, 1 << 13 // ODR 13 - port 13
    STR r1, [r0]

    B main_loop

故障原因分析

  • ADC转换通道未配置:代码仅开启了ADC1,但未指定转换通道为PA0(对应ADC通道0)。STM32F1的ADC需在ADC_SQR3寄存器中设置规则序列的第一个通道,否则ADC可能默认转换错误通道,导致读取的DR值异常(如始终为0或最大值),延时固定后LED状态无变化。
  • ADC转换完成标志未清除:每次转换完成后,ADC_SR寄存器的EOC位(位1)需手动清除,否则下一次等待转换时会直接判定转换已完成,读取旧的DR值。当前代码仅等待EOC置位,未在读取DR后清除该标志,导致后续循环重复使用旧数据,延时无变化。
  • 延时逻辑与需求反向:需求是阻值越低(PA0电压越高,ADC值越大),闪烁频率越高(延时越短),但当前代码通过MUL r0, r2, r3让ADC值r2越大,延时r4越大,完全与需求反向。即使ADC工作正常,LED闪烁频率也会和预期相反,甚至因r2过大导致延时过长,LED看起来常亮。
  • PC13引脚未配置输出模式:代码直接操作GPIOC_ODR翻转PC13,但未初始化GPIOC的CRH寄存器(PC13属于高引脚,对应CRH寄存器),将其设置为推挽输出模式。若引脚处于默认输入状态,翻转ODR不会改变引脚电平,LED自然常亮。

内容的提问来源于stack exchange,提问作者ntonk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:42:46