初学者学习总结,如有错误,请大神指正
一、位操作
运算符 | 含义 | 作用 | 例示 |
~ | 按位取反 | 1变0、0变1 | ~(0001 1100) 结果为 (1110 0011) |
& | 按位与 | 相应位都为1,结果为1,否则结果为0 | (1001 1001) & (0011 1100) 结果为 (0001 1000) |
| | 按位或 | 相应位有1,结果为1,否则结果为0 | (1001 1001) | (0111 0010) 结果为 (1111 1011) |
^ | 按位异或 | 相应位相同,结果为1,否则结果为0 | (1100 0001) ^ (0101 1011) |
<< | 左移 | 向左移动n位,右边空出位补0 | (1000 0110)<<2 结果为 (0001 1000) |
>> | 右移 | 向右移动n位,左边空出位补0 | (00010000) >>3 结果为 (0000 0010) |
在单片机开发中的技巧
(1)不改变其他位的值的状况下,对某几个位进行设值。
是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。
比如改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作
GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0
然后再与需要设置的值进行|或运算
GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值
二、宏定义
define 是 C 语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供 方便。常见的格式: #define 标识符 字符串 “标识符”为所定义的宏名。
“字符串”可以是常数、表达式、格式串等。
例如:
#define SYSCLK_FREQ_72MHz 72000000
定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000。
三、条件编译
例如
文件为 led.h
#ifndef __LED_H //如果没编译过这个文件
#define __LED_H //编译这个文件
void LED_Init (void);
#endif
//保证在多个.c文件同时引用时不重复,默认所有头文件都添加,保证在多个.C文件同时引用时不重复,默认所有头文件都添加
四、extern 变量申明
C 语言中 extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编 译器遇到此变量和函数时在其他模块中寻找其定义。
这里面要注意,对于 extern 申明变量可以多 次,但定义只有一次。
例如
在 main.c 定义的全局变量 id,id 的初始化都是在 main.c 里面进行的。
main.c 文件中
u8 id;//定义只允许一次
main()
{
id=1;
printf("d%",id);//id=1
test();
printf("d%",id);//id=2
}
若要在text.c中使用变量id 就需要在test.c 里面去申明变量 id 是外部定义,否则变量 id 的作用域到不了 test.c 文件中。
text.c文件中
extern u8 id;//申明变量 id 是在外部定义的,申明可以在很多个文件中进行
void test(void)
{
id=2;
}
五、typedef 类型别名
typedef 用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。
例如
typedef unsigned char u8 //把unsigned char 类型取别名为u8
在 MDK 中常用于定义结构体的类型别名。
例如
通常我们这样定义结构体,MDK 中有很多这样的结构体变量需要定义就显得很繁琐
struct _GPIO
{
__IO uint32_t CRL;
__IO uint32_t CRH;
…
}GPIOA;
struct _GPIO
{
__IO uint32_t CRL;
__IO uint32_t CRH;
…
}GPIOB;
…
在利用typedef 类型别名后,我们可以化简
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
…
} GPIO_TypeDef;
GPIO_TypeDef GPIOA,GPIOB;
六、结构体
声明结构体类型:
Struct 结构体名
{
成员列表;
}变量名列表;
例如
Struct U_TYPE
{
Int BaudRate
Int WordLength;
}usart1,usart2; //申明之后定义变量
Struct U_TYPE usart1,usart2
{
Int BaudRate
Int WordLength;
}; //申明时定义变量
结构体成员变量的引用方法:
结构体变量名字.成员名
例如
usart1.BaudRate; //引用 usart1 的成员 BaudRate
结构体指针变量定义
struct U_TYPE *usart3;//定义结构体指针变量 usart1;
Usart3->BaudRate; //访问 usart3 结构体指针指向的结构体的成员变量 BaudRate
七、static关键字
例如
int a
{
static int =0;//在函数调用完成后,记住变量调用后的函数值
n++;
return n;
}