基于立创GD32E230C8T6开发板的5V继电器模块驱动与移植实战

发布时间:2026/7/7 10:50:29

基于立创GD32E230C8T6开发板的5V继电器模块驱动与移植实战 基于立创GD32E230C8T6开发板的5V继电器模块驱动与移植实战最近在做一个智能家居的小项目需要用单片机控制一个220V的灯泡这自然就用到了继电器。手头正好有立创的GD32E230C8T6开发板和一块常见的5V继电器模块但网上的资料多是针对STM32的。于是我把驱动这块继电器模块的代码完整地移植到了GD32E230上整个过程踩了一些坑也总结了不少经验。今天我就把这个从硬件原理分析到软件代码移植的完整过程手把手地分享给大家就算是嵌入式新手跟着做也能搞定。1. 认识我们的“开关”5V继电器模块在开始写代码之前咱们得先搞清楚要控制的对象到底是什么。继电器你可以把它理解成一个用“小电流”控制“大电流”的电子开关。咱们常用的这种5V继电器模块就是为了让像GD32E230这样工作电压只有3.3V的单片机能够安全、方便地去控制220V的家用电器。我用的这块模块在淘宝上很常见核心参数如下项目参数控制电压5V DC控制端GPIO (单片机引脚)被控制交流电压≤ 250V, 10A被控制直流电压≤ 30V, 10A特点光耦隔离、三极管驱动、低电平触发注意模块上通常标有“低电平触发”或“低电平吸合”意思是当控制引脚给低电平0V时继电器“咔哒”一声吸合电路接通给高电平如3.3V或5V时继电器断开。这个逻辑非常重要写代码时会用到。模块引出了4个排针2.54mm间距分别是VCC接5V电源正极。GND接电源负极。IN(或 SIG)控制信号输入脚接单片机的GPIO。NC可能空置或者作为第二个控制通道我这是一路继电器模块所以主要用前三个。2. 模块内部是怎么工作的很多朋友直接用模块却不看原理出了问题就一头雾水。咱们简单拆解一下这个模块的“黑盒子”理解了原理调试时心里才有底。模块的核心工作流程是这样的单片机GPIO (低电平) → 光耦导通 → 三极管导通 → 继电器线圈得电 → 触点吸合光耦隔离这是模块保护单片机的关键。当你的单片机GPIO输出低电平到IN脚时光耦内部的发光二极管点亮导致另一端的光敏三极管导通。这样一来控制信号通过“光”来传递单片机侧和继电器侧的电路在电气上是完全隔开的。即使继电器那边控制220V高压出了什么问题也不会烧坏你宝贵的单片机芯片。三极管驱动光耦导通后为后面的功率三极管提供了基极电流使三极管饱和导通。此时5V的VCC电源得以流过继电器的线圈产生磁场。继电器动作线圈产生磁力吸合内部的机械衔铁使公共端触点从常闭端切换到常开端从而接通你外部的高压电路比如灯泡的220V火线。整个过程中你的单片机只做了一个非常轻量的工作控制一个GPIO输出低电平。剩下的电流放大、电气隔离都由模块完成了。这就是使用模块的便利之处。3. 硬件连接把板子和模块连起来硬件连接很简单但一定要仔细接错电源可能烧毁设备。所需材料立创 GD32E230C8T6 开发板 一块5V继电器模块 一块杜邦线 若干公对母5V电源可以从开发板的5V引脚取或者用USB供电万用表可选用于调试连接步骤供电用杜邦线将开发板的5V引脚连接到继电器模块的VCC引脚。将开发板的GND连接到继电器模块的GND。确保共地这是电路正常工作的基础。控制信号选择开发板上的一个GPIO引脚作为控制脚例如我选择的是PA1。用杜邦线将PA1连接到继电器模块的IN(或 SIG) 信号引脚。高压端连接演示用低压安全替代为了绝对安全咱们先不接220V可以用一个LED灯和电池盒来模拟。将继电器模块的常开端(NO) 和公共端(COM) 串联到电池盒和LED的电路中。这样当继电器吸合时LED电路接通灯就会亮起。连接示意图如下实际连接请务必对照开发板原理图立创开发板 5V继电器模块 5V -------------------- VCC GND -------------------- GND PA1 -------------------- IN安全提示在熟练掌握并确认继电器工作正常前严禁连接220V市电。调试阶段请务必使用低压直流电源如12V/24V电池或电源适配器和负载如LED、小电机进行测试。4. 软件驱动编写GD32E230的继电器控制代码硬件搭好了接下来就是让GD32E230的“大脑”去控制这个“开关”。咱们的代码结构清晰分为头文件定义和源文件实现。4.1 头文件定义 (bsp_relay.h)头文件的主要作用是进行宏定义和函数声明这样代码看起来更清晰修改引脚也方便。#ifndef _BSP_RELAY_H_ #define _BSP_RELAY_H_ #include gd32e23x.h // 包含GD32E230的固件库头文件 // 硬件引脚定义我们使用PA1控制继电器 #define RCU_RELAY_IN RCU_GPIOA // 定义GPIOA的时钟 #define PORT_RELAY_IN GPIOA // 定义端口为GPIOA #define GPIO_RELAY_IN GPIO_PIN_1 // 定义引脚为第1脚 (PA1) // 继电器输出控制宏这是一个技巧让代码更易读 // 当x为0时输出低电平继电器吸合x非0时输出高电平继电器断开 #define RELAY_OUT(x) gpio_bit_write(PORT_RELAY_IN, GPIO_RELAY_IN, (x)?SET:RESET) // 函数声明 void Relay_GPIO_Init(void); // 初始化继电器控制引脚 void Set_Relay_Switch(unsigned char state); // 设置继电器状态 #endif代码解读RELAY_OUT(x)这个宏定义是精髓。它利用了C语言的三目运算符gpio_bit_write是GD32库函数用于对一个引脚进行写操作。这样我们在主程序里调用RELAY_OUT(0)就表示让PA1输出低电平非常直观。如果你想换到其他引脚比如PB0只需要修改RCU_RELAY_IN,PORT_RELAY_IN和GPIO_RELAY_IN这三个宏的定义即可。4.2 源文件实现 (bsp_relay.c)源文件包含了函数的具体实现。#include bsp_relay.h #include systick.h // 如果需要延时会用到 /** * brief 继电器控制引脚初始化 * param 无 * retval 无 * note 将指定的GPIO配置为上拉推挽输出模式初始状态为高电平继电器断开 */ void Relay_GPIO_Init(void) { /* 第一步开启GPIOA的时钟 */ rcu_periph_clock_enable(RCU_RELAY_IN); // 相当于给GPIOA这个外设通电 /* 第二步配置引脚模式为上拉输出模式 */ // GPIO_MODE_OUTPUT: 设置为输出模式 // GPIO_PUPD_PULLUP: 启用内部上拉电阻。默认上拉至高电平确保初始化时继电器处于断开状态更安全。 gpio_mode_set(PORT_RELAY_IN, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_RELAY_IN); /* 第三步配置输出选项为推挽输出速度50MHz */ // GPIO_OTYPE_PP: 推挽输出能稳定输出高/低电平驱动能力强。 // GPIO_OSPEED_50MHZ: 输出速度设为高速。对于继电器控制速度要求不高但设为高速也无妨。 gpio_output_options_set(PORT_RELAY_IN, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_RELAY_IN); /* 第四步隐含初始化后引脚默认输出高电平由上拉决定继电器断开 */ } /** * brief 设置继电器开关状态 * param state: 0 - 继电器吸合1 - 继电器断开 * retval 无 */ void Set_Relay_Switch(unsigned char state) { RELAY_OUT(state); // 直接调用宏定义控制引脚电平 }关键点解析时钟使能 (RCU)GD32的任何外设包括GPIO在使用前都必须先打开对应的时钟。这就像你要用一个电器必须先插上电一样。RCU_GPIOA就是GPIOA的时钟开关。上拉电阻 (PULLUP)配置为上拉模式后当GPIO不主动输出时引脚会被内部电阻拉到高电平。这里我们主动初始化输出高电平再加上上拉是双保险防止单片机刚启动、程序还没运行时引脚状态不确定导致继电器误动作。推挽输出 (PP)推挽输出模式可以主动输出强高电平和强低电平适合直接驱动像光耦LED这类负载。如果是“开漏输出”则无法主动输出高电平。5. 工程移植与主程序测试现在我们把写好的驱动文件加入到你的GD32工程中并编写主函数来测试。5.1 文件移植在你的工程目录下例如User或BSP文件夹新建bsp_relay.c和bsp_relay.h文件将上面的代码分别复制进去。在IDE如Keil MDK的工程管理器中将bsp_relay.c文件添加到你的项目。确保在需要调用继电器函数的源文件如main.c中包含了头文件#include bsp_relay.h。5.2 主函数测试 (main.c)下面是一个简单的测试程序让继电器上电后吸合。#include gd32e23x.h #include systick.h // 系统滴答定时器用于延时 #include bsp_usart.h // 串口用于打印信息可选 #include bsp_relay.h // 我们的继电器驱动 #include stdio.h // 为了使用printf可选 int main(void) { // 系统初始化 systick_config(); // 初始化1ms的滴答定时器很多延时函数依赖它 usart_gpio_config(115200U); // 初始化串口波特率115200如果不需要打印可删除 // 继电器初始化 Relay_GPIO_Init(); printf(Relay Control Demo Start!\r\n); // 打印开始信息 // 控制继电器吸合 Set_Relay_Switch(0); // 传入0输出低电平继电器“咔哒”吸合 printf(Relay ON!\r\n); delay_ms(2000); // 等待2秒使用systick实现的延时函数 // 控制继电器断开 Set_Relay_Switch(1); // 传入非0值这里为1输出高电平继电器断开 printf(Relay OFF!\r\n); while(1) { // 可以在这里添加其他功能或者让继电器按一定间隔吸合/断开 // Set_Relay_Switch(0); // delay_ms(1000); // Set_Relay_Switch(1); // delay_ms(1000); } }5.3 现象与调试编译下载将代码编译无误后下载到立创GD32E230开发板。上电现象开发板上电后你应该能立刻听到继电器模块发出一声清脆的“咔哒”这是吸合的声音。同时如果你接了LED模拟负载LED应该点亮。2秒后又会听到一声“咔哒”继电器断开LED熄灭。串口监视如果连接了串口可以在PC端的串口助手如Putty、XCOM上看到打印的Relay Control Demo Start!等信息。6. 实战中可能遇到的坑与心得没有“咔哒”声首先检查硬件连接5V和GND是否接反或接错用万用表量一下模块VCC和GND之间是否有5V电压。然后检查控制线是否接对了GPIO引脚。继电器一直吸合或一直断开检查代码中的电平逻辑。确认你的模块是低电平触发。用万用表测量控制引脚IN对GND的电压在调用Set_Relay_Switch(0)后应该是接近0V调用Set_Relay_Switch(1)后应该是接近3.3V因为单片机IO口是3.3V电平。虽然模块标称5V控制但3.3V的高电平通常也能被可靠地识别为“高”。负载不工作如果继电器有动作声但负载如LED不亮检查你接在继电器输出端COM和NO的负载电路是否完好电源是否正常。关于驱动能力GD32E230的GPIO引脚驱动能力有限通常几个mA直接驱动继电器线圈是不可能的。这就是为什么继电器模块内部要用三极管来放大电流。我们的代码只负责提供控制信号。工程移植如果你是从其他平台如STM32移植过来最关键的是把引脚配置的库函数换成GD32的。GD32的库函数命名和风格与STM32标准库非常相似但前缀和部分函数名不同需要对照GD32的库文件仔细修改。把这个5V继电器模块在GD32E230上跑起来可以说是单片机控制外部功率设备的第一步。理解了光耦隔离、三极管驱动和GPIO配置以后再玩电磁阀、电机驱动模块思路都是相通的。希望这篇实战教程能帮你顺利点亮第一个被控的“大功率”设备。

相关新闻