GPIO口输出-点亮LED灯

news2024/12/29 8:36:36

前言

(1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。

(2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片机开发的同学学习和使用。

学习目标

  1. GPIO的初始化
  2. GPIO的输出库函数
  3. LED灯硬件电路分析
  4. 控制LED灯闪烁

LED灯硬件原理图

在这里插入图片描述

PC14、PC15输出高电平,可将LED点亮。

程序实现–GPIO的输出

GPIO初始化流程:

打开GPIO对应的外设时钟

初始化GPIO端口:Pin选择、速率、模式上拉下拉开漏配置

关于速率:

➢ GPIO简单的控制选择2MHZ 就OK.

➢ 如果是SPI IIC 通讯的频率比较高的时候,需要选择对应的速率。

常见的GPIO输出库函数

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

LED灯控制的代码的实现:

LED灯驱动流程

  1. 端口的定义
  2. 初始化
  3. GPIO端口的控制与操作

hal_led.h 文件代码:

#ifndef _HAL_LED_H
#define _HAL_LED_H

#define LED1_PORT			GPIOC
#define LED1_PIN			       GPIO_Pin_14

#define LED2_PORT			GPIOC
#define LED2_PIN			        GPIO_Pin_15

void hal_LedInit(void);
void hal_LedProc(void);
	
#endif

hal_led.c 文件代码:

#include "stm32F10x.h"
#include "hal_led.h"

static void hal_LedConfig(void);
static void hal_Led1Turn(void);

void hal_LedInit(void)
{
	hal_LedConfig();
}
/
/
void delay_1sTest(void)//用于测试的延时函数
{
	unsigned int i=0;
	i = 7200000;
	while(i--);   
}

static void hal_LedHandle(void)//led处理函数
{
	delay_1sTest();
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
	GPIO_ResetBits(LED2_PORT,LED2_PIN);
	delay_1sTest();
	GPIO_SetBits(LED1_PORT,LED1_PIN);
	GPIO_SetBits(LED2_PORT,LED2_PIN);
	//  static unsigned short delayt =0;
	//	delayt ++;
	//  if(delayt > 1000)
	//	{
	//		hal_Led1Turn();
	//		delayt = 0;
	//	}	
}
//


void hal_LedProc(void)//全局的任务函数,用于main函数中调用
{
	hal_LedHandle();
}

static void hal_LedConfig(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); 						 
	GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(LED1_PORT, &GPIO_InitStructure);
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
}


main.c文件代码

#include "stm32f10x.h"
#include "hal_led.h"

int main(void)
{
	hal_LedInit();
	hal_timerInit();
  while (1)
  {
		
  }
}

本章tips:

stastic定义的静态函数在其他c文件中调用

c文件中的静态函数(stastic定义的函数)要在其他文件中调用,直接调用是不行的;我们可以,再写一个全局的函数,这个全局函数里面调用这个静态函数就可以了。

形式

例如LED的驱动代码hal_led.c文件中代码:

void hal_LedInit(void)//led初始化函数。在hal_led.h中声明,使此函数可以全局调用
{
	hal_LedConfig();
}

static void hal_LedConfig(void)//led的驱动程序(初始化代码)。只能在本文件中调用
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); 						 
	GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ; 
	GPIO_Init(LED1_PORT, &GPIO_InitStructure);
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
}

这样一来,在main.c中想要调用LED的驱动代码,调用hal_LedInit()就行。

这个小技巧很常用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/928459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大二总结,记录下自己的收获。

一:从大一到大二结束每个学期的学习时间 二:成长历程 三:学习知识 3.1:大一学习知识 3.1:大二学习知识 四:接下来的路 学习时间…

IT运维软件的费用是多少?

正常一套IT运维软件费用一般在5千-50万之间不等,而且分为一次性付费或年付费模式,付费方式导致的价格也不同。 正常情况下IT运维软件的具体价格,是需要根据企业的实际需求来进行综合评估,一般来说,影响具体价格费用有以…

【每日易题】数组下标的逆天用法——你见过把数组存储的值当作数组下标来解题的吗?

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在最近是刷题中,遇到了一种非常新奇的数组下标的用法,今天想来给大家分享一下这种神奇的思路和方法,希望能在你遇到类似问题时能通…

《剑指Offer》模块4 栈和队列

栈和队列 1. 用两个栈实现队列 原题链接 补充&#xff1a;copy(a,b) 把a赋值给b class MyQueue { public:/** Initialize your data structure here. */stack<int> stk, cache;MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stk.push(x)…

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释&#xff1a; 分布式&#xff1a;把一个囊肿的系统分成无数个单独可运行的功能模块 集群&#xff1a; 把相同的项目复制进行多次部署&#xff08;可以是一台服务器多次部署&#xff0c;例如使用8080部署一个&#xff0c;8081部署一个&#xff0c…

