STM32的编码还是基于C语言的,所以呢,在学习32的过程中也不能轻视C语言的学习,所以,现在就来在复习一下32中较常用的C语言!
首先,讲一下宏定义
#define,#ifdef,#else,#ifndef,#endif
(1).#define
例:#define a 10
将a定义为10,之后所使用的全部a的值都为10
(2)#ifdef,#else
例:
#define 标识符
#ifdef 标识符
程序段1
#else
程序段2
#endif
意为:如果标识符被先前定义过了则直行程序段1,否则执行程序段2,#endif结束#ifdef.
(3)#ifndef
#ifndef x
#define x
程序段1
#else
程序段2
#endif
意为:先测试x是否被宏定义过,如果x没有被宏定义过,定义x,并编译程序段 1, 如果x已经定义过了则编译程序段2的语句,最后终止if
再讲一下另一个重点,位运算
在STM32中位运算还是十分重要的
先讲几个运算符吧!
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
& | 与 | << | 左移 |
l | 或 | >> | 右移 |
^ | 异或 | ~ | 取反 |
这就是几个常用的运算符了,再下来举几个简单的例子
(1)&,|,~,^
参数 | 参数 | 运算符 | 结果 |
---|---|---|---|
1 | 0 | & | 0 |
0 | 1 | & | 0 |
1 | 1 | & | 1 |
0 | 0 | & | 0 |
— | — | — | — |
1 | 0 | l | 1 |
0 | 1 | l | 1 |
1 | 1 | l | 1 |
0 | 0 | l | 0 |
— | — | — | — |
1 | 0 | ^ | 1 |
0 | 1 | ^ | 1 |
1 | 1 | ^ | 0 |
0 | 0 | ^ | 0 |
— | — | — | — |
1 | — | ~ | 0 |
0 | — | ~ | 1 |
总结一下:
&:有0则0,全1则1。
|:有1则1,全0则0。
^:不同为1,相同为0。
~:0变1,1变0。
(2)<<,>>
参数 | 运算 | 结果 |
---|---|---|
1001 | >>2 | 0010 |
0101 | <<3 | 1000 |
STM32实际例子
GPIOA->CRL &= 0XFFFFFF0F
上述功能是将第4-第7位变为0
这个例子是在原子哥视频里见到的,在刚开始半天看不懂,问了大佬才懂,现在来详细讲一下,0X代表这是16进制,一个F代表的是15,在二进制中1111代表15
所以一个F对应一个1111,也就是说一个F对应四位,看上面的例子,简单点,就看后三位F0F,在二进制中就是1111 0000 1111,对他进行与运算,有0则0;自然第4-7位就被赋为0了(ps最右边的为第0位)
GPIOA->CRL l= 0X00000040
将相应的位数变为4,思路与上面的一致,就不过多讲解了!
ok就先讲这么多了!位运算一定要学好!!!