传统的51单片机中,对位bit操作和IO位操作是很简单的,但ARM芯片(比如:STM32)那样操作就比较麻烦,采用如下的软件编程技巧,就可以达到类似的效果!
1 typedef struct _16_Bits_Struct
2 {
3 u16 bit0 : 1;
4 u16 bit1 : 1;
5 u16 bit2 : 1;
6 u16 bit3 : 1;
7 u16 bit4 : 1;
8 u16 bit5 : 1;
9 u16 bit6 : 1;
10 u16 bit7 : 1;
11 u16 bit8 : 1;
12 u16 bit9 : 1;
13 u16 bit10 : 1;
14 u16 bit11 : 1;
15 u16 bit12 : 1;
16 u16 bit13 : 1;
17 u16 bit14 : 1;
18 u16 bit15 : 1;
19 } Bits_16_TypeDef;
20 #define LED_GPIO_CLK RCC_AHBPeriph_GPIOA
21 #define LED_PORT GPIOA
22 #define LED_PIN GPIO_Pin_4
23 //使用结构体的位段操作, 兼容Cortex-M3的位带操作.
24 #define LED_PORT_OUT ((Bits_16_TypeDef *)(&(LED_PORT->ODR)))
25 #define LED (LED_PORT_OUT->bit4)
备注说明:
24行就比较关键了:先取出GPIOA->ODR的地址,然后再将它强制转化为Bits_16_TypeDef * 类型(注意,是指针类型)。转化为
此类型后,ODR就有位域的特性了,因此就可以对它进行位操作。25行就是将接在PA.4的LED定义为GPIOA->ODR的第4位。
有了这样的操作后,想要我们的LED亮灭,就很容易了,代码如下:
LED = 0; //LED亮
LED = 1; //LED灭
搞定~