stm32寄存器开发,根据点灯了解寄存器底层逻辑(超详细)
目录前言一、配置寄存器学会看官方参考手册1.1 两个手册的区别1.2 GPIO地址公式1.3 怎样看外设基地址1.4 怎样看偏移地址1.5 详细步骤总结选CRL还是CRH配置引脚工作模式根据操作选择电平读写寄存器判断逻辑常见错误二、使用APB2 外设时钟使能寄存器2.1 什么是APB2总线2.2 为什么必须开启时钟2.3 RCC_APB2ENR关键bit位三、练习点亮LED灯3.1 LED原理图分析3.2 完整代码及分析led.hmain.cled.cled.c代码解析1.开启GPIOC时钟2.清空PC13旧配置3.配置PC13推挽输出 50MHZ4.初始化默认熄灭LED5.led_on() 点亮LED函数6.led_off() 熄灭LED函数3.3 使用BSRR/BRR寄存器四、常见报错总结4.1 没有开启GPIOC外设时钟4.2 缺少volatile关键字4.3 CRH寄存器没有先清空旧配置直接|赋值4.5 指针强制转换括号写错五、Keil Debug寄存器调试新手必备5.1正确状态前言很多STM32新手直接学HAL库、标准库只会调用函数完全不懂底层原理一旦程序异常、调试报错完全无从下手本文从零开始以点灯为例让你搞懂寄存器开发怎么看懂官方数据手册怎么自己算出寄存器地址每一行寄存器代码到底在干嘛常见报错 完整解决办法Keil Debug 寄存器调试实战实战硬件STM32F103C8T6一、配置寄存器学会看官方参考手册1.1 两个手册的区别数据手册引脚、电气参数参考手册重点所有寄存器地址、功能写代码只看这个1.2 GPIO地址公式寄存器真实地址 外设基地址 偏移地址1.3 怎样看外设基地址打开《STM32F103 参考手册》搜索存储器映像会看到一张外设地址表。这张表里列出所有外设的基地址就是这个外设的起始首地址。为了方便阅读我举GPIO的例子把它各个端口基地址的图片贴在这现在我们知道了寄存器的外设基地址那么偏移地址在哪呢1.4 怎样看偏移地址搜索GPIO寄存器描述这里包括的所有寄存器都有一个名为地址偏移Offset的地址这个就是偏移地址。下面给出总结这里有一些专有名词现在不懂没关系你只需要知道如何使用我将通过一个练习来说明寄存器偏移Offset寄存器作用详细说明CRL0x000‑7号引脚模式配置寄存器专门配置Px0~Px70到7号引脚的工作模式。每个引脚占用4个bitCNF(2位)设置功能模式MODE(2位)设置输出速度。可以配置成推挽输出、开漏输出、输入、复用功能。修改某一个引脚时要先把对应的4bit清零避免旧配置残留。CRH0x048‑15号引脚模式配置寄存器专门配置Px8~Px158到15号引脚。内部结构、位定义和CRL完全一样。只负责高8个引脚不要用来操作0‑7引脚。IDR0x08输入数据寄存器只读寄存器不能写。用来读取芯片引脚外部真实电平。某bit为1代表引脚外部是高电平bit为0代表引脚外部是低电平。做按键输入、外部信号检测时读取这个寄存器。对IDR做写操作没有任何效果。ODR0x0C输出数据寄存器可读、可写。用来设置GPIO引脚输出电平。bit位置1引脚输出高电平bit位置0引脚输出低电平。BSRR0x10置位寄存器置高只写寄存器读出的数据无意义。对某一位写1对应GPIO引脚输出高电平写0不起任何作用。不会影响其他引脚的状态不需要提前清零中断中使用很安全。BRR0x14复位寄存器置低只写寄存器读出的数据无意义。对某一位写1对应GPIO引脚输出低电平写0不起任何作用。不会影响其余引脚工程上优先推荐BSRRBRR操作输出。1.5 详细步骤总结选CRL还是CRH配置引脚工作模式CRL、CRH专门用来配置引脚模式输入、输出、速度。引脚编号0 ~ 7Px0~Px7→ 使用CRL偏移0x00引脚编号8 ~ 15Px8~Px15→ 使用CRH偏移0x04示例PA3、PA70‑7号引脚 → CRLPC8、PC138‑15号引脚 → CRH判断规则引脚号≥8一律使用CRH。根据操作选择电平读写寄存器想要实现的功能寄存器偏移读取外部引脚电平IDR0x08普通方式读写输出电平ODR0x0C设置引脚输出高电平BSRR0x10设置引脚输出低电平BRR0x14判断逻辑需要读取外部电压、检测按键 → 使用IDR只读不能写普通方式控制输出电平 → 使用ODR拉高引脚 → BSRR向对应bit写1拉低引脚 → BRR向对应bit写1BSRR、BRR为只写寄存器读取返回值无意义。常见错误BSRR写0不能拉低引脚拉低引脚要使用BRR写1读取按键电平不要读ODR外部真实电平看IDRCRL、CRH只设置模式不能控制引脚输出高低电平口诀0‑7用CRL8‑15找CRH读按键用IDRODR普通输出BSRR拉高BRR拉低。二、使用APB2 外设时钟使能寄存器2.1 什么是APB2总线STM32内部外设挂载在不同总线上APB2总线挂载GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、USART1、SPI1等高速外设APB1总线挂载USART2、TIM2‑TIM4、I2C等外设由RCC_APB1ENR控制时钟GPIO端口全部挂载在APB2总线上因此操作GPIO就要操作RCC_APB2ENR。2.2 为什么必须开启时钟STM32低功耗机制上电之后所有外设时钟默认关闭。时钟相当于外设的工作动力没有时钟外设内部电路不工作。即使你给CRL、CRH、ODR寄存器写入配置硬件也不会生效引脚没有任何反应。开启时钟本质向RCC_APB2ENR对应bit写1给对应外设提供时钟信号外设才能正常工作。2.3 RCC_APB2ENR关键bit位写1开启时钟写0关闭时钟也就是bit位控制外设bit2GPIOA时钟bit3GPIOB时钟bit4GPIOC时钟bit5GPIOD时钟bit6GPIOE时钟三、练习点亮LED灯3.1 LED原理图分析LED点亮条件阳极电压 阴极电压形成电流。本电路D2PC13控制LEDLED阳极接VCC3V3(3.3V)LED阴极经过510Ω限流电阻R5连接单片机PC13引脚PC13输出低电平(0V)对应寄存器bit写0阳极3.3V阴极0V存在电压差。电流路径VCC3V3 →LED →R5 →PC13。有电流LED点亮。PC13输出高电平(3.3V)对应寄存器bit写1阳极3.3V阴极3.3V两端电压几乎相等没有电流。LED熄灭。R5(510Ω)是限流电阻保护LED防止电流过大烧坏灯珠。上方D1阴极直接通过电阻接GND上电就常亮不受单片机控制。3.2 完整代码及分析led.h#ifndef__LED_H#define__LED_Hvoidled_init(void);voidled_on(void);voidled_off(void);#endifmain.c#includeled.hintmain(void){led_init();while(1){led_on();led_off();}}led.c#includeled.h//PC13 板载LED高电平灭、低电平亮voidled_init(void){//1.开启GPIOC时钟*((volatileunsignedint*)(0x400210000x18))|14;//2.清空PC13旧配置*((volatileunsignedint*)(0x400110000x04))~(0xf20);//3.配置PC13 推挽输出 50MHZ 00 11*((volatileunsignedint*)(0x400110000x04))|320;//4.默认熄灭*((volatileunsignedint*)(0x400110000x0C))|113;}//点亮LEDvoidled_on(void){*((volatileunsignedint*)(0x400110000x0C))~(113);}//熄灭LEDvoidled_off(void){*((volatileunsignedint*)(0x400110000x0C))|113;}led.c代码解析硬件背景板载LED接PC13PC13输出低电平(0)灯亮输出高电平(1)灯灭寄存器地址说明RCC_APB2ENR0x40021000 0x18时钟控制寄存器GPIOC_CRH0x40011000 0x04PC8~PC15模式配置寄存器GPIOC_ODR0x40011000 0x0CIO输出电平寄存器寄存器访问模板*((volatile unsigned int *)(基地址 偏移))#includeled.h#include led.h引入头文件led.h里面存放led_init()、led_on()、led_off()函数声明告诉编译器这几个函数存在。如果不包含头文件别的文件调用这些函数会报编译警告。//PC13 板载LED高电平灭、低电平亮voidled_init(void){void led_init(void)LED初始化函数程序启动必须调用一次PC13引脚才可以正常工作。void函数没有返回值括号内void代表调用函数不需要传入任何参数。1.开启GPIOC时钟//1.开启GPIOC时钟*((volatileunsignedint*)(0x400210000x18))|14;0x40021000 0x18RCC_APB2ENR寄存器硬件物理地址STM32寄存器地址固定写死。(volatile unsigned int *)把数字地址强制转为无符号int类型指针。volatile关键字告诉编译器这是硬件寄存器禁止编译器做优化每次读写都直接访问硬件去掉会出现莫名其妙bug。最前面的*指针解引用代表读写这个地址对应的硬件寄存器。1 4数字1二进制0001向左移动4位得到0001 0000bit4等于1其余bit全部为0。小技巧借助电脑的计算器WinR → 输入 calc → 回车这个代表偏移2.清空PC13旧配置//2.清空PC13旧配置*((volatileunsignedint*)(0x400110000x04))~(0xf20);0x40011000 0x04GPIOC_CRH寄存器地址PC8~PC15引脚全部由CRH寄存器配置。手册PC13占用CRH的bit20、bit21、bit22、bit23一个GPIO引脚占用4bit配置模式。0xf十六进制二进制11114个连续的1正好对应PC13的4个配置位。0xf 20将1111整体向左移动20位对齐bit20~bit23。~(0xf 20)~按位取反运算符bit20‑23变成0000寄存器剩下所有bit全部变成1。按位与赋值等价a a b。运算规则有0则0全1才1。只把bit20‑bit23强制清零寄存器其他bit完全不变。为什么要清零单片机上电寄存器是随机乱值不清零旧配置新引脚模式会出错。3.配置PC13推挽输出 50MHZ//3.配置PC13 推挽输出 50MHZ 00 11*((volatileunsignedint*)(0x400110000x04))|320;3二进制0011。3 20把二进制0011移动到bit20、bit21。CRH每个引脚4bit格式CNF1 CNF0 MODE1 MODE0PC13bit23 bit22 bit21 bit20 00 11MODE[1:0] 11输出模式最大速度50MHzCNF[1:0] 00通用推挽输出引脚既可以输出0V也可以输出3.3V。4.初始化默认熄灭LED//4.默认熄灭*((volatileunsignedint*)(0x400110000x0C))|113;}0x40011000 0x0CGPIOC_ODR输出寄存器地址。ODR每1bit对应一个IO引脚输出电平。bit13对应PC13。bit131引脚输出高电平3.3Vbit130引脚输出低电平0V1 13bit13位置置1其余bit为0。|把ODR寄存器bit13写1。5.led_on() 点亮LED函数//点亮LEDvoidled_on(void){*((volatileunsignedint*)(0x400110000x0C))~(113);}操作ODR输出寄存器。1 13bit131。~(113)按位取反bit13变为0其他所有bit全部为1。只把bit13写0其余bit保持不变。ODR.bit13 0 →PC13输出0V低电平LED点亮。6.led_off() 熄灭LED函数//熄灭LEDvoidled_off(void){*((volatileunsignedint*)(0x400110000x0C))|113;}操作ODR输出寄存器。1 13bit13位置为1。|ODR寄存器bit13置1。ODR.bit131 →PC13输出3.3V高电平LED熄灭。3.3 使用BSRR/BRR寄存器不需要清除位不会出错推荐工程使用//亮灯*((volatileunsignedint*)(0x400110000x14))|113;//灭灯*((volatileunsignedint*)(0x400110000x10))|113;读者一定要自己写出完整代码检验一下总结开启外设时钟永远是第一步不开时钟GPIO完全无效。CRH寄存器每个引脚占4bit设置引脚工作模式清空旧值 ~(0xf n)设置新模式| 数值 nODR寄存器1bit控制1个引脚输出电平输出高电平置1| 1 n输出低电平置0 ~(1 n)volatile关键字操作硬件寄存器不能省略。灯亮灭不只看寄存器0/1必须看原理图PC13电路是写0亮写1灭。四、常见报错总结4.1 没有开启GPIOC外设时钟现象代码逻辑正确LED无任何反应寄存器写入无效。原理STM32外设上电默认关闭时钟时钟关闭硬件模块不工作。解决RCC_APB2ENR | 1 4;开启GPIOC时钟。4.2 缺少volatile关键字现象编译无报错运行功能异常寄存器读写被编译器优化。原理volatile禁止编译器优化强制每次读写直接访问硬件寄存器。正确写法*((volatile unsigned int *)(addr))4.3 CRH寄存器没有先清空旧配置直接|赋值现象引脚模式异常输出错乱。原因上电寄存器是随机值旧配置位没有清除新旧数值叠加。正确顺序先清零 ~(0xf 20)再写入新配置| 3 20。4.5 指针强制转换括号写错指针转换括号必须完整括号位置错误直接编译报错地址相加也要带括号血与泪的教训五、Keil Debug寄存器调试新手必备进入Debug调试小虫子打开外设窗口Peripherals → RCC看时钟Peripherals → GPIOC看引脚配置5.1正确状态RCC bit4 1时钟开启CRH bit20~23 0011输出模式ODR bit13可0可1电平正常翻转不会点灯全部靠这三个地方排查

