历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-03-09 来源:eefocus

    有输出总会有输入,今天测试一下按键的功能,第一节已经说过了与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中有关于数据类型的定义,有兴趣的可以打开看看。


推荐阅读

史海拾趣

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。
Grand Halo Technology Co Ltd公司的发展小趣事
如开机自检、按键去抖等。
微芯(CMOSIC)公司的发展小趣事

随着全球化的加速发展,微芯生物也积极开展国际合作与交流。他们与国际知名医药企业、科研机构以及高校建立了紧密的合作关系,共同开展新药研发和技术创新。通过国际合作与交流,微芯生物不仅吸收了国际先进的研发理念和技术经验,还为公司的发展带来了更广阔的市场空间和合作机会。

HALO Electronics公司的发展小趣事

为了进一步提升研发实力和市场竞争力,微芯生物开始了并购之路。他们先后收购了多家在生物医药领域具有优势的企业,包括专注于生物制品生产和销售的企业、创新药物研发企业以及提供全方位生物医药研发生产外包服务的企业等。通过并购整合,微芯生物不仅增强了自身的研发实力和市场占有率,还进一步完善了公司的产业链和战略布局。

ELINA INDEK公司的发展小趣事

随着技术的成熟和市场的扩大,因美纳开始积极拓展全球市场。公司通过与全球各地的经销商建立合作关系,将产品销往世界各地。同时,因美纳还在多个国家和地区设立了研发中心和生产基地,以便更好地满足当地市场的需求。这种全球化战略不仅为公司带来了更多的市场机会,也提高了公司的国际影响力。

(注意:由于篇幅限制,此处仅提供三个故事的梗概,每个故事的实际字数可能稍少于500字。同时,由于"ELINA INDEK"并非真实存在的公司,因此以下故事均基于因美纳公司的发展情况进行编写。)

HEC Inc公司的发展小趣事

在电子行业中,技术变革日新月异,市场竞争异常激烈。面对这些挑战,因美纳始终保持着敏锐的洞察力和灵活的反应能力。公司不断调整产品策略和市场布局,积极应对行业变革。同时,因美纳还注重培养员工的创新能力和团队协作精神,为公司的发展提供源源不断的动力。

问答坊 | AI 解惑

第十届深圳国际汽车展览会

展会名称: 第十届深圳国际汽车展览会 开展日期: 2006-8-9 结束日期: 2006-8-13  展览场馆: 深圳会展中心  举办单位: 中国机械设备集团公司   展览产品范围: 汽车 ...…

查看全部问答>

开关集成电路TL494

开关集成电路TL494 中文资料…

查看全部问答>

<计算机组成原理>小弟问一个DRAM存储器的问题

题目:说明1M×1位DRAM片子的刷新方法,刷新周期定为8ms。 解答:如果选择一个行地址进行刷新,刷新地址为A0——A8,因此这一行上的2048个存储元同时进行刷新,即在8ms内进行512个周期的刷新。按照这个周期数,512×2048=1048567,即对1M位的存 ...…

查看全部问答>

K9F1208U0B与K9F1208U0C有什么区别么?

我的平台上用的NAND FLASH,型号是K9F1208U0B,我想更换为U0C,不知两者有何区别。…

查看全部问答>

菜鸟的紧急求助~~CPU的问题

        某系统8088CPU地址总线20条,数据总线8条,存储器系统由8KB的ROM(用2K*8位的2716芯片)和1KB的RAM(用1K*4位的2142芯片)组成,译码器采用74LS138。要求: 画出CPU和存储器的连接图; 确定地址范围(ROM处于低地址, ...…

查看全部问答>

急!!!!求救

那位好心人有HEW的使用说明什么的。我以前没用过这个编译器。 誰知道怎么用阿。谢谢阿~~~~万分感激。。。…

查看全部问答>

崩溃啊..为什么一加入NVIC.串口就不能工作了

以前一直回避串口中断,这次回避不了了,,找了好多例程.没有用库写的.就自己写写看,结果,一加入NVIC,debug就会在串口中断那晃悠..郁闷.. NVIC是这样写的 void NVIC_Configuration(void) {   NVIC_InitTypeDef NVIC_InitStructure; ...…

查看全部问答>

filter_solutions 13.2.5 滤波器设计软件

本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 很好用的滤波器设计软件。。。  …

查看全部问答>