STM32F103C8驱动编写问题:无法修改ADC CR2寄存器位值
问题分析与解决
- 基地址错误:你定义的
ADC_BASE_ADDR是0x40012800UL,这是STM32F103中ADC2的基地址,而非目标操作的ADC1基地址。ADC1的正确基地址为0x40012400UL,错误的地址导致你实际操作的是ADC2的寄存器空间。 - 时钟使能不匹配:你仅使能了ADC1的时钟(
RCC_APB2_ENR的位10),但实际操作的ADC2时钟(RCC_APB2_ENR的位9)未开启。STM32外设寄存器在时钟未使能时,所有写入操作均无效,这就是你写入CONT位后值仍为0、甚至循环写全1也无反应的核心原因。
修正后的代码
#include <stdint.h> #define RCC_BASE_ADDR 0x40021000UL #define RCC_APB2_ENR_OFFSET 0x18UL #define RCC_APB2_ENR_ADDR (RCC_BASE_ADDR + RCC_APB2_ENR_OFFSET) // 修正为ADC1的正确基地址 #define ADC1_BASE_ADDR 0x40012400UL #define ADC_CR2_OFFSET 0x08UL #define ADC1_CR2_ADDR (ADC1_BASE_ADDR + ADC_CR2_OFFSET) int main() { uint32_t *pRccApb2Enr = (uint32_t *)RCC_APB2_ENR_ADDR; uint32_t *pAdc1Cr2Reg = (uint32_t *)ADC1_CR2_ADDR; // 使能ADC1外设时钟 *pRccApb2Enr |= (1 << 10); // 置位ADC1的CONT位,开启连续转换模式 *pAdc1Cr2Reg |= (1 << 1); while(1); return 0; }
若需操作ADC2的调整方案
如果你的实际需求是操作ADC2,只需修改两处:
- 将时钟使能位改为ADC2对应的位:
*pRccApb2Enr |= (1 << 9); - 保持
ADC_BASE_ADDR为0x40012800UL即可。
内容的提问来源于stack exchange,提问作者GiGeNCo
相关产品推荐
相关产品推荐

