有输出总会有输入,今天测试一下按键的功能,第一节已经说过了与GPIO端口相关的寄存器,这里不在重复,想要从端口读取数据,首先把FIODIR这个寄存器设置为输入,再从FIOPIN寄存器读取数据就可以了,这个寄存器具有读写功能。下面说一下这个实验的电路图,如下所示:

图1-1 Joystick按键连线图

关于按键电路还有一个,不过是接在外部中断0 上的,其电路图如下图所示:

这次实验没有涉及到外部中断,都是做普通的IO输入使用的,所以在这里外部中断就做学习总结了。下面给出这次实验的主程序:

 /*********************************************************************************
 工程名称:lesson2
 功    能: 学习使用LPC1768的IO口功能,为以后学习打基础
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/17
 作    者: 懒猫爱飞
 版本  号: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    */
   LedAllOff();                             /* 初始化时熄灭所有的灯 */
}

/********************************************************************************
 * 函数名称 :int main(void)
 * 函数功能 : 主函数
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
int main(void)
{
    unsigned ;  // 记录LED状态
    SystemInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
    SysTick_Config(SystemFrequency/ - );   /* 配置节拍定时器中断,每1ms中断一次 */
                                                /* 在core_cm3.h中定义*/
    PortInit();       /* 端口初始化 */
    )
    {
        if(!LedFlag)
        {
            Led1On();  // 点亮LED
        }
        else
        {
            Led1Off(); // 熄灭LED
        }

        if(!KEY_VAL)
        {
            DelayMs();
            while(!KEY_VAL);
            LedFlag ^=;  // Led状态改变一次
        }

        if(!KEY_EN)       // 此处是为了测试摇杆按键的功能是否正常
        {
            DelayMs();
            while(!KEY_EN);
            Led8Neg();  // 点亮LED // Led状态改变一次
        }

    }

}

上一节对程序没有做过多的解释,这里详细分析一下,工程中包含的源文件如下图所示:

工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个:

1)堆和栈的初始化

2)向量表定义

3)地址重映射及中断向量表的转移

4)设置系统时钟频率

5)中断寄存器的初始化

6)进入C应用程序

工程中main.c是我写的应用程序,也就是这次实验的程序,core_cm3.c与core_cm3.h主要是M3外围驱动源代码与头文件,使用时一般不需要修改,直接调用就可以。system_LPC17xx.c与system_LPC17xx.h是关于系统的文件,里面主要提供了系统初始化函数SystemInit(),文件中默认情况下定义的晶振的大小为12M,使用的是外部晶振,还使用了PLL0倍频,关于倍频的问题,以后慢慢再总结。芯片LPC1768的初始化主要包括时钟配置,电源管理,功耗管理等。相比较而言,时钟配置相对复杂,因为它包括两个PLL倍频电路,一个是主PLL0主要是为系统和USB提供时钟,另一个是PLL1专门为USB提供48M时钟,但也可以不使用它们。由于时钟配置比较灵活,所以相以设置这些参数也比较复杂,但是这些在系统文件中已有明确的定义,所以想要变动时只需修改系统文件中相应的宏或函数即可。

下面简要总结一下main()函数,首先是系统初始化函数SystemInit(),上面说过它在system_LPC17xx.c这个源文件中,这个函数主要完成了对时钟的配置,系统功耗PCONP,时钟输出,flash加速等系统资源配置。如果要进行修改可以参考源文件的修改方法,虽然是英文注释,但都非常简单,有兴趣的可以打开看看,不过一般情况下我们拿来直接用就好了不用修改的。

函数          SysTick_Config(SystemFrequency/1000 - 1) 是用来配置系统时钟节拍的,它的原型在core_m3.c这个源文件中。实验程序中用的延时函数都是硬件延时,其实就是系统节拍定时器所产生的。使用硬件延时的原因是1、不占用软件系统资源,2、比较精确。系统定时器配置很简单,使用也很方便,专为系统软件或系统管理软件提供间隔中断。系统节拍定时器的时钟源可以是内核时钟也,可以是外部时钟,外部时钟P3.26脚引入,当然想从这个引脚输入时钟,需要将这个引脚先配置成STCLK功能。系统节拍定时器是一个24位定时器,当计数值达到0时产生中断。系统节拍定时器的功能就是为下一次中断提供前提供一个固定时间间隔。由于节拍定时器是24位的,所以使用时不能与其它定时器混为一谈,一定要注意定时时长的限制,不能超过界限。

