前言

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

一、模块化编程概念

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

概念:

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

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

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

为什么要有模块化编程?

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

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

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

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

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

在工程根目录下创建HardWare文件夹用于存放硬件模块的文件。
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
在HardWare文件夹下创建led.c和led.h文件:
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
在keil中添加HardWare分组:
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
将led.c文件添加进入HardWare分组中:
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
添加HardWare到路径中:
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP
GD32零基础教程第三节(模块化编程封装LED模块)-LMLPHP

三、编写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

04-08 14:04