个人吐槽(不喜勿喷):我已经毕业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(空文件)

        ​​​​​​​        ​​​​​​​        

        启动文件获取方式

                st官网:STM32CubeF4 | 产品 - 意法半导体

                百度网盘: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);
    }
}


五、编译烧录

        

        

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