STM32上实现点灯(固件库方式)

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32上实现点灯(固件库方式)相关的知识,希望对你有一定的参考价值。

摘自:stm32上实现点灯
作者:SKY丶丿平才
发布时间: 2021-03-20 16:51:06
网址:https://blog.csdn.net/weixin_48264057/article/details/115028724

前言

其实和寄存器点灯是一样的,只不过库函数将寄存器都封装在结构体里面了,我们只需调用这些结构体就好了。

本篇博文将要介绍的是控制ALIENTEK 探索者STM32F4 开发板上的两个 LED 实现一个类似跑马灯的效果,该实验的关键在于如何控制 STM32F4 的 IO 口输出。了解了 STM32F4 的 IO 口如何输出的,就可以实现跑马灯了。通过这一章的学习,你将初步掌握 STM32F4 基本 IO 口的使用,而这是迈向 STM32F4 的第一步。

一、硬件设计

本次实验用到的硬件只有 LED(DS0 和 DS1)。其电路在 ALIENTEK 探索者 STM32F4 开发板上默认是已经连接好了的。DS0 接 PF9,DS1 接 PF10。所以在硬件上不需要动任何东西。其连接原理图如下图:
在这里插入图片描述

二、软件设计

下面展示的是代码的编写,具体结构体里面的函数寻找过程,参照这篇博文:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结,在库函数点灯部分有专门讲解。

1.建立工程

在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);//初始化GPIO
	
  GPIO_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)	// DS0,调库的方式定义LED端口
#define GPOO_SetBits(GPIOF,GPIO_Pin_10)	// DS1,调库的方式定义LED端口

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拉低,亮  等同LED0=0;
		
	GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
		
	delay_ms(500);  		   //延时300ms
		
	GPIO_SetBits(GPIOF,GPIO_Pin_9);	   //LED0对应引脚GPIOF.0拉高,灭  等同LED0=1;
		
	GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
		
	delay_ms(500);                     //延时300ms
		
	}
	
}

三、实际验证

1.烧写程序

在FlyMcu软件中利用串口将编译好的程序烧写进去
在这里插入图片描述

2.实际功能验证

在这里插入图片描述
烧写进板子的程序开始运行,实现了跑马灯功能

总结

这个跑马灯的实验主要是介绍了对于32IO口的使用,虽然内容上比较简单,也是通过调库的方式来实现的,但还是能给我们很多有用得启发。

以上是关于STM32上实现点灯(固件库方式)的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32F103入门1——点亮LED灯

STM32白话文教程固件库点灯

STMF4-1-固件库点灯

STM32F401RCT6基于Arduino框架点灯程序

STM32固件库

STM32 Cube固件库编程之新建工程