GD32零基础教程第三节(模块化编程封装LED模块)

news2024/11/28 16:46:50

文章目录

  • 前言
  • 一、模块化编程概念
  • 二、创建HardWare文件夹管理硬件模块文件
  • 三、编写led.c和led.h文件
  • 总结


前言

模块化编程是将一个大型系统分解为更小、更易管理的模块或组件的过程。每个模块都有明确定义的接口和功能,可以独立开发、测试和维护。那么本篇文章将带大家学习模块化编程。

一、模块化编程概念

模块化编程是一种软件设计方法,其中将一个大型软件系统分解为多个相互独立、可重用的模块或组件。每个模块都负责执行特定的功能,并且与其他模块之间通过明确定义的接口进行通信。在模块化编程中,常常使用 .h 和 .c 文件来组织和管理模块的实现。

概念:

分解和抽象: 模块化编程通过将整个系统分解为小的、独立的模块,每个模块都有清晰的责任和功能。这种分解使得软件系统更易于理解、维护和扩展。

封装和接口定义: 每个模块都被封装在一个独立的单元中,并且与其他模块之间通过明确定义的接口进行通信。这种接口定义规定了模块之间允许的交互方式,提供了一种清晰的交互界面,使得模块之间的耦合度降低,增强了代码的灵活性和可重用性。

可重用性和扩展性: 模块化编程使得每个模块都可以独立开发、测试和维护,同时也可以被其他模块或项目所重用。这种重用性和扩展性使得开发人员可以更加高效地构建新的系统,同时也可以更容易地维护和升级现有系统。

为什么要有模块化编程?

提高可维护性: 将一个大型软件系统分解为多个模块可以降低系统的复杂度,使得每个模块都可以独立进行开发、测试和维护。这种分解可以提高代码的可读性和可维护性,使得系统更易于理解和修改。

增强可重用性: 模块化编程使得每个模块都可以独立地开发和测试,并且可以被其他模块或项目所重用。这种可重用性使得开发人员可以更加高效地构建新的系统,同时也可以减少重复开发的工作量。

提高开发效率: 模块化编程使得开发工作可以并行进行,不同的团队可以独立地开发不同的模块。这种并行开发可以提高开发效率,缩短项目的开发周期,更快地将产品推向市场。

增强系统的可扩展性和灵活性: 模块化编程使得系统的不同部分可以独立扩展和修改,而不会对整个系统造成影响。这种灵活性使得系统更易于适应需求变化和技术更新,保持系统的长期可用性和竞争力。总的来说,模块化编程通过将系统分解为相互独立、可重用的模块,提高了软件系统的可维护性、可重用性、开发效率和系统的可扩展性和灵活性,是一种常见且有效的软件设计和开发方法。

二、创建HardWare文件夹管理硬件模块文件

在工程根目录下创建HardWare文件夹用于存放硬件模块的文件。
在这里插入图片描述
在HardWare文件夹下创建led.c和led.h文件:
在这里插入图片描述
在keil中添加HardWare分组:
在这里插入图片描述
在这里插入图片描述
将led.c文件添加进入HardWare分组中:
在这里插入图片描述
添加HardWare到路径中:
在这里插入图片描述
在这里插入图片描述

三、编写led.c和led.h文件

led.c文件:

#include "led.h"

void LED_Init(void)
{
    LED_GPIO_CLK_EN(); // 使能LED引脚所在的GPIO端口时钟
    gpio_mode_set(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN); // 配置LED引脚为输出模式,无上下拉
    gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_PIN); // 设置LED引脚为推挽输出,输出速度50MHz
}

void LED_ON(void)
{
    gpio_bit_set(LED_PORT, LED_PIN); // 将LED引脚置高,点亮LED
}

void LED_OFF(void)
{
    gpio_bit_reset(LED_PORT, LED_PIN); // 将LED引脚置低,关闭LED
}

led.h文件:

//防止头文件重复包含
#ifndef LED_H
#define LED_H

#include "gd32f4xx.h" // 包含了该系列芯片的寄存器定义、常量定义和函数声明等信息
#include "gd32f4xx_libopt.h" // GD32F4 系列芯片的外设库选项配置文件

#define LED_PORT GPIOB // LED所连接的GPIO端口
#define LED_PIN GPIO_PIN_4 // LED所连接的GPIO引脚

// 使能LED所连接的GPIO端口时钟
#define LED_GPIO_CLK_EN() rcu_periph_clock_enable(RCU_GPIOB)

/**
 * @brief 初始化LED
 * @note 调用此函数前需要确保已经使能LED所连接的GPIO端口时钟
 */
void LED_Init(void);

/**
 * @brief 将LED打开
 */
void LED_ON(void);

/**
 * @brief 将LED关闭
 */
void LED_OFF(void);

#endif

main函数中调用:

#include "gd32f4xx.h"//包含了该系列芯片的寄存器定义、常量定义和函数声明等信息
#include "gd32f4xx_libopt.h"//GD32F4 系列芯片的外设库选项配置文件
#include "systick.h"//配置和使用 SysTick 定时器的功能文件

