建议每个知识点不懂的话,可以查找其他详细资料(大佬们写的真好)
一、位操作
运算符 | 含义 | 运算符 | 含义 |
& | 按位与 | ~ | 取反 |
| | 按位或 | << | 左移 |
^ | 按位异或 | >> | 右移 |
GPIOA->CRL&=0XFFFFFF0F; //将第4-7位清0
GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值
GPIOA->ODR|=1<<5;
TIMx->SR = (uint16_t)~TIM_FLAG;
二、define宏定义关键词
#define 标识符 字符串
“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
例如:
#define SYSCLK_FREQ_72MHz 72000000
定义标识符SYSCLK_FREQ_72MHz的值为72000000。
三、ifdef条件编译
单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
四、extern变量申明
C语言中extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
extern int i; //声明,不是定义
int i; //声明,也是定义
五、typedef类型别名
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
typedef char* PCHAR; // PCHAR等价于char*
PCHAR pa, pb; // pa pb是char*类型;
六、 结构体:构造类型
Struct 结构体名{
成员列表1;
成员变量2;
…
}变量名列表;
在结构体申明的时候可以定义变量,也可以申明之后定义,方法是:
Struct 结构体名字 结构体变量列表 ;
并且只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值;
/这样是可以的,在定义变量的时候就初始化了;
struct book s1={//对结构体初始化
"guojiajiaoyun",//author为字符数组
"yuwen",//title为字符串
22.5
};
/这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了;
struct book s1;
s1={
"guojiajiaoyun",//author为字符数组
"yuwen",//title为字符串
22.5
};//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值;
只能;
s1.title = "yuwen";........//单个赋值;
同一个类型可以用数组,不同类型可以用结构体组织。
七、C语言关键字 :static
八、MDK中寄存器地址名称映射分析
51映射的方法
sfr P0 =0x80;//P0映射到地址0x80
P0=0x00//忘寄存器地址0x80赋值0x00
![](https://i-blog.csdnimg.cn/blog_migrate/bbc8c9f73e4432b3010309e9b2ad6503.png)
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;