ARM嵌入式GPIO接口实验

更新时间:2023-03-09 20:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《嵌入式系统原理与应用B》课程实验报告

ARMGPIO实验

要求完成的主要实验

GPIO实验(输入扫描按键、输出控制灯、定时器综合) 说明:标注完成的实验,未完成的给予说明

专业名称:通信工程 班级:1510班 学生姓名:石龙飞

学号(8位): 03151307 指导教师:刘钊远

一、 实验目的

1、熟悉了解单片机,以EasyARM2131为例,观察其板子的设计、模块、芯片、以及有哪些接口。

2、熟练掌握如何连接单片机和电脑,使其能够对单片机进行烧录程序。 3、熟练掌握Keil4的使用,学会用Keil4为单片机烧录程序。

4、掌握Keil4的编程方法、调试、以及各项参数的设置,如何选择与硬件相匹配的仿真环境。 5、用C语言编程,学习如何控制单片机的各个部件工作,比如控制蜂鸣器鸣叫,控制LED闪烁,控制定时器计数,控制按键的输入等等。

6、深刻理解中断以及定时器的工作方法和原理,以及如何在程序中他们进行编程设置。

二、 实验内容

1、编程实现对单片机上6个LED灯的控制,要求实现不同的花型变化,以及不同的变换间隔。

2、编程实现输入,通过对单片机上的按键进行扫描来获得输入,用这个输入来进行不同的操作。

3、通过定时器中断来进行计时,模拟操作系统的时钟周期,来以特定的时间间隔执行不同的任务。

三、 实验主要步骤

1、将单片机和下载器以及电脑连接好,安装好驱动程序。 2、使用keil4首先建立或者打开一个工程,设置好keil的各个参数使其编译环境与我们使用的单片机相匹配。

3、使用C语言设计、编写程序,并进行编译调试,找到代码中的语法以及一些逻辑错误。

4、将写好的、经过编译没有语法和逻辑错误的程序通过keil烧录到单片机中,再对单片机进行操作,验证结果。

四、 实验代码

#include \#include \ extern void IRQEnable(void); extern void IRQDisable(void); extern void FIQEnable(void); extern void FIQDisable(void); // 外设时钟频率 #define Fpclk 11059200 // P0.7控制BEEP,低电平蜂鸣 #define BEEP 1 << 7 // P1[25:18] 对应控制 LED8~LED1, 低电平---点亮 #define LEDS8 0xFF << 18 // KEY[6:1] connect to P0[21:16], 0---be pushed #define KEY1 1<<16 #define KEY2 1<<17 #define KEY3 1<<18 #define KEY4 1<<19 #define KEY5 1<<20 #define KEY6 1<<21 #define KEYS 0x3f<<16 uint8 CURRENT_KET_VALUE = 0; uint32 I_LED; const uint32 LED1[]={0x01<<18,0x01<<19,0x01<<20,0x01<<21,0x01<<22,0x01<<23,0x01<<24,0x01<<25, 0x01<<25,0x01<<24,0x01<<23,0x01<<22,0x01<<21,0x01<<20,0x01<<19,0x01<<18 }; const uint32 LED2[]={0x01<<18,0x03<<18,0x07<<20,0x01<<21,0x01<<22,0x01<<23,0x01<<24,0x01<<25}; const uint32 LED3[]={0x01<<18,0x01<<19,0x01<<20,0x01<<21,0x01<<22,0x01<<23,0x01<<24,0x01<<25, 0x01<<25,0x01<<24,0x01<<23,0x01<<22,0x01<<21,0x01<<20,0x01<<19,0x01<<18 }; //设置全局计数器 uint32 COUNTER = 0; void initTimer0(uint32 time); void initLED(void); uint8 getKeyValue(void); void oneWaterLight1(uint32 I_LED); void oneWaterLight2(uint32 I_LED); // 中断处理程序 void __irq IRQ_Timer0 (void) { // 经初始化后,每过10msCOUNTER加一,当COUNTER到100,也就是1s的时候,置COUNTER0 if(COUNTER == 100) COUNTER = 0; COUNTER++; // 清除 EINT0---中断标志 T0IR = 0x01; // 通知VIC中断处理结束 VICVectAddr = 0x00; } void oneWaterLight3(uint32 I_LED){ } // 一个流水灯单向跑 void oneWaterLight2(uint32 I_LED){ IO1SET = LEDS8; IO1CLR = LED2[I_LED%8]; } // 一个流水灯来回跑 void oneWaterLight1(uint32 I_LED){ IO1SET = LEDS8; IO1CLR = LED1[I_LED]; } // 扫描按键,获取键值,按下则返回按下的键,没有按下返回0 uint8 getKeyValue(void){ volatile uint32 Vkey=0; uint8 keyValue = 0; Vkey = (IO0PIN & KEYS); if((Vkey & KEY1) == 0) keyValue=1; else if ((Vkey & KEY2) == 0) keyValue=2; else if ((Vkey & KEY3) == 0) keyValue=3; else if ((Vkey & KEY4) == 0) keyValue=4; else if ((Vkey & KEY5) == 0) keyValue=5; else if ((Vkey & KEY6) == 0) keyValue=6; return keyValue; } void initLED(void){ PINSEL2 &= (~0x08); IO1DIR = LEDS8; IO1SET = LEDS8; } void initTimer0(uint32 time){ // IRQ中断使能 IRQEnable(); // 定时器0初始化 // 定时器0---使能、复位 T0TCR = 0x03; // 时钟不分频 T0PR = 0; // P1[25:16] used as GPIO // Config P[25:16] GPIO & Output // 设置T0MR0匹配后复位T0TC,并产生中断标志 T0MCR = 0x03; // 1/time秒钟定时 --- 匹配目标值 T0MR0 = (Fpclk)/time; // 启动定时器0 T0TCR = 0x01; // 设置定时器0中断IRQ // 所有中断通道设置为IRQ中断 VICIntSelect = 0x00; // 设置定时器0中断通道分配到 VIC_slot_0 VICVectCntl0 = 0x20 | 0x04; // 设置中断服务程序地址 VICVectAddr0 = (uint32)IRQ_Timer0; // 使能定时器0中断 VICIntEnable = 1 << 0x04; } void main (void)

本文来源:https://www.bwwdw.com/article/228a.html

Top