STM32单片机的IO口可以设置为8中模式:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能

每个IO口可以自由使用,但是都必须按照32位字节形式访问。在单片机内部,每个IO口北斗杯7个寄存器控制。
他们分别是:
2个32位的端口配置寄存器CRL和CRH;
2个32位的数据寄存器IDR和ODR;
1个32位的置位/复位寄存器BSRR;
1个16位的复位寄存器BRR;
1个32位的锁存寄存器LCKR。
但是在我们使用过程中一般都是使用固件库的开发方式:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

该函数有两个参数:
一个参数指定具体的GPIO,其范围为GPIOA-GPIOG
第二个参数是初始化参数结构体指针,结构体的类型为GPIO_InitTypeDef,在找到该函数体时,双击GPIO_Init函数,鼠标右键选择Go to definition of … 就可以找到该函数的原型,然后选中GPIO_InitTypeDef该函数体,就可以找到该结构体内部的参数;

typedef struct
{uint16_t GPIO_Pin; // 具体哪个引脚可以在GPIO_Pin_0 ~ GPIO_Pin_15之间进行选择           GPIOSpeed_TypeDef GPIO_Speed;  //设置该脚的传输速率GPIOMode_TypeDef GPIO_Mode;  //设置该脚的工作模式}GPIO_InitTypeDef;

双击GPIOSpeed_TypeDef 该结构体,鼠标右键Go to definition of …可以找到该结构体的原型。可以在提供的参数中进行选择,10MHZ,2MHz,50MHz。配置具体的传输速率。

typedef enum
{ GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz, GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

双击GPIOMode_TypeDef 结构体,右键Go to definition of …同样可以找到结构体的原型,可以在提供的参数中进行选择。

typedef enum
{ GPIO_Mode_AIN = 0x0,//模拟输入GPIO_Mode_IN_FLOATING = 0x04,//浮空输入GPIO_Mode_IPD = 0x28,//下拉输入GPIO_Mode_IPU = 0x48,//上拉输入GPIO_Mode_Out_OD = 0x14,//开漏输出GPIO_Mode_Out_PP = 0x10,//推挽输出GPIO_Mode_AF_OD = 0x1C,//复用开漏输出GPIO_Mode_AF_PP = 0x18//复用推挽输出
}GPIOMode_TypeDef;

设置单个GPIO端口输出时通过函数GPIO_SetBits()GPIO_ResetBits()这个两个函数实现的,同样我们可以鼠标右键跳转到该函数的原型:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

我们可以通过这两个函数来控制单个或多个GPIO端口输出高电平或者低电平。
下面为跑马灯的具体实现函数:

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;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);        //根据设定参数初始化GPIOB.5GPIO_SetBits(GPIOB,GPIO_Pin_5);               //PB.5 输出高}

上面为跑马灯实验的全部流程,IO口操作过于简单,但还是做一个简单的概括:
(1)结构体的定义
(2)使能IO口的时钟,调用的函数为RCC_APB2PeriphClockCmd
(3)初始化IO操作,需要将GPIO_Init中的三个参数全部配置一次:端口,输出模式,端口传输速率。

头文件LED.H的编写:

#ifndef __LED_H
#define __LED_H
#include "sys.h"//包含在系统头文件下
#define LED0 PBout(5)// 宏定义,以后可以根据LED0的赋值来控制端口电平,位带操作
void LED_Init(void);//函数的声明
#endif

在main函数中可以使用while循环对LED进行控制,编写延时函数,可以控制LED闪烁。

while(1)
{LED0 = 1;delay(1000ms);LED0 = 0;delay(1000ms)
}

注意:在主函数中需要包含LED的头文件,还需要在主函数中对LED_Init进行声明。
参考文献:《STM32F1开发指南(库函数板)》

STM32单片机跑马灯实验解析相关推荐

  1. 【STM32】跑马灯实验主要程序代码分析

    文章目录 main.c led.c led.h STM32 的 IO 口可以由软件配置成如下 8 种模式: 输入浮空 输入上拉 输入下拉 模拟输入 开漏输出 推挽输出 推挽式复用功能 开漏复用功能 S ...

  2. c语言跑马灯实验报告,单片机跑马灯实验

    一.实验目的 1. 熟悉HNIST-2型单片机系统相关硬件电路,程序下载方法: 2. 掌握采用汇编语言与C语言开发单片机系统的程序结构: 3. 掌握51系列单片机通用I/O口的使用. 二.实验前准备 ...

  3. 跑马灯C语言实验报告,51单片机跑马灯实验报告 分析与小结,思考题源码下载

    一.实验目的与要求 1.熟悉 Keil C51 集成环境软件的使用方法. 2.熟悉 MCS51 汇编指令,能自己编写简单的程序,控制硬件. 3.熟悉畅学开发平台,掌握单片机最小系统及 IO 口的简单控 ...

  4. 10.4.4 51单片机控制系统8个LED“跑马灯”实验

    10.4.4 51单片机控制系统8个LED"跑马灯"实验 仿真+代码 方法一 利用数组 #include"reg52.h"#define u8 unsigned ...

  5. 单片机炫彩灯实训报告_单片机跑马灯(流水灯)控制实验报告

    单片机跑马灯(流水灯)控制实验报告 1单片机实验报告单片机实验报告姓名 学号一.一. 实验实现功能实验实现功能1计数器功能 2流水灯二.具体操作具体操作1计数器功能计数器功能数码管的动态显示.每按一次 ...

  6. 【stm32】如何把原子哥的代码移植到最小系统板stm32f103c8t6 以跑马灯实验为例

    [stm32]如何把原子哥的代码移植到最小系统板stm32f103c8t6 以跑马灯实验为例 外部硬件: stm32仿真编程器 (仿真编制器自己在网上买,不确定买哪个的可以就买我这个,图片上有牌子,自 ...

  7. 正点原子探索者原理图_正点原子【STM32-F407探索者】第六章 跑马灯实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...

  8. 【正点原子MP157连载】第十章 跑马灯实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  9. STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本

    一.stm32跑马灯实验 a.GPIO general purpose input output 通用输入输出端口,可以做输入也可做输出,GPIO端口可通过程序配置成输入或输出. STM32FXXXI ...

  10. 汇编语言比C51需要效率高,汇编语言与C51语言实现跑马灯实验的比较 -

    当前开发单片机应用系统程序主要应用汇编语言和C51语言,采用汇编语言编写可直接操纵系统的硬件资源,能编写出高效运行的程序代码,程序运行速度快.而采用C51语言编写可改善程序的可读性和可移植性,利于产品 ...

最新文章

  1. 南召天气预报软件测试,南召天气预报15天
  2. 解决R 4.0版本包的安装错误
  3. Windows驱动开发学习笔记(六)—— Inline HOOK
  4. 基于互联网生态积累,百度Apollo智舱产品斩获智能网联创新奖
  5. 3ds Max 2018 在安装后无法启动或出现不稳定
  6. python游戏开发工程师_Python开发工程师-入门与实战视频课程
  7. oracle下载配置文件,oracle 11G、12C BBED 配置和库文件下载!
  8. 电商咄咄逼人的黑色星期五促销横BANNER设计模板
  9. MyCat 数据库分片极简体验
  10. bzoj 2302: [HAOI2011]Problem c(DP)
  11. JQueryEasyUI学习笔记(一)
  12. android登录操作代码,Android Studio实现第三方QQ登录操作代码
  13. yourphp超出20记录自动删除
  14. 压力测试的轻量级具体做法
  15. 矩阵分析与应用课程资料
  16. JS点击图片位置后增加点位
  17. 游戏服务器背包设计与开发
  18. 什么是堆栈,堆和栈到底是不是一个概念
  19. 替代变量与SQL*Plus环境设置 (转自一沙弥的世界)
  20. css3制作八棱锥_CSS 绘制各种形状

热门文章

  1. 使用python获取vCenter默认警报定义
  2. 复杂性思维中文第二版 五、细胞自动机
  3. DNS域名解析协议详解
  4. python元组元素的提取_Python 元组
  5. ffmpeg 合并音视频命令
  6. 【软件测试】如何抓取崩溃的log日志
  7. Go dep init失败
  8. 2021牛客多校#10 F-Train Wreck(数学,优先队列)
  9. 22. vCenter上解决”此主机当前没有管理网络冗余“的警告
  10. 统计分析软件_强大的多元统计分析软件-Mplus