ARM入门笔记(4)

2010年08月26日 17:25    发布者:绝对好文
第四章 键盘输入

——I/O输入实验

一.实验目的

能够正确读取PIO的管脚状态,实现当有按键按下时,LED点亮,否则灭。

二.实验程序和参数设置

1>连接器选项设置和启动代码都与上个实验相同

2> C语言的代码

#i nclude "AT91SAM7S64.h" //特殊功能寄存器头文件。类似与51单片机中reg51.h
#i nclude "Board.h"   //定义目标板的头文件
int main(void)
{ unsigned int Key_Val;  //定义变量,unsigned int为32位,C51是16位
  *AT91C_PIOA_PER = LED_MASK | SW_MASK;//使能LED、KEY脚I/O口功能   *AT91C_PIOA_ODR = SW_MASK;//使能4个KEY对应管脚的输入功能
*AT91C_PIOA_OER = LED_MASK;//使能4个LED管脚的输出功能
  while (1)
  {
   Key_Val = *AT91C_PIOA_PDSR;//读管脚的电平状态
   if (Key_Val & SW1)
   {
  *AT91C_PIOA_SODR = LED1;//将状态反映给LED
}
   else
{
*AT91C_PIOA_COER = LED1;//按钮按下时,LED1亮
}
}
}

三.出现的问题与解决方法

1> 无论作输入用的I/O口电平如何变化,管脚状态寄存器(AT91C_PIOA_PDSR)的内容始终为0,即I/O口的输入功能没起作用。
原因是AT91SAM7Sxx内部集成了功率管理控制器,用它来控制所有外设的时钟以达到优化功耗的目的。所以只有使能了PIO的外围时钟,PIO外设才会工作,才能读入输入管脚的状态。那么为什么PIO作为输出时不需要使能外围时钟呢?我个人认为这与内部外设在数字电路上的实现有关,输出功能只需要组合逻辑电路(不用时钟)就能实现,而输入功能则需要用到时序逻辑电路(需要时钟)才能实现。
因此,必须在main()函数的开头增加如下两条时钟使能的语句:

*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟
*AT91C_PMC_PCER = 1 91C_ID_PIOA; //使能PIOA外围时钟

四.总结

当要使AT91SAM7S64特定的外设工作时,必须使能相应外设的时钟控制寄存器。相反,如果不用相应的外设,禁能相应的时钟可以降低功耗。

网友评论

长话短说 2010年09月04日
谢了