恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)

发布者:SereneHarmony最新更新时间:2021-04-06 来源: eefocus关键字:飞思卡尔  KEA128 手机看文章 扫描二维码
随时随地手机看文章

KEA128芯片有7组IO,PORTA--H每组8个引脚,PORTI有7个引脚,共计71个。


单个引脚驱动能力是2.5mA,内部均可上拉到VDD,无内部下拉。应通过编程将未使用引脚内部上拉。


MCU处在运行、等待、调试模式下,GPIO正常工作,停止模式下,GPIO停止工作。


下面是端口控制寄存器介绍,主要是端口滤波寄存器,上拉使能寄存器和高驱动能力使能寄存器

GPIO有三组寄存器,分别为GPIOA、GPIOB、GPIOC。每组有7个寄存器,分别为输出寄存器(PDOR)、输出置1寄存器(PSOR)、输出清0寄存器(PCOR)、输出取反寄存器(PTOR)、输入寄存器(PDIR)、数据放向寄存器(PDDR)、输入禁止寄存器(PIDR)。


GPIO编程步骤:


1.设定GPIO是输入还是输出,设置数据方向寄存器


2.若是输出则设定GPIO的值,低0高1


3.若是输入则通过输入寄存器获得引脚的状态。低0高1.


//===========================================================================

//文件名称:common.h

//功能概要:公共要素头文件

//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)

//版本更新:2015-06-05  V2.0

//芯片类型:KEA128

//===========================================================================

 

#ifndef __COMMON_H       //防止重复定义(_COMMON_H  开头)

#define __COMMON_H

 

// 1.芯片寄存器映射文件及处理器内核属性文件

#include "core_cmFunc.h"

#include "core_cmInstr.h"

#include "core_cm0plus.h"

#include "SKEAZ1284.h"           // 包含芯片头文件

#include "system_SKEAZ1284.h"    // 包含芯片系统初始化文件

 

#define  SYSTEM_CLK_KHZ   DEFAULT_SYSTEM_CLOCK/1000// 芯片系统时钟频率(KHz)

#define  CORE_CLK_KHZ     SYSTEM_CLK_KHZ           // 芯片内核时钟频率(KHz)

#define  BUS_CLK_KHZ      SYSTEM_CLK_KHZ/2         // 芯片总线时钟频率(KHz)

 

// 2.定义开关总中断

#define ENABLE_INTERRUPTS   __enable_irq   // 开总中断

#define DISABLE_INTERRUPTS  __disable_irq  // 关总中断

 

// 3.位操作宏函数(置位、清位、获得寄存器一位的状态)

#define BSET(bit,Register)  ((Register)|= (1<<(bit)))    // 置寄存器的一位

#define BCLR(bit,Register)  ((Register) &= ~(1<<(bit)))  // 清寄存器的一位

#define BGET(bit,Register)  (((Register) >> (bit)) & 1)  // 获得寄存器一位的状态

 

// 4.重定义基本数据类型(类型别名宏定义)

typedef unsigned char uint_8;   // 无符号8位数,字节

typedef unsigned short int uint_16;  // 无符号16位数,字

typedef unsigned long int uint_32;  // 无符号32位数,长字

typedef char int_8;    // 有符号8位数

typedef short int int_16;   // 有符号16位数

typedef int int_32;   // 有符号32位数

// 不优化类型

typedef volatile uint_8 vuint_8;  // 不优化无符号8位数,字节

typedef volatile uint_16 vuint_16; // 不优化无符号16位数,字

typedef volatile uint_32 vuint_32; // 不优化无符号32位数,长字

typedef volatile int_8 vint_8;   // 不优化有符号8位数

typedef volatile int_16 vint_16;  // 不优化有符号16位数

typedef volatile int_32 vint_32;  // 不优化有符号32位数

 

#endif       //防止重复定义(_COMMON_H结尾)

//===========================================================================

//文件名称:gpio.h

//功能概要:GPIO底层驱动构件头文件

//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)

//版本更新:2015-06-05  V2.0

//芯片类型:KEA128

//===========================================================================

 

#ifndef GPIO_H        //防止重复定义(GPIO_H  开头)

#define GPIO_H

 

#include "common.h"   //包含公共要素头文件

 

// 端口号地址偏移量宏定义

#define PORTA    (0<<8)

#define PORTB    (1<<8)

#define PORTC    (2<<8)

#define PORTD    (3<<8)

#define PORTE    (4<<8)

#define PORTF    (5<<8)

#define PORTG    (6<<8)

#define PORTH    (7<<8)

#define PORTI    (8<<8)

//引脚方向宏定义

#define GPIO_IN      0

#define GPIO_OUTPUT  1

 

//===========================================================================

//函数名称:gpio_init

//函数返回:无

//参数说明:port_pin:(端口号)|(引脚号)(例:PORTB|(5) 表示为B口5号脚)

//       dir:引脚方向(0=输入,1=输出,可用引脚方向宏定义)

//       state:端口引脚初始状态(0=低电平,1=高电平)

//功能概要:初始化指定端口引脚作为GPIO引脚功能,并定义为输入或输出,若是输出,

//       还指定初始状态是低电平或高电平

//===========================================================================

void gpio_init(uint_16 port_pin, uint_8 dir, uint_8 state);

 

//===========================================================================

//函数名称:gpio_set

//函数返回:无

//参数说明:port_pin:(端口号)|(引脚号)(例:PORTB|(5) 表示为B口5号脚)

//       state:希望设置的端口引脚状态(0=低电平,1=高电平)

//功能概要:当指定端口引脚被定义为GPIO功能且为输出时,本函数设定引脚状态

//===========================================================================

void gpio_set(uint_16 port_pin, uint_8 state);

 

//===========================================================================

//函数名称:gpio_get

//函数返回:指定端口引脚的状态(1或0)

//参数说明:port_pin:(端口号)|(引脚号)(例:PORTB|(5) 表示为B口5号脚)

//功能概要:当指定端口引脚被定义为GPIO功能且为输入时,本函数获取指定引脚状态

//===========================================================================

uint_8 gpio_get(uint_16 port_pin);

 

//===========================================================================

//函数名称:gpio_reverse

//函数返回:无

//参数说明:port_pin:(端口号)|(引脚号)(例:PORTB|(5) 表示为B口5号脚)

//功能概要:当指定端口引脚被定义为GPIO功能且为输出时,本函数反转引脚状态

//===========================================================================

void gpio_reverse(uint_16 port_pin);

 

//===========================================================================

//函数名称:gpio_pull

//函数返回:无

//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)

//          pullselect:引脚上拉使能选择( 0=上拉除能,1=上拉使能)

//功能概要:使指定引脚上拉高电平

//===========================================================================

void gpio_pull(uint_16 port_pin, uint_8 pullselect);

 

#endif     //防止重复定义(GPIO_H  结尾)

//===========================================================================

//声明:

//(1)我们开发的源代码,在本中心提供的硬件系统测试通过,真诚奉献给社会,不足之处,欢迎指正。

//(2)对于使用非本中心硬件系统的用户,移植代码时,请仔细根据自己的硬件匹配。

//

//苏州大学飞思卡尔嵌入式中心

//技术咨询:0512-65214835  http://sumcu.suda.edu.cn

//===========================================================================

//文件名称:gpio.c

//功能概要:GPIO底层驱动构件源文件

//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)

//版本更新:2015-06-05  V2.0

//芯片类型:KEA128

//===========================================================================

#include "gpio.h"   //包含本构件头文件

 

uint_32 bit;    //内部变量,用于记录引脚在端口寄存器中的偏移量

//内部函数声明

//解析端口号和引脚

static void gpio_port_pin_num(uint_16 port_pin,uint_8* port,uint_8* pin);

//解析基地址和引脚在寄存器中的偏移量

static void gpio_ptr_bit(uint_16 port_pin,GPIO_MemMapPtr* gpio_ptr,uint_32* bit);

//===========================================================================

