工程结构
BSP:驱动文件夹,用于存放模块以及外设的驱动程序
CMSIS:STM32平台级文件夹,用于存放STM32工程运行的底层代码。
MDK:工程文件目录,搭建完环境生成的工程文件
STM32H7xx_HAL_Driver:HAL库文件目录
System:系统设置
user:用户层代码
何时需要包含 <stdint.h>
?
-
需要精确控制变量位宽时(如嵌入式开发、协议解析)。
-
编写跨平台代码,避免类型歧义。
-
处理二进制数据或硬件寄存器时(需对齐内存)。
#include "stdlib.h"包含这个文件有什么用
#include "stdlib.h"
是 C 语言中的一个预处理指令,用于包含标准库头文件 stdlib.h
(Standard Library,标准库)。这个头文件提供了许多常用的函数和宏,主要涉及内存管理、随机数生成、字符串转换、程序控制等功能。以下是它的主要用途:
1. 内存管理函数
-
malloc(size_t size)
:动态分配内存。 -
calloc(size_t num, size_t size)
:动态分配并初始化内存为零。 -
realloc(void *ptr, size_t size)
:重新调整已分配的内存块大小。 -
free(void *ptr)
:释放动态分配的内存。
int *arr = (int*)malloc(10 * sizeof(int)); // 分配一个包含 10 个整数的数组
free(arr); // 释放内存
2. 随机数生成
-
rand()
:生成伪随机数。 -
srand(unsigned int seed)
:设置随机数种子(通常用time(NULL)
初始化)。
srand(time(NULL)); // 用当前时间作为随机种子
int num = rand() % 100; // 生成 0~99 的随机数
3. 字符串转换
-
atoi(const char *str)
:将字符串转换为整数。 -
atof(const char *str)
:将字符串转换为浮点数。 -
strtol
,strtoul
等更安全的转换函数。
int num = atoi("123"); // 字符串 "123" → 整数 123
4. 程序控制
-
exit(int status)
:终止程序,并返回状态码(如exit(0)
表示成功)。 -
abort()
:强制终止程序(通常用于异常情况)。 -
system(const char *command)
:执行系统命令(如system("pause")
或system("ls")
)。
if (error_occurred) {
exit(1); // 异常退出
}
uint8_t的本质
uint8_t
不是 unsigned int
,而是:
-
精确的8位无符号整数类型(正好占用1字节)
-
定义在C99标准的
<stdint.h>
头文件中 -
典型实现是
typedef unsigned char uint8_t;
(void*)的意义
类型强制转换
-
&USART1_RXbuff
是一个具体类型的指针(如uint8_t*
或char*
),而HAL_UART_Receive_IT()
的第二个参数需要uint8_t*
类型。 -
(void *)
是一种通用指针类型,可以接受任何指针类型。这里通过强制转换确保类型匹配(即使USART1_RXbuff
的原类型不是uint8_t
)
系统时钟配置
HSE(外部高速振荡)相较于HSI(高速内部振荡),更准,HSI会存在误差,受温度影响存在漂移。
PLL(锁相环):用作时钟倍频,把输入的时钟频率倍频成输出频率
外设功能模式设置
推挽输出模式: 可以控制高低电平的输出模式。