第一章 基础知识

1.1 单片机

1.1.1 单片机介绍

单片机(Microcontroller Unit,MCU)是一种集成了处理器核心(CPU)、存储器(RAM、ROM/Flash)、输入/输出接口(I/O)以及其他外设功能模块的微型计算机系统。它通常被用于嵌入式系统中,执行特定的控制任务。由于其高度集成、低功耗、成本低廉等特点,单片机广泛应用于工业控制、家用电器、汽车电子、智能设备等领域。

1.1.2 单片机组成

单片机的基本组成包括以下几个部分:

中央处理器(CPU):单片机的核心部分,负责执行指令、处理数据和控制其他模块的工作。CPU的架构可以是8位、16位或32位,不同位数的单片机适用于不同的应用场景。

存储器

  • ROM/Flash:用于存储程序代码和常量数据。Flash存储器具有可擦写特性,便于程序的更新和调试。
  • RAM:用于存储程序运行时的临时数据,如变量、堆栈等。RAM的容量通常较小,但访问速度快。

输入/输出接口(I/O):单片机通过I/O接口与外部设备进行数据交换。常见的I/O接口包括GPIO(通用输入输出)、UART(串行通信接口)、SPI(串行外设接口)、I2C(集成电路总线)等。

定时器/计数器:用于生成精确的时间延迟、测量时间间隔或计数外部事件。定时器/计数器是单片机中非常重要的外设,常用于PWM(脉宽调制)信号生成、电机控制等应用。

中断系统:单片机通过中断系统响应外部或内部事件。中断可以实时处理紧急任务,提高系统的响应速度。

模拟/数字转换器(ADC/DAC):部分单片机集成了ADC(模数转换器)和DAC(数模转换器),用于处理模拟信号。ADC可以将模拟信号转换为数字信号,DAC则可以将数字信号转换为模拟信号。

通信接口:单片机通常支持多种通信协议,如UART、SPI、I2C、CAN等,便于与其他设备进行数据交换。

1.1.3 单片机的特点

高度集成:单片机将CPU、存储器、I/O接口等功能模块集成在一个芯片上,减少了外部元器件的数量,降低了系统的复杂性和成本。

低功耗:单片机通常设计为低功耗器件,适用于电池供电或对功耗要求较高的应用场景。

成本低廉:由于单片机的集成度高,生产成本较低,适合大规模应用。

易于编程和调试:单片机通常支持C语言、汇编语言等编程语言,开发工具链完善,便于程序的编写和调试。

实时性强:单片机具有快速响应外部事件的能力,适合实时控制任务。

1.1.4 单片机的应用场景

可以去看看别人的创新产品:

淘宝众筹:https://izhongchou.taobao.com/index.htm

京东众筹:https://z.jd.com/sceneIndex.html

工业控制

PLC

单片机应用场景_1_PLC

电机控制器

单片机应用场景_2_电机控制器

家用电器

洗衣机/空调/微波炉。。。

单片机应用场景_3_家用电器

汽车电子

单片机应用场景_4_车载娱乐系统

智能设备

单片机应用场景_7_智能家居&手表

医疗设备

单片机应用场景_8_智能医疗

1.2 ARM体系

1.2.1 ARM介绍

ARM(Advanced RISC Machines)是一家全球领先的半导体和软件设计公司,成立于1990年,总部位于英国剑桥。ARM 公司专注于设计低功耗、高性能的处理器架构,并通过授权其知识产权(IP)给芯片制造商来盈利。ARM 本身不生产芯片,而是通过授权其技术给其他公司(如高通、苹果、三星等),这些公司基于 ARM 架构设计和制造自己的处理器。

ARM(Advanced RISC Machine)是一种基于精简指令集计算(RISC)架构的处理器设计。ARM 架构以其高效能、低功耗和低成本的特点,广泛应用于移动设备、嵌入式系统、物联网设备、汽车电子、服务器等领域。

