STM32之C语言基础复习
目录
一、宏定义
二、条件编译
三、extern声明
1、类型别名应用
五、结构体
1、应用举例(ST源码,使用类型别名)
六、指针
1、指针使用的二大最常见问题
七、位操作
1、如何给寄存器某个位赋值
一、宏定义
宏定义可以:提高效率、可读性、易改性、核心是替换
1、不带参数的宏定义
#define 标识符 字符串标识符:宏定义的名字 (建议大写)
字符串:常数、表达式、格式串等宏定义是一个临时的符号,是不占用内存的,属于预处理程序中代码
例如:#define PI 3.14159
2、带参数的宏定义
#define LED1(X) do{ x?\\A:\\B;\\
}while(0)
建议使用do{.....}while(0)来构造宏定义,这样不会受到大括号、分号、运算符优先级等的影响
二、条件编译
让编译器只对满足条件的代码进行编译,不满足条件的不参与编译
举例:头文件的条件编译结构
#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/sys/sys.h"
code
#endif
三、extern声明
放在函数/变量前,表示此函数/变量在其他文件定义,以便本文件引用
extern uint16_t g_usart_rx_sta;
extern void delay_us(uint32_t nus);g_usart_rx_sta:一个全局变量
delay_us: 一个函数
extern的作用是:告诉编译器,在这个文件中,我要调用这个变量/函数,你需要去其他的文件中找到这个变量/函数
四、类型别名(typedef)
为现有数据类型创建一个新的名字,或称为类型别名,用来简化变量的定义
typedef 现有类型 新名字
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
1、类型别名应用
(1)定义一个结构体
Struct GPIO_TypeDef //定义一个结构体的类型
{_IO uint32_t CRL;_IO uint32_t CRH;...
};Struct GPIO_TypeDef gpiox //定义一个结构体的变量名
(2)用类型别名定义一个结构体
typedef struct //定义一个结构体的类型
{_IO uint32_t CRL;_IO uint32_t CRH;...
}GPIO_TypeDef;GPIO_TypeDef gpiox //定义一个结构体的变量名
五、结构体
由若干基本数据类型集合组成的一种自定义数据类型,也叫聚合类型
struct 结构体名
{成员列表;
}变量名列表(可选);
struct student
{char *name; //姓名int num; //学号int age; //年龄char group; //所在的学习小组float score; //成绩
}stu1,stu2;stu1.name = "张三";
stu1.num = 1;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 80.9;
1、应用举例(ST源码,使用类型别名)
typedef struct
{uint32_t Pin; //引脚号uint32_t Mode; //工作模式uint32_t Pull; //上下拉uint32_t Speed; //IO速度
}GPIO_InitTypeDef; //类型别名
六、指针
指针就是内存的地址
指针变量是保存了指针的变量
类型名 * 指针变量名
char *p_str = "This is a test!"; ----->指向字符串的首地址,也就是"T"*p_str: 取p_str变量的值 ----->结果应为"T"&p_str: 取p_str变量的地址 ----->应是p_str变量自身的地址
举例说明:左侧各数值均得多少
结果:
*p_buf = 1
p_buf[0] = 1
p_buf[1] = 3
*p_buf++ 指的是递增
*p_buf = 3
p_buf[0] = 3
1、指针使用的二大最常见问题
(1)未分配(申请)内存就用
(2)越界使用