一品文秘网 - www.sdelec.cn 2025年07月23日 03:33 星期三
当前位置 首页 >专题范文 > 公文范文 >

gpio输出控制实验报告流水灯(4篇)

发布时间:2023-01-06 14:25:06 来源:网友投稿

gpio输出控制实验报告流水灯(4篇)gpio输出控制实验报告流水灯  实验二  一、实验目的:  1.正确安装keil软件  IO口实现LED灯闪烁  2.正确安装调试驱动,熟悉实验板的用法3.学习IO下面是小编为大家整理的gpio输出控制实验报告流水灯(4篇),供大家参考。

gpio输出控制实验报告流水灯(4篇)

篇一:gpio输出控制实验报告流水灯

  实验二

  一、实验目的:

  1.正确安装keil软件

  IO口实现LED灯闪烁

  2.正确安装调试驱动,熟悉实验板的用法3.学习IO口的使用方法。

  二、实验设备:

  单片机开发板、学生自带笔记本电脑

  三、实验内容:

  利用单片机IO口做输出,接发光二极管,编写程序,使发光二极管按照要求点亮。

  四、实验原理:

  1.LPC1114一共有42个GPIO,分为4个端口,P0、P1、P2口都是12位的宽度,引脚从Px.0~Px.11,P3口是6位的宽度,引脚从P3.0~P3.5。引脚的内部构造如图所示。其中Rpu为上拉电阻、Rpd为下拉电阻。

  2.为了节省芯片的空间和引脚的数目,LPC1100系列微处理器的大多数引脚都采用功能复用方式,用户在使用某个外设的时候,要先设置引脚。控制引脚设置的寄存器

  称之为IO配置寄存器,每个端口管脚PIOn_m都分配一个了一个IO配置寄存器IOCON_PIOn_m,以控制管脚功能和电气特性。3.IOCON_PIOn_m寄存器其位域定义如表所列。

  位域符号描述

  选择管脚功能000:选择功能1001:选择功能2(如果未定义功能2,则保留)2:0FUNC010:选择功能3(如果未定义功能3,则保留)011:选择功能4(如果未定义功能4,则保留)100~111:保留

  选择功能模式(片内上拉/下拉电阻控制)00:无效模式(无上拉和下拉电阻被允许)4:3MODE01:允许下拉电阻10:允许上拉电阻11:中继模式

  滞后模式5HYS1:禁止0:允许

  6

  -

  保留,复位值为1

  选择模拟/数字模式(无AD功能,则保留,复位值为1)7ADMODE0:模拟输入模式1:数字功能模式

  选择为I2C模式9:8I2CMODE00:标准I2C模式/快速I2C模式(默认)01:标准I/O功能

  10:FM+I2C模式11:保留

  31:8

  -

  保留,复位值为0

  4.各引脚IOCON寄存器的位[2:0]配置不同的值所相应功能。

  5.GPIO寄存器GPIO数据寄存器用于读取输入管脚的状态数据,或配置输出管脚的输出状态,表5-5对GPIOnDATA寄存器位进行描述。

  位11:031:12

  符号DATA-

  访问R/W-

  描述管脚PIOn_0~PIOn_11输入数据(读)或输出数据(写)保留

  GPIO的数据方向的设置是通过对GPIOnDIR寄存器的位进行与或操作实现的,LPC1100微处理器和8051单片机的GPIO不同,在使用前一定要先设置数据方向才能使用,

  位符号访问值011:0IOR/W131:12引脚PIOn_0~PIOn_11配置为输出保留描述引脚PIOn_0~PIOn_11配置为输入

  6.发光二级管的工作电压和工作电流如何?_______________________________________________________________________________________________________________________________________________________________________________________________________________________________。7.发光二极管的限流电阻如何计算?__________________________________________________________________________。

  五、实验原理图:

  六、实验步骤:

  一、基本要求1、默写发光二极管闪烁程序。二、扩展要求1.查找关于呼吸灯的资料,弄懂呼吸灯工作原理。2.自行编写呼吸灯代码,在实验板子上面验证。

  七、程序框图:八、供参考程序:

  /*************************************************************************/#include"LPC11XX.H"//头文件#defineLED1_ON()(LPC_GPIO1->DATA&=~(1<<0))//点亮连接到P1.0的LED#defineLED1_OFF()(LPC_GPIO1->DATA|=(1<<0))//熄灭连接到P1.0的LED#defineLED2_ON()(LPC_GPIO1->DATA&=~(1<<1))//点亮连接到P1.1的LED#defineLED2_OFF()(LPC_GPIO1->DATA|=(1<<1))//熄灭连接到P1.1的LED/***************************************************************************FunctionName:Delay()*Description:延时函数*EntryParameter:None*ReturnValue:None**************************************************************************/voidDelay()

  {uint16_ti,j;for(i=0;i<5000;i++)for(j=0;j<200;j++);}/***************************************************************************FunctionName:LedInit()*Description:初始化LED引脚*EntryParameter:None*ReturnValue:None**************************************************************************/voidLedInit(void){LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCON时钟LPC_IOCON->R_PIO1_0&=~0x07;LPC_IOCON->R_PIO1_0|=0x01;//把P1.0脚设置为GPIOLPC_IOCON->R_PIO1_1&=~0x07;LPC_IOCON->R_PIO1_1|=0x01;//把P1.1脚设置为GPIOLPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON时钟LPC_GPIO1->DIR|=(1<<0);//把P1.0设置为输出引脚LPC_GPIO1->DATA|=(1<<0);//把P1.0设置为高电平LPC_GPIO1->DIR|=(1<<1);//把P1.1设置为输出引脚LPC_GPIO1->DATA|=(1<<1);//把P1.1设置为高电平}/***************************************************************************FunctionName:main()*Description:主函数*EntryParameter:None*ReturnValue:None**********************************************************************/intmain(void){LedInit();while(1){Delay();LED1_ON();LED2_OFF();Delay();LED1_OFF();LED2_ON();}}

篇二:gpio输出控制实验报告流水灯

  .-

  嵌入式系统应用实验报告

  姓名:学号:学院:专业:班级:指导教师:

  .-

  实验1、流水灯实验

  1.1实验要求

  编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。

  1.2原理分析

  实验主要考察对STM32F10X系列单片机GPIO的输出操作。参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。

  由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。反之,LED灯熄灭。

  1.3程序分析

  软件方面,在程序启动时,调用SystemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。

  GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO时钟:

  RCC_APB2PeriphClockCmd(GPIO_CLK[Led],ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:

  .-

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led],&GPIO_InitStructure)。初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。实验程序流程图如下:

  硬件方面,根据实验指南,将实验板做如下连接:

  1.3实验结果

  .-

  实验二、按键实验

  2.1实验要求

  利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。

  2.2原理分析

  实验主要考察对STM32F10X系列单片机GPIO外部中断功能的使用。STM32F107VCT一共有5组GPIO,分别是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0]、PE[15:0]。STM32的所有GPIO都可以作为中断输入源,单片机通过复用的方式使其对处理器来说来自GPIO的一共有16个中断Px[15:0]。具体实现是PA[0]、PB[0]、PC[0]、PD[0]和PE[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1]和PE[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15]和PE[15]共享一个GPIO中断。以下图片为以EXTI0为例的外部中断/事件线路映像:

  要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写‘1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置‘1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

  要把IO口作为外部中断输入,有以下几个步骤:(1)初始化IO口为输入。这一步设置要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。(2)开启IO口复用时钟,设置IO口与中断线的映射关系。STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。(3)开启与该IO口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意

  .-

  电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

  (4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。

  (5)编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃。所以在开启了某个中断后,应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作,并很据情况判断是否要对中断产生的标志位进行清零。

  由原理图可知,按键未按下时,GPIO读到的为高电平,按键按下后,IO口接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。

  2.3程序分析LED灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化,

  初始化函数为GPIO_KEY_Config()(见附录4),配置过程与实验一中GPIO配置基本一致。由于此处GPIO需要采集外界按键信号,故GPIO模式应该为调整为内部上拉电阻输入

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU。然后执行GPIO中断初始化函数KEY_EXIT_Init()(见附录5),首先将连接按键的IO口与EXTI线链接到一起:GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE);然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断:EXTI_InitStructure.EXTI_Line=GPIO_KEY1_EXTI_LINE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure)。之后进行中断分组配置及中断优先级配置,函数为InterruptConfig()(见附录6)。

  .-

  配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所有外部中断归为NVIC_PriorityGroup_2,即2位抢占优先级和2位响应优先级:

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);然后将所有外部中断信号的抢占优先级规定为0、1、2,使其可以相互区别,并将配置好的参数写入对应寄存器中,完成配置:NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY1_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY2_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY3_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_Init(&NVIC_InitStructure)。初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中断服务函数EXTI9_5_IRQHandler()(见附录7)中。在函数中对LED灯进行点亮、熄灭操作,并重置中断产生标志位。实验流程图如下(主函数代码见附录8):

  硬件连接方式如下图所示:

  .-

  2.3实验结果

  .-

  实验三、定时器实验

  3.1实验要求

  利用STM32的通用定时器TIM5产生一个1S的中断,在中断函数中实现LED1、LED2、LED3、LED4同时翻转的效果。

  3.2原理分析

  实验主要考察对STM32F10X系列单片机定时器的使用。实验中使用的STM32F107单片机有多达10个定时器,包括:◇多达4个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入◇1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器◇2个独立的看门狗定时器(独立的和窗口型的)◇系统时间定时器:24位自减型计数器◇2个16位基本定时器用于驱动DAC

  根据时钟树可知,系统时钟经过分频之后,进入TIM5的时钟模块入口,在经过预分频处理,才供给TIM5作时钟使用。预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时表示不分频,则TIM5定时器的时钟用CK_CNT=模块入口时钟72MHz;当TIMx_PSC=1时表示不分频,则TIM5定时器的时钟用CK_CNT=模块入口时钟36MHz;以此类推。公式为:CK_CNT=fCK_PSC/(PSC[15:0]+1),其中PSC最大为65535。其次是TIM5计数器计数值的设置,TIM5计数器以CK_CNT为时钟计数,向下计数到0或向上计数到设定值(TIMx_ARR)则产生中断。以向上计数为例,从0开始计数到设定值TIMx_ARR时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频的值=系统时钟72MHz,其中计数器的值和预分频值都必须小于65535。我们使预分频值为7200,计数器值为10000,则7200*10000=72,000,000即72M。其中拆分方法很多35000*2000=72,000,000,只要注意计数器的值和预分频值都必须小于65535即可。当计数值溢出后,会改变计数溢出标志位,并产生定时器中断,实验中使用其产生中断来进行LED灯翻转。

  3.3程序分析

  LED初始化部分与实验一相同,完成初始化后,点亮所有LED灯。定时器配置函数为TIM5_Init()(见附录6)。配置函数首先使能计数器时钟:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

  .-

  然后自动装载计数值,计数从0开始:TIM_TimeBaseStructure.TIM_Period=(100-1);再对计时器进行预分频系数设置:TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);并将计数器设置为向上计数:TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;最后写入计时器配置寄存器,完成配置:TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure)。配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开始计数。

  TIM_ClearITPendingBit(TIM5,TIM_IT_Update);TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);TIM_Cmd(TIM5,ENABLE)。定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为NVIC_Configuration()(见附录7)。函数首先将中断向量表首地址置于0x08000000:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000);然后使能TIM5中断:NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;最后将配置参数写入中断控制寄存器,完成配置:NVIC_Init(&NVIC_InitStructure)。一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler()(见附录8)中进行处理。在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录9),实现了LED的闪烁。程序流程图如下:

  .-

  硬件连接方式如下图所示:

  .-

  实验四、按键中断控制LED灯定时闪烁

  4.1实验要求

  综合实验一、二、三,利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1控制LED1以1S为间隔,闪烁3次,SKEY2控制LED2以2S为间隔闪烁3次,SKEY3控制LED3以3S为间隔,闪烁3次。

  4.2原理分析

  实验需要用到STM32的GPIO输入输出操作,GPIO外部中断和内部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。

  此实验需要将以上实验做综合,并对时序进行调整。难点为,对GPIO外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。

  这里的使用的方法是,将所有按键外部中断置于中断分组2,即NVIC_PriorityGroup_2中。将所有按键中断抢占优先级置为0,即最高级别中断,响应优先级置分别置为1、2、3,相互区别。将定时器中断抢占优先级置为1,相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED闪烁状态。

  4.3程序分析

  这在程序初始化阶段,分别对LED、按键外部中断和定时器中断进行初始化。主函数如下:

  intmain(void){

  /*LED初始化*/LED_config();

  /*LED闪烁¸*/Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();

  /*按键初始化*/GPIO_KEY_Config();

  /*按键外部中断初始化*/KEY_EXIT_Init();

  /*外部中断向量初始化*/

  .-

  InterruptConfig();/*定时器5初始化*/TIM5_Init();/*定时器中断初始化*/NVIC_Configuration();/*等待中断触发*/while(1){}}初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部中断服务函数,函数中将判断哪一个按键被按下,记录按下的按键,然后给定时器清零并开始计数,且清零外部中断标志位。

篇三:gpio输出控制实验报告流水灯

  实验四:GPIO输出控制实验

  一、实验目的1.掌握LPC21XX专用工程模板的使用;2.掌握EasyJTAG仿真器的安装和使用;3.能够在EasyARM21XX开发板上运行第一个程序(无操作系统);4.熟悉LPC2000系列ARM7微控制器的GPIO控制。二、实验设备硬件:PC机一台、EasyARM2103开发板一套软件:Windows98/XP/2000系统,ADS1.2集成开发环境三、实验内容

  控制EasyARM2103开发板上的LED闪烁形成流水灯效果。四、实验预习要求

  仔细阅读《EasyARM2103》手册第4章的内容,熟悉GIPO的设置。仔细阅读《EasyARM2103》第2章的内容,了解EasyARM2103开发板的硬件结构,注意LED灯的相关控制电路。仔细阅读《EasyARM2103》第3章的内容,了解ADS1.2集成开发环境、LPC2200专用工程模板、EasyJTAG仿真器的应用。五、实验原理如何在EasyARM2103上运行第一个程序。安装ADS1.2(PC)了解ADS1.2(PC)连接EasyJTAG仿真器和EasyARM2103开发板(硬件)安装EasyJTAG驱动程序(PC)添加工程模板(PC)用工程模板建立第一个工程(PC)仿真调试第一个工程(PC+硬件)说明:(PC)----------------属于在PC机上操作,即软件的操作(硬件)--------------属于开发板硬件操作(PC+硬件)--------属于在PC机上进行软件操作,硬件上要连接或跳线操作六、实验步骤1.连接EasyJTAG仿真器和EasyARM2103开发板,然后安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略)。2.为ADS1.2增加LPC2103专用工程模板(若已增加过,此步省略)。3.启动ADS1.2,使用ARMExecutableImageforlpc2103工程模板建立一个工程BeepCon_C。4.建立C源文件BeepCon.c,编写实验程序,然后添加到工程的user组中。5.选用DebugInRAM生成目标,如图3.9所示,然后编译连接工程。

  图3.9选择生成目标

  6.将EasyARM2103开发板上的JP4跳线短接。

  7.选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。

  8.全速运行程序,程序将会在beepcon.c的主函数中停止(因为main函数起始处默认设置

  有断点)。

  9.单击ContextVariable图标按钮(或者选择【ProcessorViews】->【Variables】)打开变量观

  察窗口,通过此窗口可以观察局部变量和全局变量。选择【SystemViews】->【Debugger

  Internals】即可打开LPC2100系列ARM7微控制器的片内外设寄存器窗口。

  10.可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,观察变量

  的值,判断LED控制是否正确。

  11.实验结束后,在AXD中设置仿真器为片外RAM调试方式的设置,以便于后面实

  验的正确操作。、

  12.更改程序实现流水等的功能,一秒亮一盏灯,从左向右,一直循环。

  七、实验参考程序

  选择低速GPIO,控制LED灯闪烁,示例程序如程序清单4.1所示。此示例操作需要短接

  JP4的P0.17,输出控制LED1。

  程序清单4.1GPIO控制LED闪烁

  #include"config.h"#defineLED11<<17

  /*P0.17控制LED1

  */

  /****************************************************************************

  **函数名称:DelayNS

  **功能描述:延时函数

  **入口参数:uiDly值越大,延时时间越长

  **出口参数:无

  ****************************************************************************/

  voidDelayNS(uint32uiDly)

  {

  uint32i;

  for(;uiDly>0;uiDly--){

  for(i=0;i<50000;i++);

  }

  /***************************************************************************/

  **函数名称:main

  **功能描述:跳线JP4短接,LED1闪烁

  **入口参数:无

  **出口参数:无

  ****************************************************************************/

  intmain(void)

  {

  PINSEL1=PINSEL1&(~(0x03<<2));

  /*将P0.17设置为GPIO*/

  IO0DIR=LED1;

  /*设置LED控制口为输出*/

  IO0SET=LED1;

  /*LED1熄灭

  */

  while(1){

  IO0SET=LED1;

  /*LED1熄灭

  */

  DelayNS(50);

  /*延时

  */

  IO0CLR=LED1;

  /*LED1点亮

  */

  DelayNS(50);

  /*延时

  */

  }

  return0;

  }

  3.4.8思考

  为什么这个实验的工程不需要设置连接地址?(提示:LPC2200专用工程模板已集成了起

  动代码、编译选项和连接地址设置等等)

  在实验参考程序中,如何控制蜂鸣器报警的速度?

  在LPC2000系列ARM7微控制器中,有哪两个管脚作GPIO输出时需要外接上拉电阻?

篇四:gpio输出控制实验报告流水灯

  嵌入式系统应用实验报告

  姓名:学号:学院:专业:班级:指导教师:

  实验1、流水灯实验

  1.1实验要求

  编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。

  1.2原理分析

  实验主要考察对STM32F10X系列单片机GPIO的输出操作。参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。

  由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。反之,LED灯熄灭。

  1.3程序分析

  软件方面,在程序启动时,调用SystemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。

  GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO时钟:

  RCC_APB2PeriphClockCmd(GPIO_CLK[Led],ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led],&GPIO_InitStructure)。

  初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。

  实验程序流程图如下:

  硬件方面,根据实验指南,将实验板做如下连接:1.3实验结果

  实验二、按键实验

  2.1实验要求

  利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。

  2.2原理分析

  实验主要考察对STM32F10X系列单片机GPIO外部中断功能的使用。STM32F107VCT一共有5组GPIO,分别是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0]、PE[15:0]。STM32的所有GPIO都可以作为中断输入源,单片机通过复用的方式使其对处理器来说来自GPIO的一共有16个中断Px[15:0]。具体实现是PA[0]、PB[0]、PC[0]、PD[0]和PE[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1]和PE[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15]和PE[15]共享一个GPIO中断。以下图片为以EXTI0为例的外部中断/事件线路映像:

  要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写‘1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置‘1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

  要把IO口作为外部中断输入,有以下几个步骤:(1)初始化IO口为输入。这一步设置要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。(2)开启IO口复用时钟,设置IO口与中断线的映射关系。STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。(3)开启与该IO口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情

  况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

  (4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。

  (5)编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃。所以在开启了某个中断后,应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作,并很据情况判断是否要对中断产生的标志位进行清零。

  由原理图可知,按键未按下时,GPIO读到的为高电平,按键按下后,IO口接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。

  2.3程序分析LED灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化,

  初始化函数为GPIO_KEY_Config()(见附录4),配置过程与实验一中GPIO配置

  基本一致。由于此处GPIO需要采集外界按键信号,故GPIO模式应该为调整为部上拉电阻输入

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU。然后执行GPIO中断初始化函数KEY_EXIT_Init()(见附录5),首先将连接按键的IO口与EXTI线到一起:GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE);然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断:EXTI_InitStructure.EXTI_Line=GPIO_KEY1_EXTI_LINE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure)。之后进行中断分组配置及中断优先级配置,函数为InterruptConfig()(见附录6)。配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所有外部中断归为NVIC_PriorityGroup_2,即2位抢占优先级和2位响应优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);然后将所有外部中断信号的抢占优先级规定为0、1、2,使其可以相互区别,并将配置好的参数写入对应寄存器中,完成配置:NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY1_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY2_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=GPIO_KEY3_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_Init(&NVIC_InitStructure)。初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中断服务函数EXTI9_5_IRQHandler()(见附录7)中。在函数中对LED灯进行点亮、熄灭操作,并重置中断产生标志位。实验流程图如下(主函数代码见附录8):

  硬件连接方式如下图所示:

  2.3实验结果

  实验三、定时器实验

  3.1实验要求

  利用STM32的通用定时器TIM5产生一个1S的中断,在中断函数中实现LED1、LED2、LED3、LED4同时翻转的效果。

  3.2原理分析

  实验主要考察对STM32F10X系列单片机定时器的使用。实验中使用的STM32F107单片机有多达10个定时器,包括:

  ◇多达4个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入

  ◇1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器

  ◇2个独立的看门狗定时器(独立的和窗口型的)◇系统时间定时器:24位自减型计数器◇2个16位基本定时器用于驱动DAC

  根据时钟树可知,系统时钟经过分频之后,进入TIM5的时钟模块入口,在经过预分频处理,才供给TIM5作时钟使用。预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时表示不分频,则TIM5定时器的时钟用CK_T=模块入口时钟72MHz;当TIMx_PSC=1时表示不分频,则TIM5定时器的时钟用CK_T=模块入口时钟36MHz;以此类推。公式为:CK_T=fCK_PSC/(PSC[15:0]+1),其中PSC最大为65535。其次是TIM5计数器计数值的设置,TIM5计数器以CK_T为时钟计数,向下计数到0或向上计数到设定值(TIMx_ARR)则产生中断。以向上计数为例,从0开始计数到设定值TIMx_ARR时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频的值=系统时钟72MHz,其中计数器的值和预分频值都必须小于65535。我们使预分频值为7200,计数器值为10000,则7200*10000=72,000,000

  即72M。其中拆分方法很多35000*2000=72,000,000,只要注意计数器的值和预分频值都必须小于65535即可。当计数值溢出后,会改变计数溢出标志位,并产生定时器中断,实验中使用其产生中断来进行LED灯翻转。

  3.3程序分析

  LED初始化部分与实验一相同,完成初始化后,点亮所有LED灯。定时器配置函数为TIM5_Init()(见附录6)。配置函数首先使能计数器时钟:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);然后自动装载计数值,计数从0开始:TIM_TimeBaseStructure.TIM_Period=(100-1);再对计时器进行预分频系数设置:TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);并将计数器设置为向上计数:TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;最后写入计时器配置寄存器,完成配置:TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure)。配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开始计数。TIM_ClearITPendingBit(TIM5,TIM_IT_Update);TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);TIM_Cmd(TIM5,ENABLE)。定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数

  为NVIC_Configuration()(见附录7)。函数首先将中断向量表首地址置于0x08000000:

  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000);然后使能TIM5中断:NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;最后将配置参数写入中断控制寄存器,完成配置:NVIC_Init(&NVIC_InitStructure)。一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler()(见附录8)中进行处理。在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录9),实现了LED的闪烁。程序流程图如下:

  硬件连接方式如下图所示:

  实验四、按键中断控制LED灯定时闪烁

  4.1实验要求

  综合实验一、二、三,利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1控制LED1以1S为间隔,闪烁3次,SKEY2控制LED2以2S为间隔闪烁3次,SKEY3控制LED3以3S为间隔,闪烁3次。

  4.2原理分析

  实验需要用到STM32的GPIO输入输出操作,GPIO外部中断和部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。此实验需要将以上实验做综合,并对时序进行调整。难点为,对GPIO外部中断和定时器部中断的处理,即如何确定两种不同中断的优先级。

  这里的使用的方法是,将所有按键外部中断置于中断分组2,即NVIC_PriorityGroup_2中。将所有按键中断抢占优先级置为0,即最高级别中断,响应优先级置分别置为1、2、3,相互区别。将定时器中断抢占优先级置为1,相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED闪烁状态。

  4.3程序分析

  这在程序初始化阶段,分别对LED、按键外部中断和定时器中断进行初始化。主函数如下:

  intmain(void){

  /*LED初始化*/LED_config();

  /*LED闪烁¸*/Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();

  /*按键初始化*/GPIO_KEY_Config();

  /*按键外部中断初始化*/KEY_EXIT_Init();

  /*外部中断向量初始化*/InterruptConfig();/*定时器5初始化*/TIM5_Init();

  /*定时器中断初始化*/NVIC_Configuration();

  /*等待中断触发*/while(1){}}初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部中断服务函数,函数中将判断哪一个按键被按下,记录按下的按键,然后给定时器清零并开始计数,且清零外部中断标志位。

Top