#include "led.h"

int main(void)
{
    systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
			
		LED_Init();//初始化LED灯模块
	
    while(1)
		{
        LED_ON();//PB4输出高电平
        delay_1ms(100);//等待100ms
        LED_OFF();//PB4输出低电平
        delay_1ms(100);		
    }
}

总结

本篇文章就讲解到这里,希望大家可以下去自己实践一下这个代码,体验模块化编程的好处和强大。

源码:链接:https://pan.baidu.com/s/1U-ZzqTMN3Nvi8WBfpLU7Pw
提取码:xtt5

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

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

相关文章

相位导数方差计算-matlab

%% 下面计算 相位导数方差% 假设 phase_map 是你的相位图二维矩阵 % K 是窗口的大小 k 3; % 请使用实际的窗口大小替换% 计算 x 和 y 方向的偏导 [dx, dy] gradient(wrappedPhase); Ksq k^2; % 计算 K^2half_k floor(k / 2);% 初始化结果矩阵 result zeros(size(wrappedPh…

蓝桥杯刷题--RDay6

特殊日期 3.特殊日期 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2408/learning/?first_category_id1&page1&second_category_id3&tags2023 对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月…

【Django开发】前后端分离美多商城项目第6篇:用户部分,1. 业务说明【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人。项目准备,配置1. 修改set…

单例模式--理解

单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。 单…

基于单片机室内温湿度监测系统仿真设计

**单片机设计介绍,基于单片机室内温湿度监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机室内温湿度监测系统仿真设计的沟通概要主要涉及以下几个方面: 一、项目背景与目标 首…

借助 Aspose.Words,在 C# 中将图片转换为 Word

Microsoft Word 提供了多种用于生成具有增强的格式化功能的文本文档的工具。除了文本格式之外,我们还可以将各种图形元素和图像合并到Word文档中。在某些情况下,我们可能需要将图片或照片插入DOC或DOCX格式的Word文档中。在本文中,我们将学习…

【redis数据同步】redis-shake数据同步全量+增量

redis-shake数据同步 redis-shake是基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync。 恢复restore:将RDB文件恢复到目的redis数据库。备份dump:将源redis的全量数据通过RDB文件备份起来。解析de…

个推助力小米汽车APP实现智能用户触达,打造智能出行新体验

4月3日,小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行,全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付,小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用&#xff…

Echarts基础-安装语法高亮插件less-rem转换动态适配大小

Echarts基础-安装语法高亮插件&less-rem转换动态适配大小 基础介绍插件安装教程安装less 插件安装cssrem 插件引入flexibel.js文件 基础介绍 Echarts是一个功能强大的JavaScript开源可视化库,专门用于创建各种图表和数据可视化。 以下是关于Echarts的一些基础介…

区块链技术与数字身份:解析Web3的身份验证系统

在数字化时代,随着个人数据的日益增多和网络安全的日益关注,传统的身份验证系统面临着越来越多的挑战和限制。在这种背景下,区块链技术的出现为解决这一问题提供了全新的思路和解决方案。Web3作为一个去中心化的互联网模式,其身份…

Elasticsearch快速上手

基本概念 索引(Index) 索引是文档的容器,就像关系数据库中,要存储行记录必须先创建数据库和表一样。 类型(Type) ES6 及之前的版本还存在”类型“的概念,一个索引下可以存储多个类型的文档&am…

电脑怎么录屏带声音?这么操作就对了!

随着数字化时代的快速发展,电脑录屏带声音的需求逐渐增多。无论是为了制作教学视频、游戏解说,还是为了记录会议内容,一个稳定、易用的录屏工具都是必不可少的,可是电脑怎么录屏带声音呢?本文将介绍两种电脑录屏方法&a…

五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算,今年清明节假期3天全国国内旅游出游1.19亿人次,按可比口径较2019年同期增长11.5%;国内游客出游花费539.5亿元,较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

Java知识体系最强总结(2024版)

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

LLM - 大语言模型(LLM) 的 应用技术

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137503579 大语言模型(LLM) 的应用技术范围非常广泛,即: LangChain:开发框架,专为大型语言模型设计,以提高开发人工智能应用的效率,允许开发者将语言模…

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】

基于springboot实现墙绘产品展示交易平台系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&#xff…

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 一个数如果从左往右读和从右往左读数字是完全相同的,则称这个数为回文数,比如898,1221,15651都是回文数。编写…

[STL-list]介绍、与vector的对比、模拟实现的迭代器问题

一、list使用介绍 list的底层是带头双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行…

nginx部署前端教程

目录 一、前言二、部署三、注意四、参考 一、前言 一般来说现在的软件项目,都是分用户端以及管理端的,并且是前后端分离的,这里我来记录一下部署两个前端的教程。 部署前端之前需要的准备工作是部署springBoot后端程序,这里我do…