嵌入式实验报告
学 院: 专 业:
班 级: 姓 名: 学 号: 指导老师:
第 1 页
实验一 系统节拍定时器实验
【实验目的】
(1) 掌握LPC1768芯片的使用 (2) 在开发平台上开发第一个程序 (3) 熟悉lpc1768的GPIO控制
【实验内容】
控制开发平台的蜂鸣器周期性(1秒)交替鸣叫。
【实验原理】
【原理图】
【实验步骤】
1使用Realview MDK创建一个新的工程,经过一系列配置后 2新建一个文件,点击File 菜单下的New。输入代码,点击保存 3 对工程进行配置完成以后,编译、链接、下载到开发板上 程序代码
#include \"LPC17xx.h\"
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define BEEP (1ul <<26) uint32_t GulSystick = 0; uint32_t GucDelay1S = 0;
/****************************************************************
第 2 页
*****************************************
** Function name: myDelay ** Descriptions: 软件延时 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无
*********************************************************************************************************/
//void myDelay (uint32_t ulTime) //{
// uint32_t i;
//while (ulTime--) {
// for (i = 0; i < 5000; i++); //} //}
/*********************************************************************************************************
** Function name: GPIOInit ** Descriptions: GPIO初始化 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无
*********************************************************************************************************/
void GPIOInit( void ) {
LPC_PINCON->PINSEL1 &= ~(0x3 << 20); /* 将P0.26初始化为GPIO功能 */
LPC_GPIO0->FIODIR |= BEEP; /* 将P0.26方向设置为输出 */
LPC_GPIO0->FIOSET |= BEEP; /* 将P0.26初始化输出高电平 */
}
/*********************************************************************************************************
** Function name: SysTick_Handler
** Descriptions: 系统节拍定时器中断服务函数 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无
*********************************************************************************************************/
void SysTick_Handler(void) {
第 3 页
if (GulSystick++ >= 99)
{ /* 配置一秒的延时 */
GulSystick = 0; GucDelay1S = 1; } }
/*********************************************************************************************************
** Function name: main
** Descriptions: 系统节拍定时器例程。短接P0.26与BEEP,启动程序,蜂鸣器隔1秒交替鸣叫
** input parameters: 无 ** output parameters: 无 ** Returned value: 无
*********************************************************************************************************/
int main (void) {
SystemInit(); /* 系统初始化,切勿删除 */
GPIOInit();
SysTick_Config(100000000/100); while (1) {
while(GucDelay1S == 0); GucDelay1S = 0;
LPC_GPIO0->FIOSET |= BEEP;
while(GucDelay1S == 0); GucDelay1S = 0;
LPC_GPIO0->FIOCLR |= BEEP; } }
引脚功能选择寄存器1(PINSEL1 - 0x4002 C004)
PINSEL1寄存器控制端口0高半部分的位功能。仅当引脚选择使用GPIO功能时,FIO0DIR寄存器中的方向控制位才有效。对于其它功能来说,方向是自动控制的。对于100引脚封装,引脚功能选择寄存器1的位功能描述如表所述。
第 4 页
【实验现象】
将程序下载到开发板上之后,关闭开发板开关,然后打开,可以听见蜂鸣器每一秒钟会响一次。
【实验心得和体会】
通过这次实验我们大致掌握LPC1768芯片的使用,熟悉了lpc1768的GPIO
的控制。学会配置引脚功能寄存器PINSEL,当引脚配置为GPIO功能时,GPIO的方向位有效。
第 5 页
实验二、 GPIO控制实验
【实验目的】
1、学习LPC系列处理器GPIO口的使用方法; 2、学习用Keil软件开发ARM程序方法和步骤。
3、理解基于ARM内核的LPC1768实验开发平台的管脚链接及原理。
【实验要求】
1、了解LPC系列处理器GPIO口的功能原理; 2、在Keil中设计ARM程序,实现对流水灯的控制; 3、下载到实验平台,并成功运行。
4、附加要求:实现LED的各种不同移动、闪烁效果
【实验内容操作步骤】
1、启动keil新建工程。
2、新建C源文件,添加到工程,编写C文件。 3、配置生成目标。 4、编译连接工程。 5、JTAG调试。
【实验原理】
1、 LPC系列处理器GPIO口的原理 PINSEL(x) 管脚功能选择寄存器 IOPIN(x) GPIO引脚值寄存器 IOSET(x) GPIO输出置位寄存器 IODIR(x) GPIO方向控制寄存器 IOCLR(x) GPIO输出清零寄存器 2、实验电路原理图
实验电路的连接如下图,4个LED是利用LPC1368的GPIO口的P1.14到P1.17来控制的。引脚输出高电平则LED点亮,输出低电平则LED熄灭(因为LED的另一端接地)。
第 6 页
对管脚的操作实际上就是对控制管脚寄存器的操作,所以可以通过对管脚寄存器的操作,实现管脚的不同输出(即高低电平),从而控制LED的状态(亮、灭)。
程序代码
#include \"LPC17xx.h\" volatile uint32_t msTicks; /* counts 1ms timeTicks */ void SysTick_Handler(void) {
msTicks++; /* increment counter necessary in Delay() */ }
__INLINE static void Delay (uint32_t dlyTicks) { uint32_t curTicks;
curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks); }
__INLINE static void LED_Config(void) {
LPC_GPIO2->FIODIR = 0x000000ff; /* LEDs PORT2 are Output */ // LPC_GPIO0->FIODIR = 0x00200000; // LPC_GPIO0->FIOPIN |= 0x00200000; }
/*------------------------------------------------------------------------------
Switch on LEDs
*------------------------------------------------------------------------------*/
__INLINE static void LED_On (uint32_t led) {
LPC_GPIO2->FIOPIN |= (led); /* Turn On LED */ }
/*------------------------------------------------------------------------------
Switch off LEDs
第 7 页
*------------------------------------------------------------------------------*/
__INLINE static void LED_Off (uint32_t led) {
LPC_GPIO2->FIOPIN &= ~(led); /* Turn Off LED */ }
/*----------------------------------------------------------------------------
MAIN function
*----------------------------------------------------------------------------*/
int main (void) { uint8_t location;
if (SysTick_Config(SystemCoreClock / 1000)) { /* Setup SysTick Timer for 1 msec interrupts */ //SystemCoreClock
while (1); /* Capture error */ }
LED_Config();
while(1) {
LED_On (0xff); Delay (500); LED_Off(0xff);
for(location=0;location<8;location++) {
LED_On ((1< 将这个程序下载到开发板上调试之后,可以看到led灯从第一个开始到第八个依次点亮,就像是流水一般。 【实验心得和体会】 通过此次试验,学习了LPC系列处理器GPIO口的使用方法,了解LPC系列处理器GPIO口的功能原理;实验成功看到流水灯现象,对原理做出了验证;通过实验理解了基于ARM内核的LPC1768实验开发平台的管脚链接及原理。 第 8 页 实验三 外部中断实验 【实验目的】 1、 掌握NVIC的设置。 2、 掌握外部中断引脚功能设置级外部中断工作模式设置。 3、了解中断服务函数的编写。 【实验要求】 4、了解LPC系列处理器外部中断的功能原理; 5、在Keil中设计ARM程序,实现外部中断; 6、 按压INT0键(SW2)每按一次LED灯将左移一位 【操作步骤】 1、启动keil新建工程。 2、新建C源文件,添加到工程,编写C文件。 3、配置生成目标。 4、编译连接工程。 5、JTAG调试。 【实验原理】 程序代码 #include \"lpc17xx.h\" volatile uint32_t eint0_counter = 0; uint32_t count = 0; uint32_t i = 0; 第 9 页 /******************************************************************************** * 函数名称 :void EINT0_IRQHandler (void) * 函数功能 : 外部中断0函数入口 * 入口参数 : 无 * 出口参数 : 无 * 备 注 :无 *******************************************************************************/ void EINT0_IRQHandler (void) { LPC_SC -> EXTINT = 1; /* 清中断 */ count = eint0_counter%8 ; i = 1 << count; LPC_GPIO2->FIOSET = i; /*点亮灯第i个灯*/ LPC_GPIO2->FIOCLR = ~i; /*熄灭第i个灯之外的灯*/ eint0_counter++; /* 计数值加1 */ } /******************************************************************************** * 函数名称 :uint32_t EINTInit( void ) * 函数功能 : 外部中断0初始化函数 * 入口参数 : 无 * 出口参数 : 返回TURE或FALSE * 备 注 :如果是返回false则说明中断入口函数没有在中断向量表中建立 *******************************************************************************/ uint32_t EINTInit( void ) { LPC_PINCON -> PINSEL4 = 0x00100000; /*将P2.10脚设置为EINT0即第二功能 */ LPC_GPIOINT -> IO2IntEnF = 0x200; /* 设置为下降沿触发 */ LPC_SC -> EXTMODE = 1; /* 外部中断模式选择为边沿触发 */ LPC_SC -> EXTPOLAR = 0; /* 外部中断1极性设置,此处选默认的 第 10 页 低电平或下降沿 */ NVIC_EnableIRQ(EINT0_IRQn); /* 使能外部中断0 */ return( 1 ); } /******************************************************************************** * 函数名称 :void PortInit(void) * 函数功能 : 端口初始化 * 入口参数 : 无 * 出口参数 : 无 * 备 注 :无 *******************************************************************************/ void PortInit(void) { LPC_PINCON->PINSEL4 &= ~0xCCCC; /*将P2.0~P2.7初始化为GPIO功能 */ LPC_GPIO2->FIODIR |= 0xFF; /* 将P2.0~P2.7方向设置为输出 */ LPC_GPIO2->FIOCLR |= 0xFF; /* 关闭所有的灯 */ } /******************************************************************************** * 函数名称 :int main(void) * 函数功能 : 主函数 * 入口参数 : 无 * 出口参数 : 无 * 备 注 :无 *******************************************************************************/ int main(void) { SystemInit(); /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */ /* 在core_cm3.h中定义*/ PortInit(); /* 端口初始化 */ 第 11 页 EINTInit(); while(1); } 【实验现象】 将程序下载到开发板上之后,按压INT0按键,每按一次led灯就往左移动, 即按第一下的时候第一个led灯亮,按第二个第二个的时候,第二个亮,当第八个灯亮的时候,再按一下第一灯就会点亮。 【实验心得和体会】 通过本次实验进行了NVIC的设置并理解掌握;掌握了外部中断引脚功能设置及外部中断工作模式设置。本次实验的核心是中断服务函数的编写,所以会得到实验操作现象 第 12 页 实验四 串口通讯实验 【实验目的】 1、学习LPC1768处理器UART的使用方法; 2、学习用Keil软件开发ARM程序方法和步骤。 3、了解PC机上超级终端在串口通讯中的使用。 【实验要求】 1、了解LPC系列处理器UART的功能原理; 2、在Keil中设计ARM程序,实现串口通讯; 3、串口接收与发送字符。 串口发送字符串 【操作步骤】 1、启动keil新建工程。 2、新建C源文件,添加到工程,编写C文件。 3、配置生成目标。 4、编译连接工程。 5、JTAG调试。 【实验原理】 1、LPC系列处理器UART的寄存器 RBR 接收缓冲 THR 发送缓冲 IER 中断使能 IIR 中断ID FCR FIFO控制 LCR 线控制 LSR 线状态 SCR 高速缓存 DLL 除数LSB DLM 除数MSB 2、实验电路原理图 实验电路的连接如下图。 第 13 页 程序代码 #include #define FOSC 12000000 // 振荡器频率 #define FCCLK (FOSC * 8) // 主时钟频率<=100Mhz FOSC的整数倍 #define FPCLK (FCCLK / 4) // 外设时钟频 率,FCCLK的1/2、1/4 或与FCCLK相同 int m; //接收到的数据 void Uart2Init(uint32_t bps) { LPC_SC->PCONP |= (1<<24); //打开UART2电源控制位 LPC_PINCON->PINSEL0 = 0X500000; //P0.10 P0.11设置为串口 LPC_UART2->LCR = 0x83; //设置串口数据格式,8位字符长度, 1个停止位,无校验,使能访问除数锁存器 ,设定波特率 LPC_UART2->DLM = ((FPCLK/16)/bps) / 256; //除数高八位 , 没有小数情况 LPC_UART2->DLL = ((FPCLK/16)/bps) % 256; //除数第八位 LPC_UART2->LCR = 0x03; //禁止访问除数锁存器,锁定波特率 LPC_UART2->IER = 0x01; //使能接收中断 NVIC_EnableIRQ(UART2_IRQn); // 使能UART2中断通道 } int Uart2RecvByte(void) 第 14 页 { while(!((LPC_UART2->LSR) & 0x01)); //等待判断LSR[0]是否是1,1时表示RBR中接收到数据 return(LPC_UART2->RBR); //读取接收数据 } int Uart2SendByte(int buf) { while(!((LPC_UART2->LSR) & 0x20)); //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空 LPC_UART2->THR = buf; //发送数据 return 0; } void UART2_IRQHandler(void) { m =Uart2RecvByte(); //读取接收数据 Uart2SendByte(m); //发送接收到的数据 } int main(void) { SystemInit(); Uart2Init(115200); while(1); } 【实验现象】 将程序下载到开发板上以后,打开电脑桌面的串口调试助手,在下面的编辑栏 里敲上几个字符,点击发送,就可以看到串口调试助手上面的方框里出现了你在下方敲的字符。 【实验心得和体会】 通过本次实验我们学习LPC1768处理器UART的使用方法;学习用Keil软 件开发ARM程序方法和步骤。了解PC机上超级终端在串口通讯中的使用。关于串口的配置主要涉及到引脚的配置,波特率的配置,帧格式的设置及FIFO设置。此次实验进行了串口的接收与发送字符,及发送字符串,均能在串口调试助手上成功实现。 第 15 页 因篇幅问题不能全部显示,请点此查看更多更全内容