1+1=10

记记笔记,放松一下...

Keil MDK 社区版小记

接前面ARM开发环境小记,了解一下Keil MDK的社区版(社区版本不能用于商业用途)。

目标:看到一个例子代码,能大致知道是什么环境构建的,用了什么库

Keil

Keil ,取自其创始人的名字,德国人,发音 /kɑɪl/ - 其中 "kɑɪ" 发音类似于英语单词 "kite"。似乎在国内 /keɪl/或/ki:l/ 也能接受?

Keil 有4套东西

  • Keil MDK:Keil for ARM,Keil MDK-ARM,用于ARM微处理器
  • Keil PK51:Keil C51, 用于 8051微处理器
  • Keil PK166:Keil C166,用于 XC16x, C16x, ST10微处理器
  • Keil DK251:Keil C251,用于 C251微处理器

我们只关心 Keil MDK。Keil MDK 又有三种授权

  • Community:免费,非商业用途
  • Essential:
  • Professional

我们只关心Keil MDK社区版

keil MDK 编译器

  • ARM Compiler 5:armcc
  • ARM Compiler 6:armclang
日期 Keil MDK 版本 默认编译器 备注
2016年5月 5.22 ARM Compiler 5 首次引入 ARM Compiler 6,但非默认
2017年6月 5.24 ARM Compiler 5 强烈推荐迁移到 ARM Compiler 6
2018年 5.25 ARM Compiler 6 ARM Compiler 6 成为默认编译器
2022年 5.34 ARM Compiler 6 不再包含 ARM Compiler 5,需要手动配置

Keil MDK社区版

安装

  • 安装包没有体现Comminity或lite字样,直接安装即可

查看About对话框,可以看到 MDK-Lite字样:

keil-mdk-community-about

另外,通过 File->License Managerment也可以看到 MDK-Lite字样。

使用

以STM32为例

创建项目

Project->New uVision projects...

选择一个项目路径,会弹出设备选择框

选择设备

选择匹配的设备

keil-mdk-select-device

管理运行时环境

“Manage Run-Time Environment”(管理运行时环境)是一个重要的工具,用于配置和管理项目所需的各种软件组件和中间件。

组件通常由 Keil 和第三方提供,并且经过测试和验证,可以无缝集成到项目中。

一般要选中 CMSIS-Core

keil-mdk-manager-run-time

CMSIS,全称为 Cortex Microcontroller Software Interface Standard,是由 ARM(现为 Arm Holdings)开发的一套标准化软件接口,用于简化 ARM Cortex-M 处理器系列的嵌入式应用开发。CMSIS 提供了一组一致的、硬件抽象层(HAL)接口和库,旨在提高代码的可移植性和可重用性,同时减少开发时间。

对于CMSIS,有多个组成部分:

组成部分 描述
CMSIS-Core 提供对 Cortex-M 处理器内核的访问,包括内核寄存器、NVIC、系统时钟设置等。
CMSIS-DSP 包含一组数字信号处理(DSP)库,支持常用的 DSP 算法,如 FFT、滤波、矩阵运算等。
CMSIS-RTOS 定义一个统一的 RTOS API 接口,允许开发者使用不同的 RTOS 实现而无需更改应用代码。
CMSIS-Driver 定义一组标准化的外设驱动接口,如 I2C、SPI、UART、USB 等,帮助在不同硬件平台间移植代码。
CMSIS-Pack 定义软件包的格式和内容,包括设备描述、启动代码、驱动程序、示例应用等。
CMSIS-NN 提供一组神经网络加速库,专为 Cortex-M 处理器优化,支持机器学习和神经网络推理。

项目文件

生成的项目文件主要

  • t1.uvprojx:Keil μVision 项目的主配置文件,包含项目的整体配置和结构信息。
  • t1.uvoptx: Keil μVision 项目的选项文件,主要用于保存 IDE 相关的用户设置和首选项。【不要作为源码提交!】

引脚和时钟

需要在代码中配置寄存器。不同的库有不同的写法。

对于ST家族的STM32,使用 Keil µVision 创建新项目并选择微控制器型号。

使用 STM32CubeMX 生成初始化代码:配置引脚和外设,生成 Keil 项目。

??? 既然这样,我为什么不直接STM32CubeIDE....

STM32库?

对于STM32,除了ARM主导的 CMSIS,还有ST主导的HAL与LL、SPL等可以用...

