当前位置: 首页 > news >正文

STM32F407寄存器点灯

一.创建keil 工程

二.代码

1.观察原理图,发现led的gpio引脚为PF9和PF10

1.先使能GPIOF

2.查看F407芯片手册,设置寄存器,查看到GPIOF的基地址是0x4002 3800

又查看到AHB1模式寄存器的偏移地址为0x30,也就是(0x4002 3800+0x30),同时我们要把bit5设置为1,使能

2.配置GPIOF9和F10引脚

查看到GPIOF的基地址是0x4002 1400

又查看到GPIO模式寄存器的偏移地址为0x00,也就是(0x4002 1400+0x00),同时我们要把MODER9和MODER10都设置为01

接着查看到output type寄存器偏移地址为0x04,也就是(0x4002 1400+0x04),同时同时我们要把OT9和OT10都设置为0(推挽输出)

然后查看到speed寄存器偏移地址为0x08,也就是(0x4002 1400+0x08),同时我们要OSPEEDR9和OSPEEDR10都设置为00(低速)

上下拉电阻这边就不配置了,因为硬件上已经配置了上拉电阻

3.配置引脚输出高低电平

查看到寄存器偏移地址为0x18,也就是(0x4002 1400+0x18)

PF9高电平:bit9设置为1 PF9低电平:bit25设置1

PF10高电平:bit10设置为1 PF10低电平:bit26设置为1

void delay(int timeout); void delay(int timeout) { while(timeout --); } int main(void) { volatile unsigned int *pReg9; volatile unsigned int *pReg10; /* 使能GPIOF */ pReg9 = (unsigned int *)(0x40023800 + 0x30); pReg10 = (unsigned int *)(0x40023800 + 0x30); *pReg9 |= (1<<5); *pReg10 |= (1<<5); /* 设置GPIOF9、GPIOF10为输出引脚 */ pReg9 = (unsigned int *)(0x40021400 + 0x00); pReg10 = (unsigned int *)(0x40021400 + 0x00); *pReg9 |= (0x01<<18); *pReg10 |= (0x01<<20); /* 设置GPIOF9、GPIOF10为推挽输出 */ pReg9 = (unsigned int *)(0x40021400 + 0x04); pReg10 = (unsigned int *)(0x40021400 + 0x04); *pReg9 &= ~(1<<9); *pReg10 &= ~(1<<10); /* 设置GPIOF9、GPIOF10为低速输出 */ pReg9 = (unsigned int *)(0x40021400 + 0x08); pReg10 = (unsigned int *)(0x40021400 + 0x08); *pReg9 &= ~(0x03<<18); *pReg10 &= ~(0x03<<20); // pReg9 = (unsigned int *)(0x40021400 + 0x14); // pReg10 = (unsigned int *)(0x40021400 + 0x14); pReg9 = (unsigned int *)(0x40021400 + 0x18); pReg10 = (unsigned int *)(0x40021400 + 0x18); while(1) { /* 设置GPIOF9、GPIOF10输出1 */ *pReg9 |= (1<<9); *pReg10 |= (1<<10); // *pReg9 |= (1<<9); // *pReg10 |= (1<<10); delay(100000); /* 设置GPIOF9、GPIOF10输出0 */ *pReg9 |= (1<<25); *pReg10 |= (1<<26); // *pReg9 &= ~(1<<9); // *pReg10 &= ~(1<<10); delay(100000); } return 0; }

三.汇编启动文件

PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD 0 DCD Reset_Handler ; Reset Handler AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT main LDR SP, =0x20000000 + 0x20000 BL main ENDP END

四.注意事项

同时也要注意的一点是控制寄存器需要加volatile

这里要注意的一点是:使用版本5实现,time可以不用加volatile,但是使用版本6实现的话是一定要加volatile,不然会被编译器优化掉。版本6比版本5优化激进。

http://www.cnnetsun.cn/news/3321966.html

相关文章:

  • 华为OD机试真题 新系统 2026-07-05 PythonJS 实现【二叉树两节点间的最小跳数】
  • 高性能单线程异步架构设计:ET框架核心技术深度解析与性能优化实战
  • maldev 终极指南:恶意软件开发技术深度解析与实践教程
  • 软件测试入门——第三十六课(性能测试之从用例设计到执行落地的完整方法论)
  • Claude 与 ChatGPT:哪个更适合科研和学术写作,深入对比分析
  • 【HarmonyOS】List组件多层对象嵌套ForEach渲染更新完全指南(@Observed、@ObjectLink、@State、Array刷新原理
  • 从“等客进店”到“上门成交”:服装门店移动POS离店收银的完整业务流程2026
  • 如何用Tabby的分屏和SSH功能实现高效多任务终端管理:完整指南
  • AI编程与低代码平台有什么区别?2026年企业如何选择AI开发工具
  • 工业具身智能开启从技术验证向场景落地的进阶
  • mac玩超级变色龙的方法 mac怎么玩超级变色龙
  • IbPy终极指南:如何快速连接TWS实现Python程序化交易
  • 如何用LocalAI打破云端AI垄断:完全本地化的开源AI引擎终极指南
  • 为什么 Transformer 模型位置编码选择三角函数?
  • Cortex M7-TRM 翻译系列之Programmers Model(二)
  • 解放双手!MAA助手3步实现《明日方舟》全自动化日常管理
  • DAY1 初步认识github平台
  • 北京积水潭医院贵州医院双院区全栈国产化实战:40+模块批量上线与跨院区数据互通方案
  • python神经网络编程入门(七)——跑通MNIST手写数字识别,验证训练成果与测试准确率。
  • 019-费曼学习法与主动回忆的互补
  • 安全剖析:git-credential-oauth如何保护你的Git认证信息不被泄露
  • 终极PUBG罗技鼠标宏压枪脚本完整指南:快速掌握精准射击
  • 基于大模型的数据库自动化测试:从SQL生成到回归验证的智能流水线设计
  • 企业级应用:git-credential-oauth在团队环境中的部署与策略建议
  • React Glow最佳实践:避免常见陷阱的10个技巧
  • 龍魂·鸿蒙网络请求工程化:Axios封装深度解析与实战技术文档
  • Transformers-Tutorials:100+个实战教程,手把手教你玩转AI模型
  • DeltaForce-OBS-Locker深度解析:计算机视觉技术在游戏辅助中的创新应用与架构设计
  • Kohya_SS完整指南:从零开始掌握AI模型训练的终极教程
  • Bilibili-Old终极指南:三步恢复B站经典界面,找回你的青春记忆