一、封装外设
用C语言代码把外设地址映射用宏定义封装
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + Ox00010000)
.
.
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#defien GPIOB_BAAE (AHB1PERIPH_BASE + 0x0400)
.
.
#define GPIOA_MODER (GPIOA_BASE+0x00)
#define GPIOA_OTYPER (GPIOA_BASE+0x04)
.
.
总结:定义“片上外设”基地址PERIPH_BASE,接着在PERIPH_BASE上加上各个总线的地址偏移,得到总线的相应地址,然后在加上各寄存器的地址偏移就得到特定寄存器的地址。
二、封装寄存器
typedef unsigned int uint32_t;
typedef unsigned short int uint16_t;
typedef struct{
uint32_t MODER;
uint32_t OTYPER;
uint32_t OSPEEDR;
uint32_t PUPDR;
.
.
.
}GPIO_TypeDef;
上面这段代码用typedef关键字声明了名为 GPIO_TypeDef的结构体类型。
使用宏定义定义各个GPIO端口的首地址
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
.
.
GPIOA->BSRRL = 0XFFFF;
GPIOA->MODER = OxFFFFFFF;
总结:用结构体封装一类寄存器,然后强制转换成指针,通过宏定义执行端口基地址,再加上相应的偏移地址就可以直接访问相应的寄存器。
修改寄存器的某一位
在51单片机中通过关键字sbit来实现位定义,但是M4中没有这个关键字。下面先说说C语言如何操作某一位。
1、把变量的某位清零
unsigned char a = 0x9F;
a &= ~(1<<2);
2、把变量的某几个连续位清零
a &= ~(3<<2*1);
这里面涉及到运算符的优先级*的优先级高于<<,所以(3<<2*1)是把3左移3位。
下次在学习M4中的位带操作,因为里面涉及的知识比较多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)