因为项目所需,所以不得不开始研究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. locate linux文件查找命令

    locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...

  2. MUD江湖_MUD文字游戏_MUD五指_武林群侠_北侠_夺宝江湖_书剑_文字江湖游戏_MUD游戏下载

    MUD江湖_MUD文字游戏_MUD五指_武林群侠_北侠_夺宝江湖_书剑_文字江湖游戏_MUD游戏下载  武侠类手机文字游戏,经典再现高度自由玩法宠物 自制装备 师徒自立门派 自造武功欢迎来玩 Q群 1 ...

  3. Apache Spark2.0正式发布

    Apache Spark2.0正式发布 7月26日起Databricks开始提供Apache Spark 2.0的下载,这个版本是基于社区在过去两年的经验总结而成,不但加入了用户喜爱的功能,也修复了之 ...

  4. getHibernateTemplate()和getSession()的区别

    自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢? 1. ...

  5. C++流操作之fstream

    在Windows平台对文件进行存取操作可选的方案有很多,如果采用纯C,则需要用到File*等,当然也可以直接调用Windows API来做:如果采用C++,首先想到的就是文件流fstream.虽然在C ...

  6. linux 进程(二) --- 进程的创建及相关api

    一.进程的创建fork()函数  由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进程的返回值则是 新子进程的进 ...

  7. POJ 3104 Drying(二分答案)

    [题目链接] http://poj.org/problem?id=3104 [题目大意] 给出n件需要干燥的衣服,烘干机能够每秒干燥k水分, 不在烘干的衣服本身每秒能干燥1水分 求出最少需要干燥的时间 ...

  8. LInux 下安装jdk

    安装jdk版本为1.6.0_12 一.下载jdk 下载地址:http://download.java.net/jdk6/ 选择Linux Platform jdk-6u12-linux-i586.bi ...

  9. 【POJ】3264 Balanced Lineup ——线段树 区间最值

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34140   Accepted: 16044 ...

  10. android 百度地图定位功能实现

    历经几天时间,终于把定位功能给实现了,可谓是费劲千辛万苦啊,有定位知识还有图层知识,在这里我把代码给大家贴出来,一起分享一下下啦. package com.example.foreveross.off ...