//函数名称:gpio_init

//函数返回:无

//参数说明:port_pin:(端口号)|(引脚号)(例:PORTB|(5) 表示为B口5号脚)

//       dir:引脚方向(0=输入,1=输出,可用引脚方向宏定义)

//       state:端口引脚初始状态(0=低电平,1=高电平)

//功能概要:初始化指定端口引脚作为GPIO引脚功能,并定义为输入或输出,若是输出,

//       还指定初始状态是低电平或高电平

//===========================================================================

void gpio_init(uint_16 port_pin, uint_8 dir, uint_8 state)

{

//局部变量声明

GPIO_MemMapPtr gpio_ptr;    //声明port_ptr为GPIO结构体类型指针

gpio_ptr_bit(port_pin,&gpio_ptr,&bit);//计算基地址和和引脚在寄存器中的偏移量

//根据带入参数dir,决定引脚为输出还是输入

if (1 == dir)   //希望为输出

{

//端口数据方向寄存器定义为输出

BSET(bit, GPIO_PDDR_REG(gpio_ptr));//1为通用输出,0零表示作为输入

//输出清零寄存器

BSET(bit, GPIO_PCOR_REG(gpio_ptr));//该寄存器置1,引脚输出被置位为0

//初始状态为低电平

gpio_set(port_pin, state);   //调用gpio_set函数,设定引脚初始状态

else 

{

//希望为输入

BCLR(bit, GPIO_PDDR_REG(gpio_ptr));

}

}

 

//===========================================================================

//函数名称:gpio_set

//函数返回:无

//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)

//       state:引脚初始状态(0=低电平,1=高电平)

//功能概要:设定引脚状态为低电平或高电平

//===========================================================================

void gpio_set(uint_16 port_pin, uint_8 state)

{

//局部变量声明

GPIO_MemMapPtr gpio_ptr;    //声明port_ptr为GPIO结构体类型指针

gpio_ptr_bit(port_pin,&gpio_ptr,&bit);//计算基地址和和引脚在寄存器中的偏移量

//根据带入参数state,决定引脚为输出1还是0

if (1==state) 

{

BSET(bit,gpio_ptr->PDOR);//对应位置为1

} else {

BCLR(bit,gpio_ptr->PDOR);//对应位置为0

}

}

 

//===========================================================================

//函数名称:gpio_get

//函数返回:指定引脚的状态(1或0)

//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)

//功能概要:获取指定引脚的状态(1或0)

//===========================================================================

uint_8 gpio_get(uint_16 port_pin)

{

//局部变量声明

GPIO_MemMapPtr gpio_ptr;    //声明port_ptr为GPIO结构体类型指针

gpio_ptr_bit(port_pin,&gpio_ptr,&bit);//计算基地址和和引脚在寄存器中的偏移量

//返回引脚的状态

return ((BGET(bit,gpio_ptr->PDIR))>=1 ? 1:0);

}

 

//===========================================================================

//函数名称:gpio_reverse

//函数返回:无

//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)

//功能概要:反转指定引脚输出状态。

//===========================================================================

void gpio_reverse(uint_16 port_pin)

{

//局部变量声明

GPIO_MemMapPtr gpio_ptr;    //声明port_ptr为GPIO结构体类型指针

gpio_ptr_bit(port_pin,&gpio_ptr,&bit);//计算基地址和和引脚在寄存器中的偏移量

//反转指定引脚输出状态

BSET(bit,gpio_ptr->PTOR);

}

 

//===========================================================================

//函数名称:gpio_pull

//函数返回:无

//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)

//       pullselect:引脚上拉使能选择( 0=上拉除能,1=上拉使能)

//功能概要:使指定引脚上拉高电平

//===========================================================================

void gpio_pull(uint_16 port_pin, uint_8 pullselect)

{

//局部变量声明

uint_8 port;                //端口号

uint_8 pin;                 //引脚号

gpio_port_pin_num(port_pin, &port, &pin);   //解析出端口号及引脚号

//计算引脚在寄存器中的偏移量

if (port < 4)               //端口号为PORTA~PORTD

{

//引脚所在的位数

bit = 8 * port + pin;

if (1==pullselect){BSET(bit,PORT_PUE0);}//端口上拉使能低位寄存器0上拉使能

else {BCLR(bit,PORT_PUE0);}//上拉除能(不使能)

}

else if(3 {

//引脚所在的位数

bit = 8 * (port - 4) + pin;

if (1==pullselect){BSET(bit,PORT_PUE1);}//端口上拉使能低位寄存器1上拉使能

else {BCLR(bit,PORT_PUE1);}

}

else                       //端口号为PORTI

{

//引脚所在的位数

bit = 8 * (port - 8) + pin;

if (1==pullselect){BSET(bit,PORT_PUE2);}//端口上拉使能低位寄存器2上拉使能

else {BCLR(bit,PORT_PUE2);}

}

}

 

//----------------------以下为内部函数存放处----------------------------------------

[1] [2]
关键字:飞思卡尔  KEA128 引用地址:恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)

上一篇:飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)CAN资料
下一篇:恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(二)

