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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:37:13