自学Cortex-M3(2):按键实验
有输出总会有输入,今天测试一下按键的功能,第一节已经说过了与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
**********************************************************************************/
#includemain.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倍频,关
- 现代通信系统与DSP实验平台(07-12)
- AT89S51单片机实验系统的开发与应用(06-21)
- 基于VRML和JavaScript的数码摄影虚拟实验系统的设计与实现(09-20)
- 通信系统原理技术与DSP实验平台的研制(06-06)
- Linux基础命令之:实验内容及小结(08-13)
- Linux快速入门之: 实验内容——安装Linux操作系统及小结(08-13)