历史上的今天

今天是:2025年03月09日(星期日)

正在发生

2018年03月09日 | Cortex-M3处理器按键实验程序自学

发布者:闪耀的星空 来源: eefocus关键字:Cortex-M3  处理器  按键实验 手机看文章 扫描二维码
随时随地手机看文章

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

图1 JoySTICk按键连线图

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

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

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

      文件名称: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 char LEDFlag = 1;  // 记录LED状态

      SystEMInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义*/

      SysTICk_Config(SystemFrequency/1000 - 1);   /* 配置时钟中断,每1ms中断一次*/

      /* 在core_cm3.h中定义*/

      PortInit();       /* 端口初始化*/

      while(1)

      {

      if(!LedFlag)

      {

      Led1On();  // 点亮LED

      }

      else

      {

      Led1Off(); // 熄灭LED

      }

      if(!KEY_VAL)

      {

      DelayMs(10);

      while(!KEY_VAL);

      LedFlag ^=1;  // Led状态改变一次

      }

      if(!KEY_EN)       // 此处是为了测试摇杆按键的功能是否正常

      {

      DelayMs(10);

      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  处理器  按键实验 引用地址:Cortex-M3处理器按键实验程序自学

上一篇:Cortex-M3处理器的GPIO实验自学
下一篇:Cortex-M3处理器的外部中断程序自学

推荐阅读

在关乎自动驾驶视觉系统的所有传感器当中,激光雷达可谓是最不可或缺的一个。受全球自动驾驶战场持续火热的影响,这条赛道现在也开始变得拥挤起来,前有Velodyne以高线束LiDar研发能力和大规模量产实力稳拿“一哥”地位,后有Quanergy、LeddarTech以及速腾聚创等众多行业新秀们“群雄逐鹿”,在加上通用、百度、福特以及安波福等自动驾驶巨头们持续的煽风...
集微网消息,3月7日,耐威科技在互动平台表示,公司目前预计北京8英寸MEMS产线将在今年三季度实现试生产,2020年正式分步投产。根据前期测算,项目3万片月产能若完全达产,预计可新增年平均销售收入约20亿元,新增年平均净利润约3亿元。但因为产线是分步投产、达产,因此具体到每个会计期间的具体收入和利润还需要后续根据实际情况进行测算。耐威科技此前...
党的十九届四中全会对坚持和完善社会主义市场经济体制、推进能源革命作了十分清晰、精辟而深刻的阐述,是指导中国特色电力市场建设的重要指南,贯穿其中的是用辩证唯物主义和历史唯物主义的思维、观点和方法,坚持普遍性与特殊性相结合,看待问题,分析原因,寻求符合国情的电力市场建设规律,寻找走中国特色电力市场建设道路。 任何事物的发展与变化...
在评估用于IIoT的Wi-Fi MCU时,设计人员需要考虑多种功能,例如ADC,接口,安全性和互操作性。随着工业物联网(IIoT)的发展,趋势是在单个片上系统(SoC)中而不是在多个分立设备中执行更多功能,因为其结果是材料清单更少,设计风险更小且占地面积更小。一个很好的例子是Wi-Fi微控制器(MCU),它将Wi-Fi与处理器和GPIO集成在一起,以满足各种应用程序...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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