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寄存器写入对应使能位:
- RCC_APB2ENR的默认地址为0x40021018
- 将该寄存器的第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
相关产品推荐
相关产品推荐

