Cortext -M3读书笔记(1) -- 输入、输出和外设访问

Cortex-M3和M4系列的处理器除了一些常用的外设GPIO、SPI、IIC、UART之外还有一些高级的外设,如ADC、USB、CAN、SD等。所有的外设使用要依据不同厂家定义的功能使用。关于外设初始化一般有如下流程:

(1)初始化外设时钟

设置时钟控制回路使能连接到外设和对应引脚的时钟。对外设时钟的精准控制(使能/失能)可以有效的控制设备的功耗,许多外设的时钟一般默认是关闭的,使用时需要打开相应的时钟才能使用。

(2)引脚设置

想要使用一个外设首先要配置好他的引脚,如引脚的用途(输入输出等功能),以及引脚的电气特性(电压、上下拉、开漏、高阻等),如果有需要还需要对引脚的复用进行配置。

(3)外设配置

大多数外设需要对外设的寄存器进行配置后才能使用,这些配置可以通过官方提供的库函数来完成。

(4)中断配置

如果外设需要中断,那么就要到处理器的中断控制器(NVIC)配置中断优先级,然后使能中断。

关于寄存器访问的一些方法

官方库函数大多对外设存储寄存器进行了存储器映射,因此可以通过指针来访问这些寄存器。那么什么是存储器映射呢?由于芯片厂家在设计的时候就将一些寄存器挂在了某段地址上,所以通过访问这些地址就可以访问到对应的寄存器。存储器映射就是通过访问某个地址的指针来访问某个寄存器。例如如果有一组GPIO的寄存器可以这么定义:

#define GPIOA_CRL (* ((volatile unsinged long *) (0x40010800))) /* GPIOA 控制寄存器 */
#define GPIOA_DR (* ((volatile unsinged long *) (0x40010804))) /* GPIOA 数据寄存器 */

/*通过下面的方法可以实现对相关GPIO的配置,但是如果寄存器数量太多那么就不能使用上面的方法进行对寄存器的访问了*/
void GPIOA_reset(void)
{
	GPIOA_CRL = 0x00000001;
	GPIOA_DR  = 0x00000001;
}

/*如果寄存器数量太多可以通过下面的方式来对寄存器进行映射*/
typedef struct
{
		__IO unsinged long CRL;
		__IO unsinged long DR;
}GPIOType;

#define PRIPH_BASE 0x40000000
#define APB2PRIPH_BASE (PRIPH_BASE + 0x10000)
#define GPIOA_BASE  (APB2PRIPH_BASE + 0x0800)
#define GPIOB_BASE  (APB2PRIPH_BASE + 0x0C00)
...

#define GPIOA  ((GPIOType * ) GPIOA_BASE)
#define GPIOB  ((GPIOType * ) GPIOB_BASE)
...

/*通过访问结构体的方式来访问寄存器可以使代码更加的简洁*/
void GPIOA_reset(GPIOType *GPIOx )
{
	GPIOx -> CRL = 0x00000001;
	GPIOx -> DR  = 0x00000001;
}

/*其中"__IO"在CMSIS中定义*/

#define  __I volatile const  /*定义为只读*/
#define  __O volatile  /*定义为只写*/
#define  __IO volatile  /*定义为可读可写*/ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值