最近在弄以KL05为核心的集中器开发板的程序,之前一直是单纯的去看通讯协议的实现过程,而没有真正的沉下心来理解一下单片机的运行过程以及配置的方式,这两天结合野火K60的一些资料,对于板子有了和之前不一样的认识。(PS:我的博文只是对自己学习过程的总结、记录,有一些资料是我从书上或其他大神那里看到的,尊重原创作者,并表示感谢^_^)
好了,下面,首先我们看一下这个寄存器PORTx_PCRn,PCR的意思是Pin Control Register,也就是引脚控制寄存器,x代表A、B等,n代表0~31,我们通过改变该寄存器相应位的值来控制该引脚的功能。
从这个图里我们可以看出该引脚功能选择为8~10位,一般我们会将它设定为GPIO功能,可以这样设置:PORTB_PCR5= PORT_PCR_MUX(1); 这里的PORT_PCR_MUX(x)是”MKL05Z4.h”中自带的一个函数,作用是针对于8~10位进行赋值,函数运算的结果是8~10位变为x,其他位全变为0,所以GPIO引脚功能设置一般放在其他设置之前,作为一个初始化操作。
我用到的程序中在设置完引脚功能之后有几个引脚要设定为中断,这是我们就需要用到PORTx_PCRn的19~16位。
如图所示,我要用下降沿的方式来触发中断,则代码为:PORTB_PCR7 |= PORT_PCR_IRQC(0xA); 函数PORT_PCR_IRQC(x)与上面功能相似。
当我们把引脚功能设定为GPIO后,就不得不提GPIO模块内部的6个寄存器,先上个图。
每个 GPIO 口均包含 6 个寄存器,其中 x 表示 A、 B、 C、 D、 E 中的任意一个。各寄存器均为 32 位,复位值均为 0x00000000。在KL05中只有A和B两个口,举一个程序中的例子,比如说我想设置PTB5的数据方向为输出,我可以用 GPIOB_PDDR |= (1<<5);
给大家举一个完整的代码例子:
#define ATXD_CONTROL_PORT_ALT1 PORTA_PCR10 = PORT_PCR_MUX(1)
#define ATXD_CONTROL_PORT_DO GPIOA_PDDR |= (1<<10)
#define ATXD_CONTROL_PORT_L GPIOA_PDOR &= ~(1<<10)
#define ATXD_CONTROL_PORT_H GPIOA_PDOR |= (1<<10)
这是一个数据输出引脚的例子,首先,将PTA10设置为GPIO模式,数据方向为输出(1为输出),若想输出低电平,则将GPIOA_PDOR的第10位置0,若想输出高电平,则将GPIOA_PDOR的第10位置1。
再给大家一个输入引脚的例子:
#define ARXD_CONTROL_PORT_ALT1 PORTA_PCR9 = PORT_PCR_MUX(1)
#define ARXD_CONTROL_PORT_DI GPIOA_PDDR &= ~(1<<9)
#define ARXD_PORT_IN_STATE (GPIOA_PDIR & (1<<9))
这段代码中将PTA9设定为输入,并定义了一个ARXD_PORT_IN_STATE用代表GPIOA_PDIR寄存器中第9位的值,用于RXD引脚上来接收相应电平值。
最后一段代码是中断的代码:
PORTA_PCR11 = PORT_PCR_MUX(0 x1)
PORTA_PCR11 |= PORT_PCR_IRQC(0 xA)
GPIOA_PDDR &= ~(1 <<11 )
#define AINT_PORT_IN_STATE (GPIOA_PDIR & (1 <<11 ))
这段代码就是将PTA11引脚的功能设定为下降沿中断,并读入状态。