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特定的外设工作时,必须使能相应外设的时钟控制寄存器。相反,如果不用相应的外设,禁能相应的时钟可以降低功耗。 |
网友评论