相关新闻

Awesome Transformers完全指南:从入门到精通的终极Transformer模型清单

Awesome Transformers完全指南:从入门到精通的终极Transformer模型清单

Awesome Transformers完全指南:从入门到精通的终极Transformer模型清单 【免费下载链接】awesome-transformers A curated list of awesome transformer models. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-transformers Awesome Transformers是一…

2026/10/18 13:22:06 阅读更多 →
AI 改变工作方式的工具链选型评估:工具选型别只比较参数

AI 改变工作方式的工具链选型评估:工具选型别只比较参数

AI 改变工作方式的工具链选型评估:工具选型别只比较参数范围说明: 本文给出评估方法;工具收益须在具体代码库、任务和协作约束下测量。选 AI 开发工具时,参数量、上下文窗口和公开榜单可以作为参考,却不能代替团队自己…

2026/10/19 15:36:40 阅读更多 →
telegram-history-dump开发者指南:自定义格式化器实现教程

telegram-history-dump开发者指南:自定义格式化器实现教程

telegram-history-dump开发者指南:自定义格式化器实现教程 【免费下载链接】telegram-history-dump Backup Telegram chat logs using telegram-cli 项目地址: https://gitcode.com/gh_mirrors/te/telegram-history-dump telegram-history-dump是一款基于tel…

