嵌入式系统 流水灯、按键、定时器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统应用
实验报告
姓名:
学号:
学院:
专业:
班级:
指导教师:
实验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;