vue拖拽div盒子实现上下拖动互换

vue拖拽div盒子实现上下拖动互换 <div v-for"(item, index) in formList" :key"index" draggable"true"dragstart"handleDragStart($event, item)"dragenter"handleDragEnter($event, item)"dragover.prevent"han…

如何在vscode导入下载的插件安装包

点击vscode插件 --> 点击3个点 --> 选择从VSIX安装 点击更新报 Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to m…

清吧全面解析,从此不再困惑

清吧&#xff08;Bar&#xff09;也叫休闲酒吧&#xff0c;是以轻音乐为主、比较安静的酒吧&#xff0c;比较适合和朋友一起谈天说地、喝酒聊天。清吧的装修风格偏向营造氛围&#xff0c;不如其他酒吧炫目。通常清吧这一类的酒吧不提供食品&#xff0c;仅提供酒水和饮料。通常清…

性价比神机!南卡新品OE CC开放式耳机上线,彻底把门焊死了!

开放式耳机,作为今年大热的产品,以其高舒适性在蓝牙耳机市场大放异彩,但是同时用户也反应出存在音质不足、漏音、通话质量差等多项问题&#xff0c;最重要的还是成熟的开放式产品价格偏贵&#xff0c;导致入门门槛相对较高。针对这些问题,开放式音频专业品牌南卡则是以产品力革…

keepalive+haproxy实现高可用

1&#xff0c;两台主机安装keepalived 配置keepalived 安装haproxy make PREFIX/usr/local/haproxy TARGETlinux2628 make install PREFIX/usr/local/haproxy 创建配置文件 配置haproxy vim /etc/haproxy/haproxy.cfg 添加为系统服务 cp /root/haproxy-1.7.2/examples/hapro…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…

【Linux】动态库和静态库

动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库&#xff08;.so&#xff09;动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的&#xff0c;他…

10.Redis数据结构之跳表

sortedSet sortedSet是Redis提供的一个非常特别的数据结构&#xff0c;常用作排行榜等功能&#xff0c;将用户id作为value&#xff0c;关注时间或者分数作为score进行排序。 与其他数据结构相似&#xff0c;zset也有两种不同的实现&#xff0c;分别是zipList和(hashskipList)。…

打造跨境电商新引擎:揭秘跨境电商系统商城软件平台源码

跨境电商系统商城软件平台的意义与需求 跨境电商正成为全球贸易发展的重要驱动力&#xff0c;然而&#xff0c;建立和运营一个成功的跨境电商平台并非易事。在这个过程中&#xff0c;跨境电商系统商城软件平台的作用日益凸显。 跨境电商系统商城软件平台源码是构建一个完整、高…

关于 ts 这一篇文章就够了

你好 文章目录 一、js 和 ts二、TypeScript的特点三、了解 ts , 爱上 ts &#x1f923; 一、js 和 ts 随着近几年前端领域的快速发展&#xff0c;JavaScript 迅速被普及和受广大开发者的喜爱&#xff0c;借助于 JavaScript 本身的强大&#xff0c;也让使用JavaScript开发的人员…

java八股文面试[JVM]——JVM内存结构2

知识来源&#xff1a; 【2023年面试】JVM内存模型如何分配的_哔哩哔哩_bilibili

PRACK消息

概述 PRACK消息是sip协议的扩展&#xff0c;在RFC3262中定义&#xff0c;标准的名称是sip协议中的可靠临时响应。 本文简单介绍标准中对PRACK消息流程的描述&#xff0c;以及fs配置PRACK的方式。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitc…

开放式耳机百元旗舰标杆,性能小钢炮南卡OE CC开放式耳机上线!

近日&#xff0c;南卡再次以领先的姿态推出了百元级性能小钢炮&#xff0c;全新NANK南卡OE-CC耳机。这款耳机不仅延续了南卡一贯的创新精神&#xff0c;更是为用户带来了卓越的音质和性能体验。南卡OE-CC的上线&#xff0c;再次彰显了南卡作为行业先驱者的地位&#xff0c;为用…

中科驭数受邀在招商银行金融科技论坛作异构计算主题分享 解码金融科技先进算力构建之路

8月25日&#xff0c;2023招银浦江金融科技论坛正式召开。中科驭数高级副总裁张宇受邀在资管科技分论坛发表《金融行业先进异构算力底座构建之路》的主题演讲&#xff0c;与参会嘉宾分享了当前计算系统的发展趋势以及如何通过异构算力构建IT技术底座来推动金融科技的创新。 ▲ 中…

行政如何借助ChatGPT提高效率

文章目录 ChatGPT的优势与局限行政人员的核心价值行政人员应对策略借助ChatGPT提高效率结论 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区 &a…