1.2.3 ARM处理器系列

Cortex-A 系列:面向高性能应用,如智能手机、平板电脑、服务器等。Cortex-A 系列处理器通常具有较高的计算能力和多核设计,适合运行复杂的操作系统(如 Android、Linux 等)和应用程序。

Cortex-R 系列:面向实时应用,如汽车电子、工业控制、医疗设备等。Cortex-R 系列处理器具有高实时性和可靠性,适合处理实时任务。

Cortex-M 系列:面向低功耗、低成本嵌入式应用,如物联网设备、智能家居、传感器等。Cortex-M 系列处理器通常具有较小的尺寸和低功耗,适合资源受限的嵌入式系统。

Cortex-X 系列:面向极致性能需求,如高端智能手机、平板电脑等。Cortex-X 系列处理器在 Cortex-A 系列的基础上进一步优化性能,适合对计算能力要求极高的应用。

ARM Cortex系列分类

ARM处理器性能比较

image-20250205095947241

ARM体系结构的发展过程

ARM体系结构的发展过程

1.3 STM32介绍

注意: 外面企业不一定全使用STM32的芯片,有很多,例如飞思卡尔、恩智浦(NXP)、Amtel、德州仪器(TI)、台湾新唐公司的。

1.3.1 STM32简介

1、ST公司介绍

STM32 是由意法半导体(STMicroelectronics)推出的一系列基于 ARM Cortex-M 内核的 32 位微控制器。STM32 以其高性能、低功耗、丰富的外设和广泛的应用领域而闻名,广泛应用于工业控制、消费电子、物联网、汽车电子等领域。STM32 系列产品线丰富,涵盖了从低端到高端的多种型号,满足不同应用场景的需求。

官网地址:意法半导体官网 | ST官网 - STMicroelectronics

后续各位要是工作中查找ST公司的资料可以在官网直接查找

STM32芯片选型如下

STM32选型

我们的芯片 STM32F407IGH6芯片

家族:"STM32,32为MCU"
产品类别:"基础型"
特定功能:"高性能,带DSP和FPU"
引脚数量:"201引脚"
闪存容量:"1024Kbyte"
封装类型:"LFBGA"
温度范围:"6和A  -40到+85℃"

2、认识芯片

这里我们以 STM32F407IGH6 芯片为例,主要介绍芯片的丝印和引脚信息以及引脚方向,图片如下。

微信图片_20250319154147

丝印

  1. STM32F407VET6:这是芯片的型号,表示这是STM32F4系列中的一款芯片,具体型号为F407VET6。
  2. ARM:表示该芯片基于ARM Cortex-M4内核。
  3. 生产批次号:通常是一串字母和数字的组合,用于标识芯片的生产批次和日期。
  4. 其他标识:可能包括制造商的标志、环保标识等。

芯片封装

封装信息: QFP-100 封装

引脚方向: QFP-100 封装会有一个小圆点作为标记,小圆点所在的一角对应的引脚为起始引脚,一般也是按照逆时针方向来确定其他引脚的顺序和芯片方向。

引脚信息

  1. 电源引脚
    • VDD:数字电源引脚,通常有多个,用于提供芯片的数字部分电源。
    • VSS:数字地引脚,通常有多个,用于提供芯片的数字部分地。
    • VDDA:模拟电源引脚,用于提供芯片的模拟部分电源。
    • VSSA:模拟地引脚,用于提供芯片的模拟部分地。
    • VBAT:电池电源引脚,用于备份域电源。
  2. 时钟引脚
    • OSC_IN/OSC_OUT:外部晶振输入/输出引脚。
    • OSC32_IN/OSC32_OUT:外部32.768kHz晶振输入/输出引脚。
  3. 复位引脚
    • NRST:复位引脚,低电平有效。
  4. 调试引脚
    • SWDIO:串行调试数据输入/输出引脚。
    • SWCLK:串行调试时钟引脚。
  5. GPIO引脚
    • GPIOx:通用输入输出引脚,x可以是A、B、C、D等,用于连接外部设备。
  6. 外设引脚
    • USARTx_TX/USARTx_RX:串口发送/接收引脚。
    • SPIx_SCK/SPIx_MISO/SPIx_MOSI:SPI接口时钟/主输入从输出/主输出从输入引脚。
    • I2Cx_SCL/I2Cx_SDA:I2C接口时钟/数据引脚。
    • TIMx_CHx:定时器通道引脚。
  7. 其他功能引脚
    • BOOT0/BOOT1:启动模式选择引脚。
    • JTAG引脚:用于JTAG调试接口的引脚。

