一、进制转换表
二、C语言数据类型
关键字 | 位数 | 表示范围 | stdint关键字 | ST关键字 |
char | 8 | -128 ~ 127 | int8_t | s8 |
unsigned char | 8 | 0 ~ 255 | uint8_t | u8 |
short | 16 | -32768 ~ 32767 | int16_t | s16 |
unsigned short | 16 | 0 ~ 65535 | uint16_t | u16 |
int | 32 | -2147483648 ~ 2147483647 | int32_t | s32 |
unsigned int | 32 | 0 ~ 4294967295 | uint32_t | u32 |
long | 32 | -2147483648 ~ 2147483647 | ||
unsigned long | 32 | 0 ~ 4294967295 | ||
long long | 64 | -(2^64)/2 ~ (2^64)/2-1 | int64_t | |
unsigned long long | 64 | 0 ~ (2^64)-1 | uint64_t | |
float | 32 | -3.4e38 ~ 3.4e38 | ||
double | 64 | -1.7e308 ~ 1.7e308 |
三、位运算符
位运算符用来对二进制位进行操作,C语言中提供了如下所示的位运算符。
位运算符 | 含义 | 运算规则 |
& (and ) | 按位与 | 一假即假 |
| ( or ) | 按位或 | 一真即真 |
^ ( xor ) | 按位异或 | 同假异真 |
~ ( not ) | 按位取反 | |
<< ( shi ) | 左移 | |
>> ( shr ) | 右移 |
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
假设a,b为整型数据,a=15(00000000 00001111)b=80(00000000 01010000)
a&b: 00000000 00000000 a&b=0x0
a|b : 00000000 01011111 a|b=0x5f
a^b : 00000000 01011111 a^b=0x5f
~a : 11111111 11110000 ~a=0xfff0
与或
比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的值为 1,可以先对寄 存器的值进行&清零操作:
GPIOA->CRL &= 0XFFFFFFBF; /* 将第 bit6 清 0 */
然后再与需要设置的值进行|或运算:
GPIOA->CRL |= 0X00000040; /* 设置 bit6 的值为 1,不改变其他位的值 */
左移运算符<<
运算规则:对运算符<<左边的每一位全部左移右边表示的位数,右边空出的位补0。
【例】a<<2表示将a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。
例:char a=0x21;
则a<<2的过程 0010 0001<<2 = 1000 0100;即 a<<2的值为0x84。
左移1位相当于该数乘以2,左移n位相当于该数乘以2n。
乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
右移运算符>>
运算规则:对运算符>>左边的每一位全部右移右边表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:
(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。
(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。
右移1位相当于除以2,同样,右移n位相当于除以2n。
按位取反~
按位取反在单片机中常用于清除某一个 /某几个位。下面是 delay_us 函数的一行代码:
SysTick->CTRL &= ~(1 << 0) ; /* 关闭 SYSTICK */
该代码可以解读为,仅设置 CTRL 寄存器的第 0 位(最低位)为 0,其他位的值保持不变。
按位异或^
该功能非常适合用于控制某个位翻转,常见的应用场景就是控制 LED 闪烁,如:
GPIOB->ODR ^= 1 << 5;
执行一次该代码,就会使 PB5 的输出状态翻转一次,如果我们的 LED 接在 PB5 上,就可 以看到 LED 闪烁了。
四、defne宏定义
define 是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方 便。常见的格式:
#define 标识符 字符串
“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:
#define ABC 12345
引用宏定义:int a = ABC; 等效于int a = 12345;
五、条件编译
单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而 当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:
#ifdef 标识符
程序段 1
#else
程序段 2
#endif
它的作用是:当标识符已经被定义过(一般是用#define 命令定义),则对程序段 1 进行编译, 否则编译程序段 2。 其中#else 部分也可以没有。
文章源自正点原子开发指南,用作个人学习记录,以后会继续补充