因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的内部预取指单元。好了,今天只是初步测试一下它的GPIO功能,所谓的GPIO也就是通用输入/输出口(General Purpose Input Output),万丈高楼平地起,慢慢来吧。实验的原理图很简单,就是几个LED灯,关于灯的电流及电压参数,这里不作详细介绍,有兴趣的可以到网上或供应商那里要一份数据手册看一下,做技术的不能懒,有些东西该看的还是要看的。

  图1 硬件原理图

  硬件原理图很简单了,74LVC244是用来驱动LED的,74LVC244内部就是8个三态门,关于它的详细电气参数,请参阅它的数据手册。关于程序也不是太难,有几个地方要说一下。即然是GPIO实验,当然要关注GPIO的配置了,由于大部分引脚都具有一个以上功能,所以首先要配置引脚功能寄存器PINSEL,只有当引脚配置为GPIO功能时,GPIO的方向位才有效,对于其它功能来说,方向是自动的。关于引脚功能寄存器PINSEL功能如下表所示:

PINSEL0~PINSEL9的值

功能

复位后的值

00

默认功能,通常为GPIO口

00

01

第一个可选功能

10

第二个可选功能

11

第三个可选功能

PINSEL寄存器每两位控制一个引脚,由于各个引脚的功能不一样,所以PINSEL0~PINSEL9的配置也相应的有所不同,想详细了解这10个寄存器的功能可以参看《user.manual.lpc17xx》,这个手册可以到NXP的网站上去下载。由于这次实验只是用到GPIO功能,所以暂时不用管这个寄存器,用它的默认值就可以了。

另一个寄存器是引脚模式选择寄存器PINMODE,它控制所有端口的工作模式,包括是否配置上拉/下拉电阻和特定的开漏操作模式等。引脚模式选择寄存器PINMODE的功能如下表所示:

PINMODE0~PINMODE9的值

功能

复位后的值

00

引脚使能片内上拉电阻

00

01

中断模式

10

引脚没有使能片内上拉/下拉电阻

11

引脚使能下拉电阻

当引脚处于逻辑高电平时,中继模式使能上拉电阻,当引脚处于逻辑低电平时,使能下拉电阻,当引脚配置为输入且不是通过外部驱动时,引脚将保持上一个已知状态。PINMODE_0D寄存器控制寄存器的开漏模式,引脚配置为输出且值为0时,开漏模式会正常地将引脚电平拉低。但是如果输出引脚为1,则引脚输出驱动关闭,等同于改变了引脚的方向,实际上是模拟了一个开漏输出。

PINMODE_0D0~PINMODE_0D4的值

功能

复位后的值

00

引脚处于正常模式(非开漏模式)

00

01

引脚处于开漏模式

  除了以上两个寄存器要配置,与GPIO端口相关的寄存器还有快速端口值寄存器FIOPIN可以用来读/写端口的值,端口输出置位寄存器FIOSET,当这个寄存器的相应位置1时,相应端口引脚输出1,当然也可以从这个寄存器读取当前引脚输出的值,与它对应的寄存器是FIOCLR,当寄存器FIOCLR相应位置1时,相应引脚输出0,但这个寄存器是只写寄存器,不能读取数据。好了,关于这些寄存器先总结到这,详细的配置还要看LPC1768的用户手册《user.manual.lpc17xx》,当然也可以经常去NXP网站逛逛看看其它的handbook或whitepaper 好了,下面给出实验程序,由于程序太多,只给出部分,剩下的源文件可以到工程文件夹中去找:

 /*********************************************************************************
 工程名称:lesson1
 功    能: 学习使用LPC1768的IO口功能,为以后学习打基础
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/16
 作    者: 懒猫爱飞
 版本  号:V1R0
 ---------------------------------------------------------------------------------
 修改内容:NULL
 修改日期:
 修改人员:
 ---------------------------------------------------------------------------------

**********************************************************************************/

/*********************************************************************************
 文件名称:mian.c
 功    能: 主要调度函数及应用函数
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/16
 作    者: 懒猫爱飞
 备    注:NULL
 ---------------------------------------------------------------------------------
 修改内容:NULL
 修改日期:XXXX年xx月xx日      xx时xx分
 修改人员:xxx xxx xxx

**********************************************************************************/
#include"main.h"

volatile unsigned long SysTickCnt;      /* 用于系统时钟计数 */