1.3.2 STM32和ARM

ARM是一个公司,专注于开发和许可处理器架构,而STM32是ST公司推出的一系列基于ARM Cortex-M内核的产品系列。STM32利用ARM处理器核心的优势,提供了高性能、低功耗和丰富的外设功能,使其广泛应用于嵌入式系统和物联网设备。

ARM和STM32

1.3.3 Cortex-M内核

STM32 微控制器基于 ARM Cortex-M 系列内核,主要包括 Cortex-M0、Cortex-M3、Cortex-M4 和 Cortex-M7。这些内核具有以下特点:

  1. Cortex-M0:面向低功耗、低成本应用,适合简单的控制任务。
  2. Cortex-M3:提供更高的性能和更丰富的外设,适合中等复杂度的应用。
  3. Cortex-M4:在 Cortex-M3 的基础上增加了浮点运算单元(FPU)和 DSP 指令集,适合数字信号处理和高性能应用。
  4. Cortex-M7:具有更高的时钟频率和更强的计算能力,适合高性能和实时性要求高的应用。

1.3.4 CMSIS固件库

CMSIS(Cortex Microcontroller Software Interface Standard)是 ARM 提供的一套用于 Cortex-M 系列处理器的软件接口标准。CMSIS 固件库为开发者提供了统一的硬件抽象层,简化了底层硬件的操作,提高了代码的可移植性和可重用性。CMSIS 主要包括以下几个部分:

  1. CMSIS-Core:提供对 Cortex-M 内核的基本支持,如中断控制、系统初始化等。
  2. CMSIS-DSP:提供数字信号处理库,支持各种数学运算和滤波算法。
  3. CMSIS-RTOS:提供实时操作系统(RTOS)接口,支持多任务调度和同步机制。
  4. CMSIS-Driver:提供标准化的外设驱动接口,简化外设的配置和使用。

1.3.5 SOC片上系统

系统级芯片(System on Chip,简称SoC),也称片上系统,意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。同时它又是一种技术,用以实现从确定系统功能开始,到软/硬件划分,并完成设计的整个过程。 System on Chips 完整集成了CPU、GPU、通信等模块的手机主芯片。

SOC

1.3.6 MCU 和 MPU 的区别

MCU(微控制单元):集成了处理器、内存和外设接口的单芯片系统,常用于嵌入式应用,如传感器控制和设备驱动。

MPU(微处理器单元):主要是处理器核心,通常不包含内存和外设,需要外部组件来实现完整功能,适用于复杂的计算任务和高性能应用。

对比如下

特性MCU(微控制器)MPU(微处理器)
集成度高(集成 CPU、内存、外设)低(通常只有 CPU 核心)
性能较低(适合简单任务)较高(适合复杂计算)
功耗低(适合低功耗应用)高(需要外部电源管理)
应用场景实时控制、简单任务处理高性能计算、多任务操作系统
开发复杂度较低(裸机编程或 RTOS)较高(需要完整操作系统)
成本较低(适合低成本设备)较高(适合高性能设备)

1.3.7 STM32开发方式

1、 基于寄存器开发

基于寄存器进行开发,传统单片机项目开发方法,通过配置硬件寄存器来控制硬件外设的工作。