推荐阅读最新更新时间:2024-11-12 14:54

飞思卡尔16位单片机(十三)—— SPI模块测试
一、SPI模块介绍 串行外围器件接口(SPI)模块提供单片机和外围器件间的全双工、同步和串行通信。这些外围器件可以包括其他微控制器、模数移位器、移位寄存器、传感器和存储器等。SPI运行在主模式中最高可运行在总线时钟除以2的波特率上,在辅模式中最高可运行在总线时钟除以4的波特率上。 SPI的中心元件是SPI移位寄存器。数据写入双缓冲发射器(写入SPIDR),然后转移到位于数据传输起点的SPI移位寄存器。在数据字节中转换后,数据被传输到双缓冲接收器,在这里数据可以被读取(从SPIDR读取)。管脚复用逻辑控制着单片机管脚和SPI模块间的连接。SPI的功能框图如下图所示。 当SPI配置为主SPI时,时钟输
[单片机]
<font color='red'>飞思卡尔</font>16位单片机(十三)—— SPI<font color='red'>模块</font>测试
飞思卡尔面向新型虚拟网络推出64位基于ARM®的处理器
基于ARM Cortex®-A53内核的QorIQ LS系列四核处理器带来了“智能边缘”,为虚拟边缘服务的演进提供了优化平台。 2014年10月21日,加利福尼亚州圣克拉拉(Linley Tech处理器大会)讯-飞思卡尔半导体(NYSE: FSL)日前宣布推出QorIQ LS1043A通信处理器,这是面向新型虚拟网络推出的64位基于ARM®的处理器,其能效为业内最高。如今软件定义网络高度虚拟化,其需求也日新月异,而该款片上系统(SoC)可帮助边缘网络设备制造商轻松扩展能力和性能,满足这些多变的需求。 云及数据中心技术越来越多地部署在分支机构、零售商店甚至是住宅,带动了标准灵活、低功耗平台需求的增长。同时,由于如今
[网络通信]
基于飞思卡尔HCS08的汽车ECAS设计
0 引言 空气悬架主要有被动悬架和可控电子悬架。被动悬架一定程度上抑制和降低了车体和车 轮的动载和振动,保证了车辆行驶安全性和乘坐舒适型。但由于被动悬架的刚度和阻尼系数一般按经验选取,只在特定环境下是最优,而一旦载荷,路况,速度等因素发生变化,被动悬架不能随之而自动调节,更不能手动调节。为了克服这一缺陷,电子空气悬架系统(ECAS)由此产生。ECAS 是目前最先进的汽车悬架系统,它可以随着路况,载荷,速度等变化因子自动调节悬架刚度,车身高度,减少了空气消耗,且具有反应迅速,安装容易,操作简单等优点,因此可控电子悬架已经成为汽车电子领域研究的一个热门课题,其有着广阔的发展前景。 1 ECAS 的组成及原理 电控空气悬架系统由电
[单片机]
基于<font color='red'>飞思卡尔</font>HCS08的汽车ECAS设计
飞思卡尔MC9S12XS128  SCI串口相关…
//串口的初始化 //波特率为9600,8位数据格式,无校验,一个停止位,用查询方式发送 void SCI_Init(void) { SCI0BDH = 0x00; SCI0BDL = 0x41; //波特率=BUSCLK/(16*BR )=38400 , BUSCLK=40MHz 14400_0xae 38400_0x41 230400_0x0b SCI0CR2 = 0x2C; //发送,接收允许,接收采用中断方式 } //将8位二进制数转换为相应的ASCII字符 unsigned char Digit_ASCII(unsigned char temp) { if(temp =0x0A)//如
[单片机]
飞思卡尔Kinetis KL02微控制器现已广泛上市
飞思卡尔半导体公司推出Kinetis KL02 系列32位微控制器(MCU),使一系列应用的处理性能和能效达到了新的高度,有助于拓展物联网(IoT)。体积微小的KL02器件的能耗很小,能效是主要竞争对手的6倍,因而成为超小外形和电池供电产品的理想选择。 所涉及的应用包括便携式消费电子设备、传感节点、穿戴式设备,甚至还有可吞服医疗传感设备。随着越来越多的此类产品具备智能,成为物联网生态系统的组成部分,设计师需要确保产品尺寸小且功耗少,同时还提供用户期望的传统互联设备如平板电脑和智能手机所具备的连接特性。 飞思卡尔副总裁兼MCU事业部总经理Geoff Lees表示:“随着物联网的不断发展,市场迫切需要各种尺寸和
[单片机]
飞思卡尔推出QorIQ T2080处理器样品
2013年11月4日,深圳(风河开发者大会)讯 – 飞思卡尔半导体(NYSE: FSL)日前已开始提供其QorIQ T2080处理器样品,并计划于在2013年11月5日举行的中国深圳风河开发者大会上首次公开演示该器件。 T2080 通信处理器具有最佳的性能和功效,专为控制平面或集成控制平面和数据平面处理而设计,目标应用包括移动回程设备、LTE/WCDMA通道卡、网络交换和路由、控制卡、智能网卡及军用与航空产品。 T2080包括8个虚拟内核,旨在为采用飞思卡尔QorIQ P5040、P4080和P3041处理器进行设计的现有用户节约成本并提升性能。T2080属于飞思卡尔28纳米QorIQ 处理平台,该平台还包括T42
[单片机]
飞思卡尔MC9S12XEP100 CAN学习总结(一) 概述
初始化流程 step1.查询是否进入初始化状态,如不是,进入初始化状态,此处需设置CANCTL0,CANCTL1寄存器。 step2.设置CAN波特率,此处需设置CANBTR0,CANBTR1寄存器。 step3.关闭相应CAN口滤波器,此处需设置CANIDMR寄存器。 step4.使能MSCAN模块,进入一般模式,选择时钟,此处需设置CANCTL0,CANCTL1寄存器。 step5.设置接收或者发送中断使能。
[单片机]
<font color='red'>飞思卡尔</font>MC9S12XEP100 CAN学习总结(一) 概述
飞思卡尔推出工业级32位微控制器
飞思卡尔半导体推出业界首款基于ARM® Cortex™-M0+处理器的5V 32位MCU。全新Kinetis E系列MCU具有强大的系统电磁抗噪能力(过去只有8位和16位MCU具有这种能力),如白色家电 和工业应用,同时提供高效率和最佳代码密度。 全新的Kinetis E系列产品是洗碗机、冰箱、家庭和楼宇控制系统、电机控制风机、工业转换器以及通常在高噪声环境中运行的其他设备等应用的理想选择。利用这些器件的耐用设计和32位处理能力,系统设计人员可以只采用一个器件,而不是以前所需的多个MCU。此外,大间距封装选件和高静电放电保护性能支持单层板设计,减少其他电路保护组件的需求,从而降低系统成本。 飞思卡尔MCU业务部营销和业务开发
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved