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

STM32写入ADC_CR2寄存器无效果,是否需配置前置项?

问题:写入ADC控制寄存器2(ADC_CR2)的TSVREFE位无效果

我尝试向ADC控制寄存器2(ADC_CR2)写入0x00008000以置位TSVREFE位,但操作后该寄存器地址0x40012408仍保持复位初始值0x00000000,没有任何变化。请问是否需要配置前置项才能成功写入该寄存器?

为了测试,我编写了如下汇编例程:

__main      PROC
    EXPORT  __main
    LDR     R0, =ADC1_ADDR
    ADD     R0, #ADC_CR2_OFFSET
    MOV     R1, #0x00008000
    STR     R1, [R0]
    B   .
        
    ENDP

ADC1_ADDR               EQU 0x40012400
ADC_CR2_OFFSET          EQU 0x08

    END

执行后在B .行设置断点,内存窗口显示如下:

0x40012400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x40012410 ...
解答

这种情况核心原因是ADC外设时钟未使能。在STM32系列MCU中,所有外设的寄存器在对应总线时钟未开启时,写入操作会被硬件忽略,寄存器将始终保持复位后的初始状态。

针对你的场景,需要先开启ADC1对应的总线时钟(以STM32F1系列为例,ADC1挂载在APB2总线上),具体操作是向RCC_APB2ENR寄存器写入对应使能位:

  1. RCC_APB2ENR的默认地址为0x40021018
  2. 将该寄存器的第9位(ADC1EN位)置1,对应写入值为0x00000200

修改后的测试例程如下:

__main      PROC
    EXPORT  __main
    ; 先使能ADC1对应的APB2总线时钟
    LDR     R0, =RCC_APB2ENR_ADDR
    MOV     R1, #0x00000200
    STR     R1, [R0]
    ; 再写入ADC_CR2寄存器置位TSVREFE位
    LDR     R0, =ADC1_ADDR
    ADD     R0, #ADC_CR2_OFFSET
    MOV     R1, #0x00008000
    STR     R1, [R0]
    B   .
        
    ENDP

ADC1_ADDR               EQU 0x40012400
ADC_CR2_OFFSET          EQU 0x08
RCC_APB2ENR_ADDR        EQU 0x40021018

    END

额外注意事项:

  • 不同STM32系列的RCC寄存器地址、ADC挂载总线可能存在差异,比如STM32F4系列部分ADC挂载在APB1总线,需要参考对应型号的参考手册确认细节
  • 部分型号中,修改TSVREFE位需要确保ADC处于断电状态(ADON位为0),但先开启外设时钟是解决写入无效问题的首要步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:47:26