优点:代码效率高,对硬件工作原理,寄存器理解透彻;

缺点:需要关注硬件寄存器的每个 bit ,需要配置每个相关寄存器,开发效率比较低。

2、 基于库函数开发

基于固件库进行开发,直接调用 STM32 厂商提供的固件库函数来配置硬件,不用关注硬件寄存器。常用的库 STD LL HAL 库等,其中STD 固件库最接近寄存器开发,探索寄存器本质。

优点: 开发人员只需了解库函数的用法,不用关注具体硬件寄存器,提升开发效率 缺点: 代码效率相对寄存器开发要低,也不能全面了解硬件处理器,屏蔽了硬件底层的实现细节。

ST公司有三种库版本:标准库、HAL库、LL库 · 标准库:成熟稳定的版本,现在很多企业一直沿用该版本。 · HAL库:尽可能屏蔽硬件底层,目标实现跨平台,可以通过界面来进行编程。从而产生效率不高,可阅读性较弱。 · LL库:更加接近底层的库。

注意:我们的课程讲解主要是基于标准固件库进行开发。

1.2.8 STM32内部外设

内部外设

1.3.9 关于周期

时钟周期: 时钟是CPU的动力源,CPU之所以能够快速工作就是由时钟驱动,时钟不停的振荡,CPU就不停的工作。时钟周期是CPU内部衡量时长的最基本单位。

机器周期: 也叫CPU周期,规定为CPU访问一次内存所需要的最短时间。这就是说,一条指令的取值阶段(从内存读取)就需要一个机器周期。一个机器周期可能由若干个时钟周期组成。

指令周期: 一条指令完成所需要的时间,可能由若干个机器周期组成。因此,从时间长度来说,指令周期 > 机器周期 > 时钟周期。

周期

1.4 如何学习STM32

1.4.1 学习方法

image-20250205144848269

学习基础知识:了解STM32F4系列微控制器的基本特性、架构和主要组件。学习相关的电子原理、嵌入式系统和C编程知识,以便理解和应用STM32F4。

学习开发工具:熟悉STM32F4开发板和相关开发工具,如Keil MDK(Microcontroller Development Kit)或STM32CubeIDE。了解开发工具的安装、配置和使用方法。

掌握编程语言:掌握C语言编程,它是开发STM32F4的主要编程语言。学习C语言的基本语法、数据类型、控制流程和函数等知识,以便编写STM32F4的应用程序。

学习官方文档和参考资料:查阅STM32F4系列的官方文档,包括参考手册、数据手册和应用笔记等。这些文档提供了详细的技术规格、功能描述和应用示例,有助于理解和使用STM32F4的功能和特性。

进行实验和项目:通过实验和项目来实际应用和巩固所学的知识。选择一些简单的项目,例如LED控制按键输入PWM输出等,逐步增加难度和复杂性,以提高对STM32F4的理解和应用能力。

参与社区和论坛:加入STM32F4的开发者社区和在线论坛,与其他开发者交流经验和问题。这些社区和论坛提供了丰富的资源、教程和技术支持,可以帮助解决遇到的问题和提供进一步的学习材料。

加入众筹网站

造点新货

继续学习和实践:STM32F4系列微控制器具有广泛的应用领域和功能,因此学习过程应该是一个持续的过程。随着经验的积累,可以尝试更复杂的项目和应用,深入学习更高级的功能和技术,如中断处理、外设驱动、通信协议等。

1.4.2 查看文档

《STM32F4xx 中文参考手册》

这个文件全方位介绍了 STM32 芯片的各种片上外设,它把 STM32 的时钟、存储器架构、及各种外设、寄存器都描述得清清楚楚。当我们对 STM32 的外设感到困惑时,可查阅这个文档。以直接配置寄存器方式开发的话,查阅这个文档寄存器部分的频率会相当高,但这样效率太低了。

《STM32F4xx 英文数据手册》

