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)来构造宏定义,这样不会受到大括号、分号、运算符优先级等的影响

二、条件编译

让编译器只对满足条件的代码进行编译,不满足条件的不参与编译

STM32之C语言基础复习_第1张图片

 举例:头文件的条件编译结构

#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变量自身的地址

举例说明:左侧各数值均得多少

STM32之C语言基础复习_第2张图片

 结果:

*p_buf     = 1

p_buf[0]  = 1

p_buf[1]  = 3

*p_buf++  指的是递增

*p_buf    = 3

p_buf[0] = 3

1、指针使用的二大最常见问题

(1)未分配(申请)内存就用

STM32之C语言基础复习_第3张图片

(2)越界使用

STM32之C语言基础复习_第4张图片

七、位操作 

STM32之C语言基础复习_第5张图片

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

STM32之C语言基础复习_第6张图片

你可能感兴趣的:(c语言,开发语言)