- 一、硬件设计
- 二、软件设计
- 三、运行效果
一、硬件设计
本章用到的硬件只有 LED(DS0 和 DS1)。其电路在 STM32F103 开发板
上默认是已经连接好了的。DS0 接 PB5,DS1 接 PE5。所以在硬件上不需要动任何东西。其连接电路图如下:
跑马灯实验我们主要用到的固件库文件是:
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 文件夹中都需要使用到(我用的是正点原子的库函数模板),所以每个实验都会引用。
新建一个 HARDWARE 的文件夹,用来存储以后与硬件相关的代码,然后在 HARDWARE 文件夹下新建一个 LED 文件夹,用来存放与 LED 相关的代码。
led.c
#include "led.h"
//初始化 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); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); /PE.5 输出高
}
该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PB5和 PE5 为推挽输出。这里需要注意的是:在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。
led.h
#ifndef __LED_H #define __LED_H #include "sys.h" //LED 端口定义 #define LED0 PBout(5)// DS0 #define LED1 PEout(5)// DS1 void LED_Init(void);//初始化 #endif
main.c
#include "led.h"
#include "delay.h"
#include "sys.h"
//跑马灯实验
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与 LED 连接的硬件接口
while(1)
{ LED0=0;
LED1=1;
delay_ms(300); //延时 300ms
LED0=1;
LED1=0;
delay_ms(300); //延时 300ms
} }
代码包含了#include "led.h"这句,使得 LED0、LED1、LED_Init 等能在 main()函数里被调用。系统在启动的时候会调用 system_stm32f10x.c 中的
函数 SystemInit()对系统时钟进行初始化,在时钟初始化完毕之后会调用 main()函数。 所以我们不需要再在 main()函数中调用 SystemInit()函数。当然如果有需要重新设置时钟系统,可以写自己的时钟设置代码,SystemInit()只是将时钟系统初始化为默认状态。main()函数非常简单,先调用delay_init()初始化延时,接着就是调用 LED_Init()来初始化GPIOB.5 和 GPIOE.5 为输出。最后在死循环里面实现 LED0 和 LED1 交替闪烁,间隔为 300ms。上面是通过位带操作实现的 IO 操作,对于通过调用库函数以及直接操作寄存器来实现LED控制的方法,在我们 main.c 文件中我们已经注释掉,大家可以取消注释分别来测试这两种方法,实际效果是一模一样的。