本文档相当于 STM32 的 datasheet,包含了 STM32 芯片所有的引脚功能说明及存储器架构、芯片外设架构说明。后面我们使用 STM32 其它外设时,常常需要查找这个手册,了解外设对应到 STM32 的哪个 GPIO 引脚。

《Cortex™-M4 内核参考手册》

本文档由 ST 公司提供,主要讲解 STM32 内核寄存器相关的说明,例如系统定时器、中断等寄存器。这部分的内容是《STM32F4xx 参考手册》没涉及到的内核部分的补充。相对来说,本文档虽然介绍了内核寄存器,但不如以下两个文档详细,要了解内核时,可作为以下两个手册的配合资料使用。

《Cortex-M3 权威指南》《cortex_m4_Technical Reference Manual》

这两个手册是由 ARM 公司提供的,它详细讲解了 Cortex 内核的架构和特性,要深入了解 Cortex-M 内核,这是首选,经典中的经典,其中 Cortex-M3 版本有中文版,方便学习。因为 Cortex-M4 内核与 Cortex-M3 内核大部分相同,可用它来学习,而 Cortex-M4 新增的特性,则必须参考《cortex_m4_Technical Reference Manual》文档了,目前只有英文版。

《stm32f4xx_dsp_stdperiph_lib_um.chm》

这个就是本章提到的库的帮助文档,在使用库函数时,我们最好通过查阅此文件来了解标准库提供了哪些外设、函数原型或库函数的调用的方法。也可以直接阅读源码里面的函数的函数说明。

1.4 硬件平台介绍

1.4.1 整体资源介绍

image-20250211133020103

微信图片_20250319154147

微信图片_20250319154753

1.4.2 STM32F407核心板

主控芯片:STM32F407IGH6

image-20250401171234701

微信图片_20250319154750

STM32F407IGH6 具体的内部资源如下表所示:

STM32F407IGH6_资源

关于 STM32F407 内部资源详细介绍,可以参考 器件手册---->核心板参考手册---->STM32F4 参考手册.pdf,里面有全面的介绍。

1、命名规则

STM32选型

image-20250211133245404

2、引脚分布

image-20250211133731470

3、引脚定义

当我们拿到一个芯片时,首先需要查阅其数据手册以了解引脚定义和功能。对于 STM32F4x7 系列芯片,可以参考 STM32F4x7-Datasheet.pdf 文件中的 Table 5: STM32F40x Pin and Ball Definitions

image-20250211134922049

UFBGA176:封装形式。超薄轮廓细间距球栅阵列(Ultra Thin Profile Fine Pitch Ball Grid Array),而176 则表示该封装具有 176 个引脚。

Pin name:引脚名称。(after reset)可以理解为复位后的主要功能。

Alternate functions:复用功能,包含默认功能(Default)与重映射功能(Remap)。

1.4.3 STM32F407底板

FS-STM32 开发底板是一款功能丰富的开发平台,专为 STM32 系列微控制器设计,适用于多种应用场景。其主要特性如下:

供电方式灵活

  • 支持 5V 电源适配器Type-C 接口 供电,满足不同场景下的电源需求。

RTC 时钟电源

  • 提供独立的 RTC 时钟电源,确保实时时钟在断电情况下仍能正常运行。

姿态感知功能

  • 集成 三轴加速度计角速度传感器,可用于姿态感知和运动检测。

物联网开发支持

  • 板载 ESP-12F 无线模组,支持 Wi-Fi 连接,方便进行物联网云平台项目开发。

用户交互设计

  • 提供 1 路五向按键,支持 中断模式A/D 模式采样,便于用户输入操作。
  • 集成 1 路有源蜂鸣器,可用于声音提示或报警功能。

扩展性强

  • 提供 1 路 2×17 扩展接口,支持接入资源扩展板,方便功能扩展。
  • 核心板接口通过 2.54mm 间距插针 引出全部端口,便于用户外接其他设备或模块。

