基于WeDesign第4期:基于STM32G031核心模块的扩展板设计--灯光
利用STM32G031核心模块为核心板再用扩展板设计制作灯光切换,可以进行设定或者取消灯光设置,可以通过按键进行灯光的切换等。
标签
嵌入式系统
PCB设计
meiyao
更新2023-09-06
337

1、主要的功能如下:

使用STM32G031核心模块来设计扩展板,并将其应用到一个灯光切换的设计中。

在设计中,我首先确定了灯光的功能需求,包括声音鸣叫、闪光灯设置。

接下来,使用stm32CubeMX软件来配置stm32G031芯片的引脚和功能。这个软件可以帮助快速地生成初始化代码,包括时钟、GPIO和外设等。

然后,根据硬件设计了的电路图,将所有的硬件组件焊接起来。这个电路图包括了电源、复位和调试接口(暂时是预留SWD接口)等。

最后,通过使用Keil MDK开发工具来编写应用程序代码。代码包括了初始化、中断处理和通信、操作等部分。

通过这个设计,成功地实现了一个基于stm32G031核心模块的灯光切换,这个设计不仅

具有实用性,而且也很容易扩展和生活使用,可以根据不同的需求进行修改和优化。

2、外设和功能定义说明:

STM32G031扩展板中使用了一些外设,包括按键、LED灯、WS2812灯带和有源蜂鸣器等。

具体功能如下:

  1. 按键1:使用SW1开关控制灯光的开关,通过按下SW1开关来接通或断开报警和切换。
  2. 按键2:通过外接按键与STM32G031芯片的GPIO连接,具体来说就是控制灯光的模式。
  3. LED灯:使用PB8板载LED灯来显示整个工作的状态。
  4. WS2812灯带:通过PA8引脚连接WS2812灯带,用于显示闪烁效果。
  5. 有源蜂鸣器:通过STM32G031芯片的GPIO控制有源蜂鸣器的开关,用于发出声音报警。

外设照片:

FgGLzRuAnq099PRrdWxoVT-cKPrj

3、参考示例:

利用STM32G031驱动WS2812,示例中使用的是PB5,本人使用时是用的PA8,就这里有一点小区别。

#include "stm32g0xx.h"  
  
#define WS2812_PIN PB5  
  
void delay(unsigned int count)  
{  
    for(; count--;);  
}  
  
void write_ws2812(unsigned char *data, unsigned int length)  
{  
    unsigned char *p = data;  
    while(length--)  
    {  
        *p = *p; // 将数据逐个写入WS2812_PIN引脚  
        p++;  
        delay(60); // 为了确保信号稳定,需要延迟60微秒  
    }  
}  
  
int main(void)  
{  
    // 初始化GPIO  
    RCC->IOPENR |= RCC_IOPENR_GPIOBEN;  
    GPIOB->MODER |= GPIO_MODer_MODE5_PushPull;  
  
    // 配置WS2812_PIN引脚为输出  
    RCC->IOPENR |= RCC_IOPENR_GPIOAIEN;  
    GPIOA->MODER |= GPIO_moder_Mode_AN2;  
  
    // 将WS2812_PIN引脚连接到PA2引脚上  
    GPIOB->AFR[5] |= GPIO_AFRL_AFSEL_1;  
    GPIOB->MODER |= GPIO_moder_Mode5_Pushpull;  
  
    // 将PA2引脚配置为输出  
    GPIOA->MODER |= GPIO_moder_Mode_Out_PP;  
    GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;  
  
    // 点亮WS2812灯带  
    unsigned char data[3] = {0, 0, 0};  
    data[0] = 0x00;  
    data[1] = 0x01;  
    data[2] = 0x02;  
    write_ws2812(data, 3);  
  
    while(1)  
    {  
        // 循环控制灯带的颜色  
        data[0] = 0xFF;  
        data[1] = 0x00;  
        data[2] = 0x00;  
        write_ws2812(data, 3);  
        delay(500);  
  
        data[0] = 0x00;  
        data[1] = 0xFF;  
        data[2] = 0x00;  
        write_ws2812(data, 3);  
        delay(500);  
  
        data[0] = 0x00;  
        data[1] = 0x00;  
        data[2] = 0xFF;  
        write_ws2812(data, 3);  
        delay(500);  
    }  
}

4、板连接示意图:

FnsUaCYcHdy2ldDQLMM0OpjePCUv

 

5,核心程序:

	主程序的工作运行:
OLED_Init();
	OLED_Clear(); 
		OLED_ShowString(5,1,"Welcome user",16);
		OLED_ShowString(10,5," mei yao",16);
  while (1)
  {
		if(GPIO_ReadInputDataBit(SW2_GPIO_Port,SW2_Pin) ==SW_RSET)
		{
					HAL_Delay(10);
				if(GPIO_ReadInputDataBit(SW2_GPIO_Port,SW2_Pin) ==SW_RSET)
			{
				i++;
			}
		}
				if(GPIO_ReadInputDataBit(SW1_GPIO_Port,SW1_Pin) ==SW_RSET)
		{
					HAL_Delay(10);
				if(GPIO_ReadInputDataBit(SW1_GPIO_Port,SW1_Pin) ==SW_RSET)
			{
					OLED_Clear(); 
			ws2812_set_all_off();
			i=0;
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
			OLED_ShowString(5,1,"Welcome User",16);
			OLED_ShowString(30,5,"Unlock",16);
			OLED_ShowString(20,3,"--Run--",16);
			}
		}
		if(i==1)
		{
			ws2812_set_all_on();
		}
		else if (i==2)
		{
			OLED_Clear(); 
			ws2812_set_all_red();	
			HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin);
			OLED_ShowString(10,1,"**************",16);
			OLED_ShowString(20,3,"An Alarm",16);
			OLED_ShowString(10,5,"**************",16);
		}
		else if(i == 3)
		{
			OLED_Clear(); 
			ws2812_set_all_green();
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
			i=0;
			OLED_ShowString(5,1,"Welcome User",16);
			OLED_ShowString(10,5," RUN",16);
			OLED_ShowString(10,5," Mei Yao",16);
		}
//		else 
//		{
//			ws2812_set_all_off();
//			i=0;
//			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
//		}
			
				HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
				HAL_Delay(800);
  }
  /* USER CODE END 3 */
}

WS2812工作模式:
//¹Ø±ÕËùÓÐ
void ws2812_set_all_off(){     
	for(uint16_t i=0;i<MY_WS2812_MAX_NUM;i++){
	   ws2812_set(i,0,0,0);
	}	
}

void ws2812_set_all_on(){
     
	for(uint16_t i=0;i<MY_WS2812_MAX_NUM;i++){
	   ws2812_set(i,255,255,255);
	}
}
//red
void ws2812_set_all_red(){
     
	for(uint16_t i=0;i<MY_WS2812_MAX_NUM;i++){
	   ws2812_set(i,255,0,0);
	}
}
//green
void ws2812_set_all_green(){
     
	for(uint16_t i=0;i<MY_WS2812_MAX_NUM;i++){
	   ws2812_set(i,0,0,255);
	}
}

OLED显示:
//ÏÔʾһ¸ö×Ö·ûºÅ´®
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}

6、代码解释:

代码中的主要功能如下:

  • 初始化OLED显示屏和WS2812 LED灯带。
  • 通过GPIO读取按键SW1和SW2的状态来控制工作运行。
  • 当按下SW1按钮时,关闭灯工作的状态,并显示"Welcome User"和"Unlock"信息。
  • 当按下SW2按钮时,灯光工作时进入不同的状态,根据计数器的值进行相应的操作。
  • 计数器i的值用于控制LED灯带的颜色和闪烁频率。
  • 如果i等于1,LED灯带将全亮;如果i等于2,LED灯带将显示红色,蜂鸣器发出声音,并显示"An Alarm"信息;如果i等于3,LED灯带将显示绿色,蜂鸣器停止发声,并显示"Mei Yao"信息。
  • 最后,通过循环不断检测按键状态和更新OLED显示屏内容。

7.原理图各模块与PCB对应位图片:

FmIyv3m2lFzcVSoSDcO3QdCucdLF

FqRYK0Tp6SexJMhyCo5uzyzS_7kN

8.工作效果:

显示红灯:

FtaBjKGvJRcsaF9o1JvXjF4JipJt

显示白灯:

FqZ43RrL-gTBPAxl2D7asLL_CIvs

蓝灯显示:

FuEcDhc0aakOTyIoXUSJx4AXaCNu

9、问题点:

1、在设计时,由于非常的急,对相关的外设读的不是很认真,所以在后面写软件时,就遇到了麻烦,比如驱动不了灯工作,后面只能通过飞线完成功能。

2、对核心与底板的外设考虑不是很周到,比如OLED的方向放反了,结果只能与杜绑进行连接,原本设计是放在板上面的。

10、总结:

通过上面的设计以STM32G031核心模块,扩展实现对灯光系统的控制和切换。通过按键控制开关和模式,LED灯显示工作状态,WS2812灯带实现闪烁效果,有源蜂鸣器发出声音报警。设计具有实用性和扩展性,可根据需求进行修改和优化,从中我学习到了设计过程中要注意细节,要充分考虑周到才能设计合理等。

附件下载
软硬件.zip
链接: https://pan.baidu.com/s/1dxmDQY9Qa6Yc_peqxPShGg 提取码: gcen
团队介绍
个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号