> 文章列表 > STM32之C语言基础复习

STM32之C语言基础复习

STM32之C语言基础复习

目录

一、宏定义

二、条件编译

三、extern声明

四、类型别名(typedef)

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)越界使用

七、位操作 

 1、如何给寄存器某个位赋值