前言
模块化编程是一种编程方法,旨在提高开发效率、代码复用性和可维护性。
单片机模块化编程把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,这样其他.c文件只需通过#include "XXX.h"文件即可使用其中的代码。模块化编程提高了代码的可阅读性、可维护性和可移植性,有助于简化代码结构和提升开发效率。
一、创建一个源文件(例如:led.c),用于实现模块的功能函数,并添加进工程里。
#include "led.h"
#include "stm32f4xx_conf.h"
void LED_init(void)
{
GPIO_InitTypeDef gpio_info;
//PH0
//初始化GPIOH时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOH,&gpio_info);
LED_Red_Ctrl(LED_OFF);
LED_Blue_Ctrl(LED_OFF);
LED_Green_Ctrl(LED_OFF);
}
void LED_Red_Ctrl(uint8_t state)
{
if(state == 1) //1表示开灯
{
GPIO_ResetBits(GPIOH,LED_RED); //点亮红灯
}
else //其他表示关闭红灯
{
GPIO_SetBits(GPIOH,LED_RED);
}
}
void LED_Green_Ctrl(uint8_t state)
{
if(state == 1) //1表示开灯
{
GPIO_ResetBits(GPIOH,LED_GREEN); //点亮绿灯
}
else //其他表示关闭绿灯
{
GPIO_SetBits(GPIOH,LED_GREEN);
}
}
void LED_Blue_Ctrl(uint8_t state)
{
if(state == 1) //1表示开灯
{
GPIO_ResetBits(GPIOH,LED_BLUE); //点亮蓝灯
}
else //其他表示关闭蓝灯
{
GPIO_SetBits(GPIOH,LED_BLUE);
}
}
void LED_Beeo_Ctrl(uint8_t state)
{
if(state == 1) //1表示开灯
{
GPIO_ResetBits(GPIOI,Beep_BLUE); //点亮蓝灯
}
else //其他表示关闭蓝灯
{
GPIO_SetBits(GPIOI,Beep_BLUE);
}
}
注:记得在.c文件添加#include "led.h"进行调用。
二、创建一个头文件(例如:led.h),用于声明模块的功能函数:
确定需要实现的功能和模块的划分。将程序拆分为可以独立完成某个功能的模块。
#ifndef __LED_H_
#define __LED_H_
#include "stm32F4xx.h"
#define LED_RED GPIO_Pin_10
#define LED_GREEN GPIO_Pin_11
#define LED_BLUE GPIO_Pin_12
#define Beep_BLUE GPIO_Pin_11
#define LED_ON 1
#define LED_OFF 0
//初始化LED灯
void LED_init(void);
void LED_Red_Ctrl(uint8_t state);
void LED_Green_Ctrl(uint8_t state);
void LED_Blue_Ctrl(uint8_t state);
void LED_Beeo_Ctrl(uint8_t state);
#endif
三、在主程序中调用模块的功能函数:
nt main(void)
{
GPIO_InitTypeDef gpio_info;
// LED_init();
// key1_init();
// key2_init();
Delay_init();
UART_init(115200);
ADC_init();
//PI11
//初始化GPIOI时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_11;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpio_info);
//初始化 ADC
//1.初始化引脚 PC3
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_AN;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_3;
gpio_info.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_info.GPIO_Speed = GPIO_High_Speed;
GPIO_Init(GPIOC,&gpio_info);
while(1)
{
//printf("%d\r\n",adc_value);
printf("ADC: %d\r\nVol: %3.3fv\r\n\r\n",adc_value,adc_value*3.3/4096);
Delay_ms(500);
}
}
四、总结
STM32模块化编程是一种在STM32微控制器上实现功能模块化的编程方法,它将程序分解为独立的模块,每个模块负责实现特定的功能。这种方法的优点主要包括以下几个方面:
- 提高代码可读性:模块化编程通过将程序拆分为多个模块,每个模块专注于解决特定的问题,使得代码更加清晰、易于理解。这种结构化的编程方式使得开发者能够更快地定位和调试错误,提高开发效率。
- 提高代码可维护性:模块化的设计使得代码的修改更加方便,开发者只需要关注特定模块的实现细节,而不需要担心整个程序的影响。这种解耦合的设计使得开发者能够更加灵活地对系统进行扩展和改进,减少了代码维护的成本。
- 提高代码可重用性:通过将功能独立的模块封装起来,开发者可以在不同的项目中复用这些模块,减少了重复编写代码的工作量。这种代码的复用性不仅提高了开发效率,还可以减少潜在的错误。
综上所述,STM32模块化编程的优点在于提高代码的可读性、可维护性和可重用性,但也需要注意其可能带来的额外开销和模块划分的合理性。