微信图片_20250319154744

1.4.6 资源扩展板

资源扩展板集成了多种外设模块,为项目案例的开发提供了丰富的硬件支持。其主要功能包括:

传感器模块

  • 温湿度传感器:用于环境温湿度监测。
  • 环境光传感器:支持环境光强度检测。
  • 心率/脉搏传感器:用于心率或脉搏信号的采集与分析。
  • 火焰传感器:支持火焰检测,适用于安防监控场景。

输入/输出设备

  • 人体红外传感器:用于人体接近检测。
  • 光电开关:支持物体检测和位置感应。
  • 数码管显示:用于数字或字符的直观显示。
  • LED 指示灯:提供状态指示功能。
  • 按键:支持用户输入操作。

执行设备

  • 风扇:用于散热或通风控制。
  • 蜂鸣器:提供声音提示或报警功能。
  • 震动马达:支持震动反馈功能。

通信接口

  • 485 总线电平转换:支持 RS-485 通信协议。
  • CAN 总线电平转换:支持 CAN 总线通信,适用于工业控制场景。

image-20250211135340397

1.4.4 显示触摸屏

显示触摸屏(电容屏),在本教程的开发板板中显示触控屏使用 SPI 接口驱动屏幕,下面来简单了解一下显示触控屏的参数:

image-20250211134447867

image-20250211134501321

1.4.5 仿真器

主要功能

代码调试:支持断点设置、单步执行、变量检查和内存查看等功能,帮助开发者深入了解代码的执行过程。

性能分析:提供代码覆盖率分析和性能分析功能,帮助开发者优化代码,提高程序执行效率。

硬件仿真:模拟 STM32 硬件的行为,包括寄存器更新、内存访问等,使开发者能够在不依赖实际硬件的情况下进行测试和调试。

类型与接口

STM32 仿真器有多种类型,包括基于 JTAG 和 SWD 接口的调试器。JTAG 接口使用四线连接(时钟线、数据输入线、数据输出线和复位线),而 SWD 接口则使用两线连接(时钟线和数据线)。本教程使用的 SWD 接口的仿真器。

应用与优势

STM32 仿真器在嵌入式系统开发中发挥着重要作用。仿真器提供的强大调试功能还可以帮助开发者快速识别和解决问题,提高开发效率。

image-20250211134554642

第二章 硬件基础

本章仅为对硬件知识做一个简单且基础的介绍,仅为了STM32软件工程师所准备的课程内容,在后面学习软件的过程中会用到以下的硬件基础知识。

此外,如果这一章节有内容没有看懂,读者也是不用着急,在后续编程开发的过程中也还是会继续对这些硬件知识进行进一步的剖析。

2.1 最小系统基础

2.1.1 电源电路设计

image-20250208110449375

2.1.2 复位、启动、晶振电路设计

复位、启动、晶振电路设计

2.1.3 调试、下载、USB电路设计

最小系统_调试、下载、USB电路设计

2.2 常用硬件工具

2.2.1 焊接

电烙铁

焊接技巧_电烙铁

焊锡丝

焊接技巧_焊锡丝

吸锡带/吸锡器

焊接技巧_吸锡带

助焊剂

image-20250208111320903

斜口钳

焊接技巧_斜口钳

镊子

焊接技巧_镊子

清洁海绵

焊接技巧_清洁海绵

2.2.2 万用表

2.2.3 示波器

2.2.4 逻辑分析仪

第三章 编程基础

3.1 位操作

1、基本运算符

按位与(&:两个操作数对应位都为 1 时,结果为 1。

按位或(|:两个操作数对应位中有 1 时,结果为 1。

按位异或(^:两个操作数对应位不同时,结果为 1,相同则为 0。

按位非(~:对操作数的每一位取反,0 变 1,1 变 0。

左移(<<:将操作数的位向左移动指定的位数,低位补 0。

右移(>>:将操作数的位向右移动指定的位数,低位丢弃,高位填补。

2、操作示例

对于STM32来说,我们进行位操作主要是进行以下几种

设置位

清除位

翻转位

检测位

示例程序如下

#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 初始值,GPIO寄存器的值为 9494
    unsigned int GPIO = 9494;
    
    // 高位 0000 0000 0000 0000 0010 0101 0001 0110  低位 

    // 设置第4位为1
    GPIO |= 0x01 << 3;  // 设置第3位为1(从0开始数)
    // 结果  = 9502
    printf("设置第4位为1后的GPIO值: %u\n", GPIO);

    // 清除第3位为0
    GPIO &= ~(0x01 << 2);  // 清除第2位(从0开始数)
    // 结果 = 9502(保持不变,因为第2位已经是0)
    printf("清除第3位后的GPIO值: %u\n", GPIO);

    // 翻转第5位
    GPIO ^= 0x01 << 4;  // 翻转第4位
    // 结果 = 9486
    printf("翻转第5位后的GPIO值: %u\n", GPIO);

    // 检测第6位
    if (GPIO & (0x01 << 5)) {
        printf("第6位是1\n");
    } else {
        printf("第6位是0\n");
    }

    return 0;
}

3.2 宏定义

#include <stdio.h>

// 宏定义:使用 #define 定义常量和简单代码片段
#define PI 3.14159          // 定义圆周率常量
#define SQUARE(x) ((x) * (x)) // 定义计算平方的宏

int main() {
    double radius = 5.0;
    double area = PI * SQUARE(radius); // 使用宏计算圆的面积
    printf("圆的面积: %.2f\n", area);  // 打印结果
    return 0;
}

3.3 条件编译

#include <stdio.h>

// 条件编译:根据条件选择编译不同的代码段
#define DEBUG 1 // 定义 DEBUG 宏

int main() {
    #ifdef DEBUG
        printf("调试模式已开启。\n"); // 如果 DEBUG 被定义,则编译此段代码
    #else
        printf("调试模式已关闭。\n"); // 否则编译此段代码
    #endif

    return 0;
}

3.4 变量别名

#include <stdio.h>

// 变量别名:使用 typedef 为现有类型创建新名称
typedef unsigned int u8; // 为 unsigned int 类型创建别名“u8”

int main() {
    u8 val = 42; // 使用别名声明变量
    printf("val 的值是: %d\n", val); // 打印变量的值
    return 0;
}

3.5 结构体

#include <stdio.h>

// 定义一个结构体表示点
struct Point {
    int x;
    int y;
};

int main() {
    struct Point p1 = {5, 10}; // 初始化结构体
    printf("Point p1: (%d, %d)\n", p1.x, p1.y); // 访问结构体成员
    return 0;
}

3.6 全局变量申明

文件 1: main.c

#include <stdio.h>

// 声明全局变量(告诉编译器这个变量在其他地方定义)
extern int global_var;

// 声明函数(函数在其他文件中定义)
void print_global_var();

int main() {
    printf("在 main.c 中访问全局变量: %d\n", global_var); // 访问全局变量
    print_global_var(); // 调用函数打印全局变量的值
    return 0;
}

文件 2: globals.c

#include <stdio.h>

// 定义全局变量(分配内存空间)
int global_var = 100;

// 定义函数
void print_global_var() {
    printf("在 globals.c 中访问全局变量: %d\n", global_var); // 打印全局变量的值
}

第四章 环境搭建

搭建开发平台是嵌入式软件开发的重要一步,它提供了必要的工具、环境和资源,为开发人员提供便利,提高开发效率和质量。

注意:安装时 路径选择和用户选择 最好是英文

4.1 软件安装

4.1 安装MDK

1、 软件获取

方法一: 官方下载: https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD

方法二: 用小谭老师的资料包

2、安装过程

  1. 双击打开MDK514软件安装包
image-20231127095919502
  1. 点击下一步进行安装
image-20231127100005034
  1. 点击同意,并进行下一步
image-20231127100058974
  1. 选择你的安装路径,建议:不要装在C盘,选择完成后,继续下一步安装

Coer : 是软件存放位置

Pack : 是芯片包存放位置

image-20231127100139447
  1. keil要求你填写公司信息,这个可以随便填写
image-20231127100303083
  1. 等待安装完成。。。。。。。

3、软件破解

破解不讲解,大家自己百度,一下,不破解已经够学习使用了。

当我们安装完成keil软件之后,我们需要对keil进行破解

  1. 在资料包中找到资料破解包,并以<以管理员身份运行> [注:需要将电脑声音关闭]

如果你打开资料包,发现没有这个KEIL的破解文件,那是因为你的杀毒软件是开启的,需要关闭杀毒软件,然后重新解压一次

image-20231127102836144
  1. 还需要使用以管理员身份运行重新打开KEIL_MDK软件 ,

image-20231127103115543

  1. 打开keil中的注册 ,从菜单栏中 点击<文件> , 然后点击注册

image-20231127103423742

  1. 依据下图进行安装

image-20231127103815628

然后你就完成了keil 注册

4.2 VScode 安装

自己百度,略。。。。

4.3 安装芯片支持包

下载网址 http://www.keil.com/dd2/pack

一般来说,不需要追求最新的版本。因为官方更新库函数版一个月一次频率。

image-20250205155100029

库函数是芯片支持包,不同的芯片对应不同的库函数,例如Keil.STM32F4xx_DFP.1.0.8.pack,专门对应STM32F4系列的芯片。

image-20250205155138645

选择你要安装的芯片支持包,双击安装即可

4.2 驱动安装

4.2.2 USB转串口驱动安装

4.2.3 驱动验证

设备接上电脑,打开设备管理器,如何可以看到驱动则代表已经安装完成

4.3 MDK 使用

4.3.1 MDK 介绍

4.3.2 MDK配置

1、配置编码格式

QQ_1738744713842

2、配置自动补全

QQ_1738757783500

Strut/Class Members:用于开启结构体/类成员提示功能。

Function Parameters:用于开启函数参数提示功能。

Symbols after xx characters:用于开启代码提示功能,即在输入多少个字符以后,提示匹配的内容。

Dynamic Syntax Checking:则用于开启动态语法检测,比如编写的代码存在语法错误的时候,出现相应的图标。

3、配置文本美化

配置缩进

QQ_1738757862431

修改每个元素风格

QQ_1738757978866

此外,还可以去下载别人的风格,可以去CSDN上面搜索 keil风格美化模板 或者 MDK风格美化

4.4 程序下载

4.4.1 接线

先确定开发板是否已经连接电脑 如下图

微信图片_20250319151329(1)

4.4.2 配置

点击魔法棒开始配置

image-20250319152002643

进入 STLink 配置界面

image-20250319151905656

点击上方的 Flash Download

image-20250319152932603

但是此时 我们发现 在 下面这个白色框框中并没有东西,在这个里面我们是需要增加一个Flash 大小的,所以我们需要去为他增加一个flash 包。

QQ_1738760880171

先点击编译,然后点击下载

QQ_1738761115684

4.5 程序调试

4.6 MDK 配置 VS code

4.6.1 插件安装

1、安装如下插件

keil 插件

QQ_1738761481130

C语言插件

QQ_1738761534810

QQ_1738761890509

2、配置插件

点击配置

QQ_1738761732298

配置路径,注意 是UV4的路径

上面的是C51单片机的 下面是 STM32单片机的

QQ_1738761765259

4.6.2 启动工程

启动工程

QQ_1738762350466

打开成功后

QQ_1738762743217

注意事项

出现这个提示需要点击 OK

image-20250205213508827

但是会出现一个 USER 工程 你的编写是在 KEIL 下的文件 而不是 USER下的文件

QQ_1738762822334