最后再说一下数据类型的问题,在8位机中数据位找一般就是8位的所以,定义变量时一般选用单字节处理速度会快些,但到了32位机中,数据位宽一般是32位的,所以定义变量时一般用4字节会好些。在core_cm3.c中有关于数据类型的定义,有兴趣的可以打开看看。

Cortex-M3学习日志(二)-- 按键实验的更多相关文章

  1. Arduino学习笔记④ 经典按键实验

    1.前言     我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验.废话少说,赶紧上车. 2.实验材料 ...

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

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

  3. mybatis学习日志二

    一.动态sql语句 if语句 if+where语句 if+set语句 choose(when,otherwise)语句 trim语句 sql片段 foreach语句 总结 bean部分的User类代码 ...

  4. 《视觉SLAM十四讲》学习日志(二)——初识SLAM

    小萝卜机器人的例子: 就像这种机器人,它的下面有一组轮子,脑袋上有相机(眼睛),为了让它能够探索一个房间,它需要知道: 1.我在哪——定位 2.周围环境怎么样——建图 定位和建图可以理解成感知的 &q ...

  5. spring学习日志二

    一.spring依赖注入的方式 1.通过set方法来完成注入 <bean id="student" class="com.zhiyou100.xz.spring.S ...

  6. springmvc学习日志二

    一.当接受的参数为日期类型时 1.建立jsp页面,向Controller类传入参数 1.1当传入的参数为单个时 <body> <form action="user/toDa ...

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

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

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

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

  9. zigbee学习之路(十五):基于协议栈的按键实验

    一.前言 经过上次的学习,相信大家已经初步学会使用zigbee协议进行发送和接受数据了.今天,我们要进行的实验是按键的实验,学会如何在协议栈里实现按键中断. 二.实验功能 在协议栈上实现按键中断,BU ...

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

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

随机推荐

  1. 矩阵乘法的MPI并行计算

    1.问题描述 矩阵乘法问题描述如下: 给定矩阵A和B,其中A是m*p大小矩阵,B是p*n大小的矩阵.求C = A*B. 求解这个问题最简单的算法是遍历A的行和B的列,求得C的相应元素,时间复杂度O(m ...

  2. Toolkit Pro学习--Toolbar的创建

    一.新建Toolkit Pro应用程序 安装好Toolkit Pro后,打开VS2008,新建-项目-Toolkit Pro Application.如图1所示. 图1:Toolkit Pro创建窗口 ...

  3. linux 下idea 启动tomcat报JMX 1099错误解决办法

    开始使用linux开发环境,在配置idea 下tomcat 启动时报错,提示错误为unable to ping server at localhost:1099. 解决办法: 修改/etc/hosts ...

  4. 用document.title=“xxx”动态修改title,在ios的微信下面不生效的解决办法!

    //需要jQuery var $body = $('body'); document.title = 'title'; // hack在微信等webview中无法修改document.title的情况 ...

  5. Android 大神博客汇集

    非常给力的CSDNBlog和个人Blog,这些Blog都有一个共同的特点,即内容详实,讲解透彻,也算是给后来的初学者指一条路吧!只要你下定决心跟随强者的脚步,成为人们眼中的大神,只不过是时间问题! 下 ...

  6. Python爬虫:常用浏览器的useragent

    1,为什么需要修改UserAgent 在写python网络爬虫程序的时候,经常需要修改UserAgent,有很多原因,罗列几个如下: 不同Agent下看到的内容不一样,比如,京东网站上的手机版网页和p ...

  7. Linux下去掉Windows文件的^M

    Windows下文件换行符为\r\n  而Linux下文件的换行为\n 因此在Linux下可以使用vim编辑文件  使用全文替换命令 :%s/\r//g 将\r全部替换掉 也可以在Linux使用dos ...

  8. python 爬虫时遇到问题及解决

    源代码: #unicoding=utf-8import reimport urllib def gethtml(url): html=urllib.urlopen(url) page=html.rea ...

  9. 对TCP说三道四(三次握手)

    夜朦胧,人方静,无聊的人打开了无聊的电脑看到了一张无聊的图,想着想着就睡着了,梦到了人a和人b的一次聊天. 有一天,a有事情想跟b商量就问b“有时间么,想和你聊一下天”,b想了一会发现自己能抽出时间就 ...

  10. 用做网页开发经历了三个阶段(附长篇讨论) good

    用做网页开发经历了三个阶段:第一阶:傻干阶段使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了. 第二阶:困惑阶段使用Intraweb,有很多限制,比 ...