/********************************************************************************
 * 函数名称 :void SysTick_Handler (void)
 * 函数功能 : 系统节拍定时器中断函数,每1ms计数一次
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void SysTick_Handler (void)
{
  SysTickCnt++;
}

/********************************************************************************
 * 函数名称 :void Delay (unsigned long tick)
 * 函数功能 : 毫秒级延时函数
 * 入口参数 : unsigned long tick -- 延时时长
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void DelayMs (unsigned long tick)
{
  unsigned long systickcnt;

  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}

/********************************************************************************
 * 函数名称 :void PortInit(void)
 * 函数功能 : 端口初始化
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void PortInit(void)
{
   GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
   GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
   Led1Off();     /* 初始化时熄灭所有的灯 */
   Led2Off();
   Led3Off();
   Led4Off();
   Led5Off();
   Led6Off();
   Led7Off();
   Led8Off();
}

/********************************************************************************
 * 函数名称 :int main(void)
 * 函数功能 : 主函数
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
int main(void)
{
    SystemInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
    SysTick_Config(SystemFrequency/ - );   /* 配置时钟中断,每1ms中断一次 */
                                                /* 在core_cm3.h中定义*/
    PortInit();       /* 端口初始化 */
    )
    {
        Led1On();
        Led4On();
        DelayMs();
        Led1Off();
        Led4Off();
        DelayMs();
    }

}

  因为程序是最基础的实验,所以不是太难,程序中延时函数用的是系统节拍定时器,每1m中断一次,系统节拍定时器的中断配置函数是SysTick_Config(uint32_t ticks)它在core_cm3.h中有定义,有兴趣的话可以看看。GPIO是一个结构体指针,原型在LPC17XX.H这个头文件中,其定义的原型如下所示:

typedef struct
{
    __IO uint32_t FIODIR;
    uint32_t RESERVED0[];
    __IO uint32_t FIOMASK;
    __IO uint32_t FIOPIN;
    __IO uint32_t FIOSET;
    __IO uint32_t FIOCLR;
} GPIO_TypeDef;

还有几个宏定义,如下所示:

  1)、#define GPIO1 (( GPIO_TypeDef *) GPIO1_BASE)

  上面这个宏是把GPIO1指向芯片GPIO1的基址上,

  2)、#define GPIO1_BASE (GPIO_BASE + 0x00020)

  3)、#define GPIO_BASE (0x2009C000UL)

  这三个宏就把GPIO的基址定义了出来,关于LPV1768内部地址的分配情况,可以参看它的数据手册,也可参考一下《ARM Cortex-M3 权威指南》。

Cortex-M3学习日志(一)-- GPIO实验的更多相关文章

  1. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  2. Beaglebone Back学习四(GPIO实验)

    GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有“复用”的特性,大约每个引脚有8种工作模式(Beagle System Refere ...

  3. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  4. Cortex-M3学习日志(六) -- ADC实验

    上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...

  5. Cortex-M3学习日志(五) -- DAC实验

    终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...

  6. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  7. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  8. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  9. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

随机推荐

  1. [置顶] 学习鸟哥的Linux私房菜笔记(6)——过滤器、输入输出及管道

    一.过滤器 Linux中的应用工具分为三种: 交互工具 过滤器 编辑器 能够接受数据,过滤再输出的工具,称之为过滤器 对过滤器和进程,存在着输入源与输出对象 二.输入.输出.重定向 输入:过滤器的数据 ...

  2. struts2中的方法过滤拦截器

    方法过滤拦截器是只过滤指定的方法,如果使用针对action 的普通的过滤器则会过滤该action内部 所有方法.如果在一个action中同时有多个作为业务逻辑控制的方法存在 的话则会过滤所有的业务逻辑 ...

  3. Android TextView 手动上下滑动

    有时候项目需求,TextView只显示若干行,其他部分隐藏,需要滑动才会显示,一般默认都是自动填充全部显示,或者手动设置高度,那样文字就显示不全,这时候可以使用下面的解决方案,代码设置显示的行数,然后 ...

  4. css实现两端对齐的3种方法

    两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...

  5. WCF部署到IIS异常(详细: 不能加载类型System.ServiceModel.Activation.HttpModule )

    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...

  6. php redis数据库操作类

    <?php namespace iphp\db; use iphp\App; /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时, ...

  7. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  8. android handler机制和Timer采用

    Timer主要用于创建一个任务来定期运行. 创建继承Task该任务等级.即任务每次跑. private class MyTask extends TimerTask { @Override publi ...

  9. Java基础学习笔记2-循环

    while循环与do while循环: while循环的格式: while(条件表达式) { 执行语句; } do while循环格式: do { 执行语句; } while(条件表达式); do w ...

  10. T-SQL变量

    T-SQL中变量分为全局变量和局部变量,分别使用@@和@前缀. 全局变量 常用的全局变量有@@VERSION .@@IDENTITY.@@ERROR.@@ROWCOUNT 用法 select @@VE ...