news 2026/7/12 18:35:53

STM32F407寄存器点灯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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优化激进。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 18:35:18

华为OD机试真题 新系统 2026-07-05 PythonJS 实现【二叉树两节点间的最小跳数】

目录 题目 思路 Code 题目 题目内容 给定一棵完全二叉树的层序遍历序列,用逗号分隔的节点值字符串表示,以及两个目标节点值 frm 和 to,求这两个节点之间的最小跳数,也就是最短路径经过的边数。 完全二叉树按数组下标表示,根节点索引为 0,索引为 i 的节点父节点索引为 …

作者头像 李华
网站建设 2026/7/12 18:30:40

maldev 终极指南:恶意软件开发技术深度解析与实践教程

maldev 终极指南&#xff1a;恶意软件开发技术深度解析与实践教程 【免费下载链接】maldev ⚠️ malware development 项目地址: https://gitcode.com/gh_mirrors/ma/maldev 在当今网络安全领域&#xff0c;理解恶意软件的工作原理对于防御者来说至关重要。maldev 项目提…

作者头像 李华
网站建设 2026/7/12 18:30:39

软件测试入门——第三十六课(性能测试之从用例设计到执行落地的完整方法论)

在数字化转型的浪潮中,软件系统的性能表现已成为决定用户体验和业务成败的关键因素。 性能测试不是简单的"压一压看能扛多少",而是一个严谨的工程过程。本文将分享一套经过实战检验的性能测试方法论,重点聚焦于测试用例设计和用例执行落地两个核心环节,帮助新人快…

作者头像 李华
网站建设 2026/7/12 18:29:36

Claude 与 ChatGPT:哪个更适合科研和学术写作,深入对比分析

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。 使用大模型智能AI进行学术写作和科研已经成为学者、研究人员和高校…

作者头像 李华