IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32—跑马灯库函数实验 -> 正文阅读

[嵌入式]STM32—跑马灯库函数实验


前言

回顾之前的GPIO基础知识,STM32F103一共有7组GPIO,每组GPIO含下面7个寄存器,也就是7个寄存器一共可以控制一组GPIO的16个IO口
在这里插入图片描述

一、硬件设计

本章用到的硬件只有 LED(DS0 和 DS1)。其电路在 ALIENTEK 精英 STM32F103 开发板
上默认是已经连接好了的。 DS0 接 PB5, DS1 接 PE5。是不需要自己接任何电路的,因此我们只需要编写代码即可。
在这里插入图片描述
在这里插入图片描述
设置推挽输出原因:可以输出强高低电平,控制LED灯亮灭。

二、软件设计

1.基于库函数代码编写

我们使用之前建立的STM32工程模板, 在该文件夹下面新建一个 HARDWARE 的文
件夹,用来存储以后与硬件相关的代码, 然后在 HARDWARE 文件夹下新建一个 LED 文件夹,
用来存放与 LED 相关的代码。

今后在进行别的外设开发时,也是基于该模板,在HARDWARE文件夹下新建新的文件夹,添加硬件相关代码,然后编写主函数,实现相关功能。
在这里插入图片描述
然后在LED文件夹下新建led.c、led.h文件。将其添加到工程之中,并且将头文件路径也添加到MDK。

led.c

#include "led.h"

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口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //初始化GPIOB.5
	GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5输出高电平

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5,端口配置
	GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //初始化GPIOE.5
	GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5输出高电平
}

这里需要说明的是,因为 GPIOB 和 GPIOE 的 IO 口的初始化参数都是设置在结构体变量
GPIO_InitStructure 中,因为两个 IO 口的模式和速度都一样,所以我们只用初始化一次,在
GPIOE.5 的初始化的时候就不需要再重复初始化速度和模式了。

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"

void LED_Init(void);	//初始化

#endif

main.c

#include "led.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"

int main(void)
{ 
 
	delay_init();		  //初始化延时函数
	LED_Init();		        //初始化LED端口
	while(1)
	{
			GPIO_ResetBits(GPIOB,GPIO_Pin_5);
			GPIO_SetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300);
			GPIO_SetBits(GPIOB,GPIO_Pin_5);
			GPIO_ResetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300); 
	}
} 

整个工程如下:
在这里插入图片描述

2.基于寄存器代码编写

前面学习GPIO的基本知识的时候已经知道,每一组GPIO的引脚控制都是通过7个寄存器进行的,因此,通过配置这7个寄存器就可以实现IO口的操作。

led.c

#include "led.h"

void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    // 使能GPIOB时钟
	RCC->APB2ENR|=1<<6;    //使能GPIOE时钟
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5推挽输出、IO口速度50MHz
    GPIOB->ODR|=1<<5;      //PB.5输出高,灯灭
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽输出、IO口速度50MHZ
	GPIOE->ODR|=1<<5;      //PE.5输出高,灯灭
}

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"

void LED_Init(void);	//初始化

#endif

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

int main(void)
{ 
 
	delay_init();
	LED_Init();	
	while(1)
	{
		GPIOB->BRR=GPIO_Pin_5;//LED0亮
	 	GPIOE->BSRR=GPIO_Pin_5;//LED1灭
		delay_ms(300);
    	GPIOB->BSRR=GPIO_Pin_5;//LED0灭
		GPIOE->BRR=GPIO_Pin_5;//LED1亮
		delay_ms(300);
	}
}

当然这里你也可以通过设置ODR寄存器来实现IO输出电平的控制,从而实现LED灯的亮灭。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 17:03:16  更:2021-10-01 17:03:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:43:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码