2026/10/18 13:22:48 阅读更多 →

最新新闻

180篇高引论文拆解:Agent研究四大创新切口与选题方法

180篇高引论文拆解:Agent研究四大创新切口与选题方法

做 Agent 方向的研究,最怕的往往不是代码写不出来,而是开题时坐在屏幕前憋不出一个像样的点。我从去年到今年集中把 ACL、EMNLP、NAACL、ICML、NeurIPS、ICLR、AAAI 这七个会议里的 Agent 相关高引工作翻了一遍,粗算下来接近 180 篇。这些论文…

2026/10/20 4:46:49 阅读更多 →
降AI率实操指南:9个工具与5大避坑方法

降AI率实操指南:9个工具与5大避坑方法

学期末最刺激的事情不是查成绩,是论文提交后屏幕里跳出一行小字:“AI 生成概率 57%,请确认是否有使用生成式AI工具。”我当时盯着那行字,差点连鼠标都捏碎了。论文是我自己一字一句写出来的,反复改了三版,文…

2026/10/20 4:46:49 阅读更多 →
2026年AI费控系统推荐榜:7款主流产品深度对比评测

2026年AI费控系统推荐榜:7款主流产品深度对比评测

做了十几年财务,费控系统换了好几茬。从最早的纸质报销,到ERP里的报销模块,再到专业的费控SaaS,现在又到了AI费控时代。每次选型都是一场硬仗——销售说得天花乱坠,实际用起来又是另一回事。这篇评测是我花了一个多月时…

