stdint.h是从C99引进的一个标准C库的文件。
需要重点掌握的定义类型别名如下
/* exact-width signed integer types */
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed __INT64 int64_t;
/* exact-width unsigned integer types */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __INT64 uint64_t;
同时需要在MDK中进行配置,在Options for Target选项卡中的C/C++中勾选C99 Mode
右移时,如果是无符号型直接补零,有符号型根据原有符号补位,正数补0负数补1
假如给uint32_t temp = 0 寄存器的位6赋值为1,有以下几种方式。
uint32_t temp = 0
/*方法一*/
temp &= 0xFFFFFFBF;
temp |= 0x00000040;
/*方法二*/
temp &= ~(1<<6);
temp |= 1<<6;
/*方法三*/
temp ^= 1<<6;
可以提高代码效率、可读性、易改性
#define 标识符 字符串
/*无参宏定义*/
#define PI 3.1415926
#define HSV_VALUE 8000000U
/*有参宏定义*/
#define LED1(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)
标识符:宏定义的名字 ,一般全部大写
字符串:常数、表达式、格式串等
一般用do while语句定义宏定义避免大括号、分号、运算优先级等的影响。
编译器只对满足条件的代码进行编译,不满足条件则不编译
#if 常量/常量表达式 /*编译预处理条件指令,类似if*/
#ifdef 宏名 /*判断某个宏是否已被定义*/
#ifndef 宏名 /*判断某个宏是否未被定义*/
#elif 常量/常量表达式 /*若前面的条件不满足,则判断新的条件,类似else*/
#else /*若前面的条件不满足,则执行后面的语句,类似else*/
#endif /*#if,#ifdef,#ifndef的结束标志*/
例如头文件中的条件编译,避免头文件重复引用,减少编译时间。
#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/SYS/SYS.h"
code
#endif
放在函数/变量前,表示此函数/变量在其他文件定义,以便本文件引用。
extern uint16_t g_usart_rx_sta; /*声明变量*/
extern void delay_us(uint32_t nus); /*声明函数*/
为现有数据类型创建一个新的名字,用来简化变量定义
typedef 现有类型 新名字
---------------------------
type unsigned char uint8_t;
/*类型别名的应用*/
Struct GPIO_TypeDef
{
__IO uint32_t CRL;
__IO uint32_t CRH;
...
};
Struct GPIO_TypeDef gpiox
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
...
} GPIO_TpyeDef;
GPIO_TypeDef gpiox
由若干基本数据类型集合组成一种自定义数据类型,也叫聚合类型
struct 结构体名
{
成员列表;
} 变量名列表(可选);
------------------------
struct student
{
char *name; /*姓名*/
int num; /*学号*/
int age; /*年龄*/
char group; /*所在小组*/
float score; /*成绩*/
}stu1,stu2;
指针就是内存的地址
指针变量是保存了指针的变量
类型名 *指针变量名
char *p_str = "This is a test!";
/* *p_str: 取指针变量p_str变量的值 */
/* &p_str: 取p_str变量的地址 */
-------------------------------
uint_t buf[5]={1,3,5,7,9};
uint_8 *p_buf = buf;
/**
* *p_buf = 1
* p_buf[0] = 1
* p_buf[1] = 3
* p_buf++;*p_buf = 3;p_buf[0] = 3;
**/
指针使用2大常见问题: