Freescale k60的GPIO的操作 (初始化)

原创 2013年09月18日 21:25:45

上一篇介绍了对于GPIO的寄存器的操作,这篇主要讲讲GPIO的初始化。下面这段是例程中对于GPIO的初始化代码

void init_gpio()
{
  //Set PTA19 and PTE26 (connected to SW1 and SW2) for GPIO functionality, falling IRQ,
  //   and to use internal pull-ups. (pin defaults to input state)
  PORTA_PCR19=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;
  PORTE_PCR26=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;

  //Set PTA10, PTA11, PTA28, and PTA29 (connected to LED's) for GPIO functionality
  PORTA_PCR10=(0|PORT_PCR_MUX(1));
  PORTA_PCR11=(0|PORT_PCR_MUX(1));
  PORTA_PCR28=(0|PORT_PCR_MUX(1));
  PORTA_PCR29=(0|PORT_PCR_MUX(1));

  //Change PTA10, PTA11, PTA28, PTA29 to outputs
  GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(10) | GPIO_PIN(11) | GPIO_PIN(28) | GPIO_PIN(29) ); 
}

分析如下:

(1)  PORTA_PCR19=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;
#define PORTA_PCR19                              PORT_PCR_REG(PORTA_BASE_PTR,19)

#define PORT_PCR_REG(base,index)                 ((base)->PCR[index])

/** PORT - Peripheral register structure */
typedef struct PORT_MemMap {
  uint32_t PCR[32];                                /**< Pin Control Register n, array offset: 0x0, array step: 0x4 */
  uint32_t GPCLR;                                  /**< Global Pin Control Low Register, offset: 0x80 */
  uint32_t GPCHR;                                  /**< Global Pin Control High Register, offset: 0x84 */
  uint8_t RESERVED_0[24];
  uint32_t ISFR;                                   /**< Interrupt Status Flag Register, offset: 0xA0 */
  uint8_t RESERVED_1[28];
  uint32_t DFER;                                   /**< Digital Filter Enable Register, offset: 0xC0 */
  uint32_t DFCR;                                   /**< Digital Filter Clock Register, offset: 0xC4 */
  uint32_t DFWR;                                   /**< Digital Filter Width Register, offset: 0xC8 */
} volatile *PORT_MemMapPtr;

以上内容通过寻址指定到PORTA_PCR19.

等式右侧
PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK

 

(1)PORT_PCR_MUX(1)

#define PORT_PCR_MUX(x)                          (((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK)

#define PORT_PCR_MUX_MASK                        0x700u
#define PORT_PCR_MUX_SHIFT                       8

这部分代码用来进行Port端口的复用功能的选择。以PTA19为例,在数据手册中对其的定义如下:

144

LQFP

144

MAP

BGA

Pin Name Default ALT0 ALT1 ALT2 ALT3 ALT4 ALT5 ALT6 ALT7 EzPort
73 M11 PTA19 XTAL XTAL PTA19   FTM1_FLT0 FTM1_CLKIN1   LPT0_ALT1    

PCR(Port Control Register)寄存器中第8~10位用来对引脚的复用进行选择

Pin10~8        Function

000                Pin  Disabled(analog)

001                Alternative 1

010                Alternative 2

011                Alternative 3

100                Alternative 4

101                Alternative 5

110                Alternative 6

111                Alternative 7 

所以上面的操作过程中将1左移8位,即就是赋值mux(10~8)为001,即就是选择引脚PTA的复用为Alternative 1,即就是当作GPIO使用。

 PORT_PCR_MUX_MASK的含义就是确保mux(10~8)的值不超过111,即不超过7

(2)PORT_PCR_IRQC(0xA)

#define PORT_PCR_IRQC_MASK                       0xF0000u
#define PORT_PCR_IRQC_SHIFT                      16
#define PORT_PCR_IRQC(x)                         (((uint32_t)(((uint32_t)(x))<<PORT_PCR_IRQC_SHIFT))&PORT_PCR_IRQC_MASK)

将0xA,即4‘b1010左移16位,从而将PCR寄存器中的IRQC19~16赋值为:1010.

PCR寄存器中的IRQC19~16位用来进行中断的配置

0000      Interrupt/DMA request disabled.
0001      DMA request on rising edge.
0010      DMA request on falling edge.
0011      DMA request on either edge.
0100     Reserved.
1000     Interrupt when logic zero.
1001     Interrupt on rising edge.
1010     Interrupt on falling edge.
1011     Interrupt on either edge.
1100     Interrupt when logic one.
Others  Reserved

所以上面的配置是在下降沿出发中断。

(3)PORT_PCR_PE_MASK

#define PORT_PCR_PE_MASK                         0x2u
#define PORT_PCR_PE_SHIFT                        1

PCR寄存器中的PE(Pull Enable)位是用来使能内部拉电阻,置1为输入引脚使能内部拉电阻

(4)PORT_PCR_PS_MASK

#define PORT_PCR_PS_MASK                         0x1u
#define PORT_PCR_PS_SHIFT                        0

PCR寄存器中的PS(Pull Select)位是用来选择拉的类型,置1为上拉,置0为下拉

 

K60学习笔记三:GPIO口的底层驱动操作带API接口

GPIO 用于普通I/O口的输入输出 C预备知识: const 修饰只读常量 volatile修饰易变量,表示编译器不能进行优化 GPIO模块的编程步骤: 1.设置P...
  • qq_24085431
  • qq_24085431
  • 2016年03月30日 20:52
  • 1948

K60学习笔记四:按键的多种操作

按键有好几种操作: ADC按键扫描–用的是电阻 GPIO按键扫描: 独立式 矩阵式 循环查询 定时查询 中断响应//初始化KEY对应的管脚 PTXn_e KEY_...
  • qq_24085431
  • qq_24085431
  • 2016年03月31日 19:34
  • 1769

直接使用Jlink仿真器下载程序至Freescale K60系列 MCU

直接使用Jlink仿真器下载程序至Freescale K60系列MCU需进行如下设置:     1、启动J-Flsh;       2、打开数据文件;       3、进行项目设置;...
  • qingwufeiyang12346
  • qingwufeiyang12346
  • 2015年06月03日 21:43
  • 2587

IAR配合j_link调试K60入门

下面就以在IAR环境下调试K60为例开启J-Link之旅: (1)首先是J-Link的硬件接口问题,按照标准的JTAG来就成,实际上需要接的只是那么几根线—TCK,TMS,TDI,TDO,TRST(...
  • lczdk
  • lczdk
  • 2016年12月28日 11:43
  • 2072

K60学习笔记二:PORT中断

1.C预备知识 关于断言: 断言其实就是一个宏定义void assert_failed(char * ,int ); //断言失败执行的函数 #if define(DEBUG) ...
  • qq_24085431
  • qq_24085431
  • 2016年03月29日 20:41
  • 1791

飞思卡尔k60从零开始之PLL

K60 PLL配置过程,经验分享
  • HAHA0_0
  • HAHA0_0
  • 2016年08月11日 15:20
  • 2103

再看K60——寄存器配置

今天心血来潮,重新去看了K60的寄存器和数据手册,配上超核的视频,去网上搜查相关资料,每次看视频的感觉都不同,至少现在看来寄存器的配置的基本步骤都差不多,虽然现在也只是会配简单的寄存器。 现在把今天所...
  • Feng_8071
  • Feng_8071
  • 2016年10月04日 23:02
  • 407

k60-脉冲采集

K60,脉冲采集,嵌入式
  • syoya1997
  • syoya1997
  • 2016年06月16日 14:49
  • 1955

玩转Kinetis之教你将K60主频超到200MHz以上

最近忙碌的状态稍微缓解了些,终于可以甩开膀子干点自己一直想干的事了。说起来,自己还颇有点向往有充足的自由时间的时候,毕竟前段时间积压了好多东西,是该捡起来一件件的把它做了,趁着自己还年轻还有激情,所以...
  • vigour1000
  • vigour1000
  • 2013年07月29日 20:55
  • 1308

Feescale K60开发笔记16: k60 bootloader应用程序的配置

本日志介绍K60 bootlader应用程序的配置方法。     A bootloader is a small piece of software that allows the user t...
  • qingwufeiyang12346
  • qingwufeiyang12346
  • 2017年07月22日 22:55
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Freescale k60的GPIO的操作 (初始化)
举报原因:
原因补充:

(最多只允许输入30个字)