2026/10/20 4:46:49 阅读更多 →
DNS故障为何难发现?一套可落地的监控方案与排障避坑指南

DNS故障为何难发现?一套可落地的监控方案与排障避坑指南

某头部社交平台那次全球范围的服务中断,哪怕已经过去了很久,在很多团队的复盘文档里依然是必讲案例。服务中断的整整几个小时里,旗下的即时通讯、社交主页、账号体系几乎全部不可用,用户端报错五花八门。有人猜测是服务器整体宕机…

2026/10/20 4:46:49 阅读更多 →
户外广告数字化采购怎么做?传播易全流程投放避坑与落地解决方案

户外广告数字化采购怎么做?传播易全流程投放避坑与落地解决方案

在品牌营销预算日趋精细化、线下流量价值重回行业视野的当下,户外广告的行业定位已发生根本性转变:从传统营销体系中补充性曝光渠道,升级为企业搭建品牌资产、实现区域市场深度渗透的核心营销抓手。伴随线上流量竞争白热化、公域获客成本持续…

2026/10/20 4:46:49 阅读更多 →
AI模型能力评估的技术方法与实践路径

AI模型能力评估的技术方法与实践路径

我不能基于该标题生成博文。原因如下:标题涉及具体政治机构(“NYC 议会”)、特定组织(“Anthropic”)及明确事件场景(“听证会”),属于真实可查的公共政治活动,直接展开将…

2026/10/20 4:45:49 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →