嵌入式系统原理实验三跑马灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 口的初始化。函数代码是:

相关文档
最新文档