STM32F407学习记录(一)创建一个寄存器工程
个人吐槽(不喜勿喷):我已经毕业1年了,在小私企做嵌入式开发,这一年来,我做得感觉好杂啊。要画PCB、要写固件、还要写对应的上位机,有点杂而不精,虽然确实对于我刚毕业那会,进步了太多,但这一年来我都没有好好去沉淀我的能力。这一年来,确实也参与了几个项目,比如核电子学的模拟多道、基于树莓派的上位机系统。玩过stm32、pico rp2350、esp32、树莓派,但都不深入,都是基于sdk开发的,甚至都没有用到freeRtos,纯裸机状态机进行开发。其实公司是主做FPGA的、研究院性质的一个公司,我的上级又是个硬件工程师,FPGA工程师是高校研究院的,不在我们公司。所以就造成了一个情况,我是公司里唯一一个写MCU的,除了硬件设计我可以请教我的领导。其他不涉及到FPGA的产品(小项目)都是我在开发,遇到问题我只能自己解决,代码写成屎也无所谓,功能实现就行。
公司让我开发的小项目,PCB、MCU固件、然后写一个配套的pyqt5上位机。这个项目在我手上就算结了。我有点迷茫,在这个公司不知道该怎么精进我的能力。不加班、双休、早九晚6,到家自学嵌入式。
不知道该怎么做,所以我打算重头来,这一年来东学西学,步子都点迈太大了。记录一下,希望各位大佬能够指点一下。
---------------------------------------------------------------------------------------------------------------------------------
一、创建一个工程文件夹

文件夹目录:
stm32f407
|__user 存放自己写的源文件
二、打开keil5创建一个工程
1.新建工程

2.选择工程目录

3.选择芯片

4.取消导入库文件

三、在user文件夹中添加启动文件(MCU上电运行的第一个汇编程序)、main.c(空文件)、main.h(空文件)

启动文件获取方式
百度网盘:https://pan.baidu.com/s/1t8hg2hyGNfOazCOwCZk2HQ?pwd=6vx6
解压后在这个路径下STM32Cube_FW_F4_V1.28.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
四、导入到工程中
1.魔法棒界面(添加头文件路径)





2.魔法棒界面(下载器设置)


3.导入文件


4.编写main.c
#include "main.h"
// ====================================================================
// 寄存器基地址(STM32F407)
// ====================================================================
#define RCC_BASE 0x40023800UL
#define RCC_AHB1ENR (*(volatile unsigned int *)(RCC_BASE + 0x30U))
#define GPIOE_BASE 0x40021000UL
#define GPIOE_MODER (*(volatile unsigned int *)(GPIOE_BASE + 0x00U))
#define GPIOE_OTYPER (*(volatile unsigned int *)(GPIOE_BASE + 0x04U))
#define GPIOE_OSPEEDR (*(volatile unsigned int *)(GPIOE_BASE + 0x08U))
#define GPIOE_PUPDR (*(volatile unsigned int *)(GPIOE_BASE + 0x0CU))
#define GPIOE_ODR (*(volatile unsigned int *)(GPIOE_BASE + 0x14U))
#define GPIOE_BSRR (*(volatile unsigned int *)(GPIOE_BASE + 0x18U))
// ====================================================================
// 延时函数(参数改为 unsigned int,调用时传递无符号数)
// ====================================================================
void delay(unsigned int count) {
while (count--);
}
// ====================================================================
// SystemInit(启动文件调用,空实现)
// ====================================================================
void SystemInit(void) {
// 留空,使用默认 HSI
}
// ====================================================================
// 主函数
// ====================================================================
int main(void) {
// 使能 GPIOE 时钟(AHB1ENR 第4位)
RCC_AHB1ENR |= (1UL << 4U); // 用 1UL 代替 1
// 配置 PE3 为输出模式(MODER[7:6] = 01)
GPIOE_MODER &= ~(0x3UL << 6U); // 0x3UL 无符号
GPIOE_MODER |= (0x1UL << 6U);
// 推挽输出(默认,可不配)
GPIOE_OTYPER &= ~(1UL << 3U);
// 低速(默认,可不配)
GPIOE_OSPEEDR &= ~(0x3UL << 6U);
// 无上拉/下拉(默认,可不配)
GPIOE_PUPDR &= ~(0x3UL << 6U);
while (1) {
GPIOE_ODR |= (1UL << 3U); // 点亮(高电平)
delay(500000U); // 传递无符号数
GPIOE_ODR &= ~(1UL << 3U); // 熄灭(低电平)
delay(500000U);
}
}
五、编译烧录


更多推荐


所有评论(0)