ARM入门笔记(4)

发布时间:2010-8-26 17:25    发布者:绝对好文
关键词: ARM入门笔记
第四章 键盘输入

——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特定的外设工作时,必须使能相应外设的时钟控制寄存器。相反,如果不用相应的外设,禁能相应的时钟可以降低功耗。
本文地址:https://www.eechina.com/thread-23769-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
长话短说 发表于 2010-9-4 11:28:31
谢了
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表