参考: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口的使用,虽然内容上比较简单,也是通过调库的方式来实现的,但还是能给我们很多有用得启发。

STM32F103实现点灯(固件库方式)相关推荐

  1. c语言调用固件库函数,用C++写单片机程序 STM32F103 + 自建固件库 + FreeRTOS 用gcc编译器和newlib(1篇)...

    认识众多玩家高手/拆客/DIYer,查阅更多资源,一起学习技术知识 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 freemancn 于 2019-8-17 18:46 编辑 作 ...

  2. STM32F103固件库编程:关于core_cm3.c的错误

    STM32F103固件库编程:关于core_cm3.c的错误. 解决方法有两种: 1.直接删除固件库中的core_cm3.c文件,keil已有替代文件. 2.ARM编译器版本从6,改回到5. 提示错误 ...

  3. kiel 5中添加固件库的方式

    前一篇博文有固件库的下载介绍,这里介绍固件库具体的添加方式 1.新建文件夹,里面包含四个空的文件夹 2.CMSIS中需要添加的文件,用两幅图表示,包含具体路径,一共5个函数 3. Startup需要添 ...

  4. STM32F103ZE固件库编程点灯

    点灯都是非常基础的操作,具体细节已在上片文章描述,本章在上章的基础上改用固件库编码. 代码: #include "led.h" //PE2 推挽输出 //IO初始化  外设初始化 ...

  5. srm32f4按键蜂鸣器_stm32 用中断实现按键点灯和蜂鸣器鸣叫(固件库版)

    引言 这是这篇博文的升级版本 https://blog.csdn.net/qq_44885018/article/details/103050388 上面轮询的方法,今天主要讲中断的方法.为了方便不要 ...

  6. STM32F103构建固件库模板(PS固件库文件树介绍)

    参考:STM32F103ZE新建固件库模板 作者:追兮兮 发布时间:2020-10-14 10:31:45 网址:https://blog.csdn.net/weixin_44234294/artic ...

  7. STM32F103标准固件库寄存器及常用函数整理

    学习STM32其实就是学习它的寄存器以及函数的使用,能用单片机的资源实现自己想要的功能,从最开始的点亮一个led,到使用按键,串口,ADC/DAC,定时器计时计数,输出PWM,驱动电机,使用IIC,S ...

  8. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用

    STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用 本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6. 文章目录 STM32固件库(标准外设库)入门学习 第 ...

  9. 1、新建基于标准固件库MDK5工程模板(STM32F103ZET6)

    新建基于标准固件库MDK5工程模板 1.STM32官方库文件夹介绍 如上图,是ST官方提供的STM32标准固件库的文件包结构: STM32官方固件库下载地址: "https://www.st ...

最新文章

  1. 在Andoird studio 中用代码实现setId报错,而在ecplise中可以,的处理方法
  2. 电脑服务器高配置和高性能,为高性能工作站服务 超算系统配置推荐
  3. dSploitzANTI渗透教程之安装zANTI工具
  4. 终于收到HacktoberFest的奖品啦
  5. nssl1163-小x游世界树【树形dp,二次扫描和换根法】
  6. 为什么总是喜欢看我桌面呢?
  7. C++:08---成员变量初始化方式
  8. pat1100. Mars Numbers (20)
  9. C++/C中定义与声明的区别
  10. 抖音封禁超万账号;小米回应手机壳含毒;百度网盘封杀非官方版 | CSDN极客头条
  11. python 批量修改文件夹和子文件夹的名称
  12. 计算机为什么使用二进制编码,计算机为什么使用二进制
  13. zuk z2 android 8,骁龙820享受安卓8.0!ZUK Z2悄然升级ZUI 4.0
  14. IDC机房的网络防火墙设备
  15. 关于云服务器搭建内网穿透(frp)
  16. Synch4j使用指南
  17. UEFI标准应用程序模块--SMBIOS的读写
  18. PHOTOSHOP给MM去斑的最简单方法
  19. 错误解决:Problem binding to [0.0.0.0:10033] java.net.BindException
  20. CAD删除Entity的所有XData(ResultBuffer)信息,C# .NET

热门文章

  1. 可添加至收藏夹并在浏览器地址栏运行的JS代码
  2. Atom与markdown
  3. 实例讲解override和new的区别
  4. OSPF动态路由协议入门简介
  5. LIVE555建立RTSP服务记录
  6. struct x264_t 维护着CODEC的诸多重要信息
  7. 修改shape数据 小数位数_【数据管理】Excel实用精华
  8. python将一行作为字段_关于python:Django admin在同一行显示多个字段
  9. halcon/c++接口基础 之 halcon初认识
  10. str045漏洞提权linux,Linux运维知识之CVE-2016-5195 Dirtycow: Linux内核提权漏洞