恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)
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还是0if (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<port &&port< 8) //端口号为PORTE~PORTH{//引脚所在的位数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);}}
}//----------------------以下为内部函数存放处----------------------------------------
//===========================================================================
//函数名称:gpio_port_pin_num
//函数返回:无
//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)
// port:解析出的端口号
// pin:解析出的引脚号(0~8,实际取值由芯片的物理引脚决定)
//功能概要:将传进参数port_pin(例:PORTB|(5))进行解析,得出具体端口号与引脚号,由port、pin传出。
// 例如,PORTB|(5)解析为*port=PORTB,*pin=5)。
//备 注:port,pin为传地址参数,目的是将结果带回,调用函数前,不需要赋值
//===========================================================================
static void gpio_port_pin_num(uint_16 port_pin,uint_8* port,uint_8* pin)
{*port = port_pin>>8;*pin = port_pin;
}
//===========================================================================
//函数名称:gpio_ptr_bit
//函数返回:无
//参数说明:port_pin:端口号|引脚号(例:PORTB|(5) 表示为B口5号脚)
// gpio_ptr:解析出的基地址
// bit:引脚在寄存器中的偏移量
//功能概要:将传进参数port_pin(例:PORTB|(5))进行解析,解析基地址和引脚在寄存器中的偏移量,由gpio_ptr、bit传出。
// 例如:PORTB|(5)解析为基地址为GPIOA_BASE_PTR,偏移量为13
//备 注:port,pin为传地址参数,目的是将结果带回,调用函数前,不需要赋值
//===========================================================================
//解析基地址和引脚在寄存器中的偏移量
static void gpio_ptr_bit(uint_16 port_pin,GPIO_MemMapPtr* gpio_ptr,uint_32* bit)
{uint_8 port; //端口号uint_8 pin; //引脚号gpio_port_pin_num(port_pin, &port, &pin); //解析出端口号及引脚号//计算引脚在寄存器中的偏移量if (port < 4) //端口号为PORTA~PORTD{//端口所在的寄存器基地址*gpio_ptr = GPIOA_BASE_PTR;//引脚所在的位数*bit = 8 * port + pin;} else if(3<port &&port< 8) //端口号为PORTE~PORTH{//端口所在的寄存器基地址*gpio_ptr = GPIOB_BASE_PTR;//引脚所在的位数*bit = 8 * (port - 4) + pin;}else //端口号为PORTI{//端口所在的寄存器基地址*gpio_ptr = GPIOC_BASE_PTR;//引脚所在的位数*bit = 8 * (port - 8) + pin;}}
//----------------------------内部函数结束---------------------------------------
恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)相关推荐
- 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC
KEA128的ADC有8个寄存器 ADC编程基本步骤: 1.打开ADC模块时钟 2.开启ADC_APCTL1引脚控制寄存器相应引脚的AD功能(即关闭这些引脚的IO功能) 3.配置ADC_SC3寄存器的 ...
- 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(二)
苏州大学资料KEIL模版 链接:https://pan.baidu.com/s/1e3g--GzvsU-lEIqy8WttGg 提取码:qwik 通过IO控制小灯亮灭. //============ ...
- 恩智浦+飞思卡尔后你需要知道的十件事
这两年,半导体行业似乎进入了多事之秋,收购战此起彼伏.就在今年短短的3个月里,半导体行业并/收购案有:Avago Technologies 以 6 亿美金价格收购无线网络公司 Emulex Corp ...
- 好程序员web前端分享Nodejs学习笔记之Stream模块
好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...
- node.js学习笔记5——核心模块1
node.js学习笔记5--核心模块1 Node.js核心模块主要内容包括:(1)全局对象 (2)常用工具 (3)事件机制 (4)文件系统访问 (5)HTTP服务器与客户端 一: 全局对象 Node. ...
- python学习笔记4(模块
python学习笔记4(模块) 一.模块 1.1 import语句 1.2 __name__属性 1.3 dir()函数 1.4 包 2.1 导入特定模块: 二.输入与输出 2.1 format使用 ...
- STM32F407学习笔记——MG90S舵机模块(基本控制)
STM32F407学习笔记--MG90S舵机模块(基本控制) 一.基本原理: 通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms). 旋转 ...
- 【STM32F407学习笔记】GPIO(一)
[STM32F407学习笔记]GPIO(一) 1. GPIO基础知识 1.1 GPIO工作方式 1.2 GPIO相关配置寄存器 1.2.1 端口模式寄存器:GPIOx_MODER 1.2.2 输出类型 ...
- Apollo学习笔记3-定位模块配置
Apollo学习笔记3-定位模块配置 环境介绍 导航设备参数配置 导航设备配置 (1)杆臂配置 (2)GNSS 航向配置 (3)导航模式配置 (4) USB 接口输出设置 (5)网口配置 (6) PP ...
- 【Info】车载芯片的几个大玩家:飞思卡尔(Freescale), 恩智浦(NXP), 高通(Qualcomm)
恩智浦前身为飞利浦(PHILIPS)半导体业务. 飞思卡尔的前身为摩托罗拉(Motorola)半导体部门. 2015年3月2日,恩智浦(NXP Semiconductors)宣布,将以大约118亿美元 ...
最新文章
- (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)
- python人工智能——深度学习——TensorFlow基本介绍
- The Changing Face of Business Intelligence(正在改变中的BI的脸)二
- Nginx负载均衡策略之fair介绍
- 深度学习之循环神经网络(3)梯度传播
- WinCE电源管理的简单介绍
- 「译」 用 Blazor WebAssembly 实现微前端
- post多个参数_如何使用Arjun v1.3挖掘HTTP参数
- UDP聊天工具的实现
- (转)python类:magic魔术方法
- java事件处理机制(自定义事件)
- java oracle序列化_Java序列化(Serialization)的理解
- python权重矩阵_生成空间权重矩阵
- vs2012 安装 InstallShield
- JavaScript --------WebS APIs学习之网页特效(offset系列)
- 三种嵌入式操作系统比较和分析
- 区块链技术发展现状和趋势
- 【目标检测】Detection in Crowded Scenes: One Proposal, Multiple Predictions
- 【蓝桥杯真题】成绩统计
- 浅谈百度地图的简单开发再续前缘之公交,地铁路线检索查询(六)
热门文章
- AMD ROCm 硬件支持情况
- 引爆Spark大数据引擎的七大工具
- 怎么有效的管理微信群?分享3点有用的经验
- Photoshop制作墙壁立体雕刻字
- Function与function的区别
- 用于空间搜索的四叉树
- Ubuntu12.04 64位 无法运行32位程序 吉林大学校园网客户端Drcom DrClient
- php spider 开发文档,爬虫进阶开发——之技巧篇 - 开发PHPSpider爬虫的常用工具 - 《phpspider开发文档》 - 书栈网 · BookStack...
- 如何计算当地的中央子午线?全国各地中央子午线【转载】
- 工业机器人pallet指令_工业机器人编程指令详解