嵌入式系统原理实验三跑马灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三跑马灯实验
实验目的:
通过一个经典的跑马灯程序,了解STM32F1 的IO 口作为输出使用的方法。通过代码控制ALIENTEK 战舰STM32 开发板上的两个LED:DS0 和DS1 交替闪烁,实现类似跑马灯的效果
内容要点:
1.硬件设计
本章用到的硬件只有LED(DS0 和DS1)。其电路在ALIENTEK 战舰STM32F103
开发板上默认是已经连接好了的。DS0 接PB5,DS1 接PE5。所以在硬件上不需
要动任何东西。其连接原理图如图:
2.软件设计
跑马灯实验我们主要用到的固件库文件是:
stm32f10x_gpio.c /stm32f10x_gpio.h
stm32f10x_rcc.c/stm32f10x_rcc.h
misc.c/ misc.h
stm32f10x_usart /stm32f10x_usart.h
其中stm32f10x_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数以及
相关的外设时钟使能函数都在这个其源文件stm32f10x_rcc.c 中。
stm32f10x_usart.h 和misc.h 头文件在我们SYSTEM 文件夹中都需要使用到,所
以每个实验都会引用。
首先,找到之前新建的Template 工程,在该文件夹下面新建一个HARDWARE
的文件夹,用来存储以后与硬件相关的代码,然后在HARDWARE 文件夹下新
建一个LED 文件夹,用来存放与LED 相关的代码。新建led.h和led.c文件,
一个外设对应一个.h和.c文件。
在Manage Components 管理里面新建一个
HARDWARE 的组,并把led.c 加入到这个组里面,
将led.h 头文件的路径加入到工程里面
一般的头文件有固定的格式,多个地方调用头文件会重复引用,为了避免头文件内
容重复引用,一般通过预编译的方式来写头文件。一般的格式如下:
#ifndef __LED_H
#define __LED_H
……
#endif
第一次调用时会将#define下面这一节全部定义,重复调用时,下面的东西就不会
被引用。
头文件里一般用来写函数声明或者宏定义,在源文件中再去定义具体的函数。
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
然后我们打开USER 文件夹下的LED.uvprojx 工程(如果是使用的上面新建的工
程模板,那么就是Template. uvprojx,大家可以将其重命名为LED. uvprojx),按
新建按钮新建一个文件,然后保存在HARDWARE->LED 文件夹下面,保存为
led.c。在该文件中输入如下代码:
#include "led.h"
#include "stm32f10x.h"//引用顶层头文件,否则RCC_APB2PeriphClockCmd()函数不可见
//初始化PB5 和PE5 为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能
PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);//输出PB5为高电平
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE5 输出高
}
该代码里面就包含了一个函数void LED_Init(void),该函数的功能就是用来实现配置PB5和PE5 为推挽输出。这里需要注意的是:在配置STM32 外设的时候,任何时候都要先使能该外设的时钟。GPIO 是挂载在APB2 总线上的外设,在固件库中对挂载在APB2 总线上的外设时钟使能是通过函数RCC_APB2PeriphClockCmd()来实现的。代码如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
这两行代码的作用是使能APB2 总线上的GPIOB 和GPIOE 的时钟。或者可以写成RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE,ENABLE);
在配置完时钟之后,LED_Init 配置了GPIOB.5 和GPIOE.5 的模式为推挽输出,并且默认输出1。这样就完成了对这两个IO 口的初始化。函数代码是: