参考:stm32上实现点灯
作者:SKY丶丿平才
发布时间: 2021-03-20 16:51:06
网址:https://blog.csdn.net/weixin_48264057/article/details/115028724
目录
- 前言
- 一、硬件设计
- 二、软件设计
- 1.建立工程
- 2.代码编写
- 三、实际验证
- 1.烧写程序
- 2.实际功能验证
- 总结
前言
其实和寄存器点灯是一样的,只不过库函数将寄存器都封装在结构体里面了,我们只需调用这些结构体就好了。
本篇博文将要介绍的是控制ALIENTEK (正点原子)探索者STM32F4 开发板上的两个 LED 实现一个类似跑马灯的效果,该实验的关键在于如何控制 STM32F4 的 IO 口输出。了解了 STM32F4 的 IO 口如何输出的,就可以实现跑马灯了。通过这一章的学习,你将初步掌握 STM32F4 基本 IO 口的使用,而这是迈向 STM32F4 的第一步。
一、硬件设计
本次实验用到的硬件只有 LED(DS0 和 DS1)。其电路在 ALIENTEK 探索者 STM32F4 开发板上默认是已经连接好了的。DS0 接 PF9,DS1 接 PF10。所以在硬件上不需要动任何东西。其连接原理图如下图:
二、软件设计
下面展示的是代码的编写,具体结构体里面的函数寻找过程,参照这篇博文:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结,在库函数点灯部分有专门讲解。
1.建立工程
这是江江的视频教程:
在USER文件夹下创建LED文件夹,文件夹内创建 led.c 和 led.h 文件,然后通过 keil 将 led.c 添加到项目工程,编译一下,led.h自动包含进来了。
led.h
led.c
main.c
在keil5中建立好如下图所示的工程:
2.代码编写
我们需要在三个文件中编写代码,其他添加进去的文件都是固件库自带得,这里我们使用调库的方式来实现点灯。
首先是在led.c文件中,这是我们的点灯文件,主要是定义一个初始化函数
led.c
#include "led.h" void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;//结构体定义要在时钟之前 通过“.”访问结构图内部成员变量//1、使能APB2的时钟GPIC(视频课程中)RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟//2、结构体配置//GPIOF9,F10初始化设置 视频课程中就配置了前三个结构体成员变量 没指定上拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz 点灯的话频率随便选一个就好了GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIO电平拉高函数 GPIOF9,F10设置高,灯灭}
随后是led.h文件,这里要对定义的函数做声明以及定义好两个io口
led.h
#ifndef __LED_H
#define __LED_H //这两步骤 条件编译#include "sys.h"
//include "stm32f10x.h" 视频课程中用的板子包含这个头文件//LED端口定义 这两个分别是GPIO电平拉低拉高函数,视频课程中没有这一步。
#define GPIO_ResetBits(GPIOF,GPIO_Pin_9)
#define GPOO_SetBits(GPIOF,GPIO_Pin_10) void LED_Init(void);//初始化 先声明,然后在.C文件中实现
#endif
最后再编写main.c文件
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"int main(void){ delay_init(168); //初始化延时函数LED_Init(); //初始化LED端口/**下面是通过直接操作库函数的方式实现IO控制**/ while(1){GPIO_ResetBits(GPIOF,GPIO_Pin_9); //LED0对应引脚GPIOF.9拉低GPIO_SetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉高delay_ms(500); //延时300msGPIO_SetBits(GPIOF,GPIO_Pin_9); //LED0对应引脚GPIOF.0拉高GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低delay_ms(500); //延时300ms}}
三、实际验证
1.烧写程序
在FlyMcu软件中利用串口将编译好的程序烧写进去
2.实际功能验证
烧写进板子的程序开始运行,实现了跑马灯功能
总结
这个跑马灯的实验主要是介绍了对于32IO口的使用,虽然内容上比较简单,也是通过调库的方式来实现的,但还是能给我们很多有用得启发。