我们可以使用STM32CubeMX或者STM32CubeIDE生成 hal文件,放置到keil下使用!!

HAL (Hardware Abstraction Layer)

HAL 是“硬件抽象层”的英文缩写,通常由微控制器制造商提供,用于简化直接通过寄存器访问硬件资源的复杂性。HAL 为应用程序和硬件设备之间提供了一个抽象的接口,使得应用程序可以不依赖于底层硬件的具体实现。

LL (Low Layer)

LL 是“低层”(Low Layer)的简称,也是由微控制器制造商提供的库,它提供了比 HAL 更接近硬件的抽象层。LL 库允许更精细的硬件控制,并且通常比 HAL 更为高效,但使用起来比 HAL 更复杂。

SPL (Standard Peripheral Library)

ST 标准外设库(Standard Peripheral Library),通常简称为 SPL,是由 STMicroelectronics 提供的一套用于 STM32 微控制器的硬件抽象层(HAL)库。它为用户提供了一组函数,用于配置和控制 STM32 微控制器的各种外设,如 GPIO、USART、SPI、I2C、ADC 等。

尽管STM32Cube HAL 库是 ST 推出的新一代库,SPL 仍然在一些老旧项目和特定需求中被广泛使用!

如何区分?

看到一个代码,如何区分其用的是哪一个库...

通过头文件引用

  • CMSIS:包含stm32f4xx.h或类似文件。还可能有core_cm4.h  、system_stm32f4xx.h等文件
  • SPL:包含stm32f4xx_rcc.hstm32f4xx_gpio.h等具体的外设头文件
  • HAL:包含stm32f4xx_hal.h以及可能的具体外设头文件stm32f4xx_hal_gpio.h

函数调用

不同的库提供不同的API函数

  • CMSIS 直接操作寄存器,比如
1
2
RCC->CR |= RCC_CR_HSEON;
GPIOA->MODER |= GPIO_MODER_MODER5_0;
  • SPL:使用SPL提供的函数,比如
1
2
3
4
5
RCC_HSEConfig(RCC_HSE_ON);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  • HAL:使用HAL提供的函数
1
2
3
4
HAL_Init();
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

初始化与配置结构体

  • CMSIS:通常不使用结构体,直接操作寄存器
  • SPI:使用具体外设的初始化结构体
1
GPIO_InitTypeDef GPIO_InitStructure;
  • HAL:使用HAL定义的结构体
1
2
GPIO_InitTypeDef GPIO_InitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

STM32CubeIDE

先空着,后面需要了解这个东西看看

是否可以同一个项目,同时支持keil mdk 和 cubeIDE ??

参考目录结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
MyProject/
├── Docs/                 // 项目文档
│   ├── design.md
│   ├── user_manual.md
├── Inc/                  // 头文件
│   └── main.h
├── Src/                  // 源文件
│   └── main.c
├── Test/                 // 测试代码
│   └── test_main.c
├── Drivers/              // 驱动文件
│   ├── CMSIS/
│   ├── HAL/
│   └── BSP/
├── Build/                // 构建脚本
│   └── Makefile
├── Keil/                 // Keil 相关文件
│   └── MyProject.uvprojx
├── STM32CubeIDE/         // STM32CubeIDE 相关文件
│   └── .project
└── .gitignore            // Git 忽略文件

其中,.gitignore示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 忽略编译生成的文件
*.o
*.d
*.elf
*.map
*.bin
*.hex
*.out

# 忽略编辑器和IDE产生的临时文件
*.suo
*.user
*.userprefs
*.args
*.sublime*
*.workspace
*.vscode/
*.idea/
*.project
*.cproject
*.settings/

# 忽略Keil特有文件
*.uvprojx.bak
*.uvoptx
*.crash

# 忽略STM32CubeIDE特有文件
Debug/
Release/

# 忽略操作系统生成的文件
.DS_Store
Thumbs.db

# 忽略使用 Git 版本控制时常见的日志和数据文件
*.log
*.csv
*.dat
*.tmp

# 忽略特定的个人或敏感文件
/config.ini
/secret_config.yaml

# 如果有自动生成的文档,也可以选择忽略
/doc_gen/

# 忽略构建脚本生成的文件夹
/build/

Visual Studio Code

Keil 有用于 VSCode的扩展

EE ARM