ARM课程设计报告GPIO—流水灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81//从两边叠加后递减
};
int main (void)
{
uint8 i;
//PINSEL1 = 0x00000000;//设置管脚连接GPIO
PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
图2
流水灯程序:
/
#include "config.h"
/* LED8~LED1 8个LED分别由P1.25~P1.18控制*/
const uint32 LEDS8 = (0xFF << 18);// P1[25:18]控制LED8~LED1,低电平点亮
/*
*********************************************************************************************************
SSPCR1 = (0x00 << 3) | // SOD从机输出禁能,1=禁止,0=允许
(0x00 << 2) | // MS主从选择,0=主机,1=从机
(0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
(0x00 << 0); // LBM回写模式
SSPCPSR = 0x52; // PCLK分频值
一、设计目的………………………………………………3
二、设计原理
1、GPIO—流水灯……………………………………3
2、SPI…………………………………………………7
3、定时器………………………………………………10
4、实时时钟……………………………………………12
三、所用仪器…………………………………………………18
(1)LPC2131具有多达47个通用I/O口(GPIO,General Purpose I/O ports),分别为P0[31:0]、
P1[31:16],其中,P0.24未用,P0.31仅为输出口。由于口线与其它功能复用,因而需要进行相关的管脚连接模块(PINSEL0、PINSEL1、PINSEL2)选择连接GPIO,然后通过IODIR进行输入/输出属性设置后才能操作。
}
}
return 0;
}
2.SPI主机实验-7段数码管显示
实验使用LPC2131的SPI接口作为主机向74HC595发送数据,数据内容由7段数码管显示,同时SPI主机接收74HC595的移位输出数据,即接收回前一个显示数据。
实验硬件连接如图3所示 图3 SPI接口控制74HC595硬件连接图
图中已经将最高位输出(SQH)连接到LPC2131的SPI接口的MISO0,可用来读回74HC595移位输出的数据。该实验演示在7段数码管上显示一些字符,字符的字模表存于一数组中,流程图如图4所示。
// IOSET = SLAVE_CS;
return(SSPDR);
}
uint8 const DISP_TAB[16] = {
//01 2 3 4 5 6 7 8 9
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
//A b C d E F
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E};
}
return(0);
}
3、定时器
(1)LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、比较路匹配并输出电
路。
定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。
// SSPIMSC = 0x07; //中断屏蔽寄存器
SSPICR = 0x03; //中断清除寄存器
}
uint8 SSP_SendData(uint8 data)
{
// IOCLR = SLAVE_CS;//选择从机
SSPDR = data;
while( (SSPSR & 0x01) == 0 );//等待TFE置位,即发送FIFO空
七、参考文献……………………………………………………29
一、设计目的
1、根据要求,复习巩固ARM的基础知识。
2、掌握ARM系统的设计方法,特别是熟悉模块化的设计思想。
3、熟练掌握ARM软件和2131开发板的使用。
4、提高综合运用所学的理论知识独立分析和解决问题的能力;
二、设计原理
1、GPIO—流水灯
*/
/*流水灯花样,低电平点亮,注意调用时候用了取反操作*/
const uint32 LED_TBL[] = {
0x00, 0xFF,//全部熄灭后,再全部点亮
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,//依次逐个点亮
0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF,//依次逐个叠加
所有I/O口在复位后默认为输入。
应用:
通用I/O口
驱动LED或其它指示器
控制片外器件
检测数字输入
(3)GPIO引脚描述
GPIO管脚描述见表4.1。
表4.1 GPIO管脚描述
管脚连接设置
将相应管脚的PINSELn位设置为00,即选择GPIO功能;大部分管脚复位后默认为GPIO。
3、GPIO寄存器
LPC2138有2个32位的通用I/O口。PORT0使用了30个管脚,PORT1有多达16个管脚可用GPIO功能。PORT0和PORT1由2组(4个)寄存器控制,如表4.2所示。
四、EasyARM2131开发套件功能介绍………………………18
五、设计内容:万年历-定时器-流水灯-SPI
1、功能描述………………………………………………21
2、流程图…………………………………………………22
3、程序设计………………………………………………22
六、心得体会……………………………………………………28
// IO0DIR = SLAVE_CS;
// IO0SET = SLAVE_CS;
SSP_Init(); //初始化SSP接口
while(1)
{
for(i=0; i<16; i++)
{
rcv = SSP_SendData(DISP_TAB[i]);//发送显示数据Dela来自NS(80);//延时}
可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为
自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
(2)定时器0定时实验——查询方式
用定时器0实验0.5秒定时,查询标志位等待定时时间到达,对蜂鸣器进行控制,让蜂鸣器每秒钟响一次。
程序在T0MR0中设定定时常数,在T0MCR中设置定时器0匹配后复位TC并产生中断标志,接下来程序查询等待中断标志置位。若定时时间到,先清除Timer0中断标志,然后取反BEEP控制口的输出状态,流程图如图5所示。
表4.2 GPIO寄存器映射
4. GPIO输出实验——流水灯实验
EasyARM2131开发板上的8路LED(LED8~LED1)分别可选择P1[25:18]进行控制,电路如图1所示。
图1
当跳线JP12全部选择LED8~LED1后,P1.25~P1.18分别控制这8路LED,就可以进行流水灯实验。流水灯显示花样可以通过数组人为定义,亦可通过一定的算法计算,流程图如图2所示。
图4 LED数码管显示实验流程图
SPI程序:
#include "config.h"
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<50000; i++);
}
}
void SSP_Init(void)
{
SSPCR0 = (0x01 << 8) | // SCR设置SPI时钟分频
*/
int main (void)
{
PINSEL1 = 0x00000000;/*设置管脚连接GPIO*/
IO0DIR = BEEP;/*设置BEEP控制口输出*/
/*定时器0初始化*/
T0TC = 0;/*定时器设置为0*/
T0PR = 0;/*时钟不分频*/
T0MCR = 0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/
*/
void DelayNS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<100000; i++);
}
/*
*********************************************************************************************************
(0x00 << 7) | // CPHA时钟输出相位,仅SPI模式有效
(0x01 << 6) | // CPOL时钟输出极性,仅SPI模式有效
(0x00 << 4) | // FRF帧格式00=SPI,01=SSI,10=Microwire,11=保留
(0x07 << 0); // DSS数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
当管脚选择GPIO功能时,有IOSET、IOCLR和IOPIN 3个寄存器用于控制GPIO的使用。IOSET用于口线置位,而IOCLR则用于口线清零,IOPIN则反映当前IO口的状态,读回IOSET则反映当前IO口设定状态。
(2)GPIO的特性和应用
特性:
单个位的方向控制;
单独控制输出的置位和清零;
**函数名称:main()
**函数功能:流水灯显示实验。
**调试说明:连接跳线JP12至LED8~LED1。
*********************************************************************************************************
0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01,//依次逐个递减
0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81,//两个靠拢后分开
0xA0, 0x50, 0x7e, 0x28, 0x14, 0x0A, 0x05, 0x82,
volatile uint8 rcv;
int main(void)
{
uint8 i;
PCONP |= 1<<10;
// PINSEL1 = 0x000002A8; //设置SSP管脚连接
//PINSEL1 = 0xAA << 2;
PINSEL1 = (PINSEL1 & (~(0xFF << 2))) | (0xAA << 2);
图5定时器0定时实验流程图
定时器程序:
/
#include "config.h"
#define BEEP 1 << 7/* P0.7控制蜂鸣器,低电平蜂鸣*/
/*
*********************************************************************************************************
**函数名称:main()
**函数功能:使用定时器实现0.5秒钟定时,控制蜂鸣器鸣叫。
**调试说明:需要将跳线JP11连接BEEP。
*********************************************************************************************************
**函数名称:DelayNS()
**函数功能:长软件延时
**入口参数:dly延时参数,值越大,延时越久
**出口参数:无
*********************************************************************************************************
IO1DIR = LEDS8;//设置LED1控制口为输出
while (1)
{
for (i=0; i<42; i++)
{/*流水灯花样显示*/
IO1SET = ~((LED_TBL[i]) << 18);
DelayNS(20);
IO1CLR = ((LED_TBL[i]) << 18);
DelayNS(20);
相关文档
最新文档