【正点原子】STM32开发必备C语言基础知识
STM32开发必备C语言基础知识一、核心知识点详解1.寄存器位赋值方法需求给寄存器的位6赋值为1以uint32_t temp 0为例方法一直接十六进制操作temp0xFFFFFFBF;// 清空位6temp|0x00000040;// 置1位6方法二位运算通用操作推荐temp~(16);// 清空位6temp|16;// 置1位6位翻转temp ^ 16;位60变1、1变02. 宏定义1基本格式#define标识符 字符串示例#definePI3.14159#defineHSE_VALUE8000000U2带参数的宏定义格式结合do{…}while(0)构造避免受大括号、分号、运算符优先级影响示例#defineLED1(x)do{x?\HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_GPIO_PIN,GPIO_PIN_SET):\HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_GPIO_PIN,GPIO_PIN_RESET);\}while(0)3. 条件编译1常用指令及作用指令作用#if编译预处理条件指令类似普通if#ifdef判断某个宏是否已被定义#ifndef判断某个宏是否未被定义#elif前面条件不满足时判定新条件类似else if#else前面条件都不满足时执行后续代码类似else#endif结束#if、#ifdef、#ifndef块2核心功能让编译器仅对满足条件的代码进行编译不满足的代码不参与编译3常见应用头文件防重复包含#ifndef_LED_H#define_LED_H#include./SYSTEM/sys/sys.h// 代码内容#endif功能模块条件编译#ifSYS_SUPPORT_OS// 操作系统相关代码#endif4. extern声明1作用放在函数/变量前表示该函数/变量在其他文件中定义供当前文件引用实现跨文件的变量/函数调用2示例externuint16_tg_usart_rx_sta;// 引用其他文件的全局变量externvoiddelay_us(uint32_tnus);// 引用其他文件的函数5. 类型别名(typedef)1核心作用为现有数据类型创建新名字简化变量定义提升代码可读性和可移植性2基本格式typedef现有类型 新名字3基础示例typedefunsignedcharuint8_t;typedefunsignedshortintuint16_t;typedefunsignedintuint32_t;4结构体结合typedefSTM32开发常用未用typedef定义结构体变量需加structstructGPIO_TypeDef{__IOuint32_tCRL;__IOuint32_tCRH;// 其他成员};structGPIO_TypeDefgpiox;使用typedef直接用新名字定义变量typedefstruct{__IOuint32_tCRL;__IOuint32_tCRH;// 其他成员}GPIO_TypeDef;GPIO_TypeDef gpiox;6. 结构体1定义由若干基本数据类型集合组成的自定义聚合数据类型用于描述复杂对象的属性2基本格式struct结构体名{成员列表;// 不同数据类型的成员}变量名列表(可选)3基础示例// 定义同时声明变量stu1、stu2structstudent{char*name;/* 姓名 */intnum;/* 学号 */intage;/* 年龄 */chargroup;/* 学习小组 */floatscore;/* 成绩 */}stu1,stu2;// 先定义后声明变量stu3、stu4structstudentstu3,stu4;// 结构体成员赋值stu3.name张三;stu3.num1;stu3.age18;stu3.groupA;stu3.score80.9;4STM32源码实际应用typedefstruct{uint32_tPin;/* 引脚号 */uint32_tMode;/* 工作模式 */uint32_tPull;/* 上下拉 */uint32_tSpeed;/* IO速度 */}GPIO_InitTypeDef;// 摘自stm32f1xx_hal_gpio.h7. 指针1核心概念指针内存的地址指针变量保存内存地址的变量2定义格式类型名*指针变量名3基础操作*指针变量取指针变量指向的内存地址的值解引用变量名取变量的内存地址取地址示例char*p_strThis is a test!;*p_str;// 取p_str指向地址的值p_str;// 取p_str变量自身的地址4数组与指针STM32开发高频使用uint8_tbuf[5]{1,3,5,7,9};uint8_t*p_bufbuf;// 数组名buf等价于buf[0]指向数组首地址操作结果*p_buf 1数组首元素值p_buf[0] 1等价于*p_bufp_buf[1] 3数组第二个元素p_buf指针后移一位指向buf[1]执行p_buf后*p_buf 3、p_buf[0] 35指针最常见错误用法未分配内存就使用char*p_buf;p_buf[0]100;// 错误p_buf未指向有效内存越界使用uint8_tbuf[5]{1,3,5,7,9};uint8_t*p_bufbuf;p_buf[5]200;// 错误数组下标最大为4超出数组范围