目录
本实验使用的是正点原子探索者开发板
一、硬件设计
LED0为PF9,LED1为PF10。
二、软件设计
1、选择需要的源文件
在工程模版中,FWLIB分组下,我们引入了所有 的HAL库源文件 和对应的头文件。
但是可以根据工程需要添加,可以减少工程编译时间,跑马灯实验需要的HAL库文件为:
cpp
stm32f4xx_hal.c
stm32f4xx_hal_cortex.c
stm32f4xx_hal_gpio.c
stm32f4xx_hal_pwr.c
stm32f4xx_hal_pwr_ex.c
stm32f4xx_hal_rcc.c
stm32f4xx_hal_rcc_rx.c
stm32f4xx_hal_usart.c
stm32f4xx_hal_usart_ex.c
stm32f4xx_hal_dma.c
stm32f4xx_hal_dma_ex.c
在工程中去掉多余的源文件:
三、新建HARDWARE文件夹
在工程根目录下面新建一个HARDWARE的文件夹、用来储存以后与硬件相关的代码。然后在HARDWARE文件夹下新建一个LED文件夹,用来存放与LED相关的代码。
复制之前新建的Template工程模版,修改工程的名字:
1、找到USER文件夹中找到 .uvprojx和.uvoptx,将名字修改为自己需要的名称。
2、打开工程管理(),修改工程名字。
3、点击魔术棒,Output->Name Executable修改为自己想要的名字。
4、编译工程,关闭软件,在USER文件夹中删除之前名字的文件。
四、编写led.c和led.h
新建led.c和led.h保存到HardWare->LED文件夹下。
注意要将led.c添加到工程中,在工程管理中,新建一个HARDWARE组,将led.c文件添加到其中。
将led.h的路径添加到头文件路径中。
led.c
cpp
#include "led.h"
//初始化F9,F10为输出、并使能时钟
//LED IO 初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOF_CLK_ENABLE(); //开启GPIOF 时钟
GPIO_Initure.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull = GPIO_PULLUP; //上拉
GPIO_Initure.Speed = GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); //PF9置1, 默认初始化后灯灭
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); //PF10置1,默认初始化后灯灭
}
led.h
cpp
#ifndef _LED_H
#define _LED_H
#include "sys.h"
#define LED0 PFout(9); //DS0 PF9
#define LED1 PFout(10); //DS1 PF10
void LED_Init(void);
#endif
五、编写main.c函数
cpp
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
/*下面主函数是使用HAL库函数实现控制IO口输出*/
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336, 8, 2, 7); //设置时钟,168Hhz
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED
while(1)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET); //LED0对应引脚PF9拉低,亮,等同于LED0(0)
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET); //LED1对应引脚PF10拉高,灭,等同于LED1(1)
delay_ms(500); //延迟500ms
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET); //LED0对应引脚PF9拉高,灭,等同于LED0(1)
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET); //LED1对应引脚PF10拉低,亮,等同于LED1(0)
delay_ms(500); //延迟500ms
}
}
接下来即可编译程序。下载完程序之后,LED0和LED1循环闪烁。