1、主要的功能如下:
使用STM32G031核心模块来设计扩展板,并将其应用到一个灯光切换的设计中。
在设计中,我首先确定了灯光的功能需求,包括声音鸣叫、闪光灯设置。
接下来,使用stm32CubeMX软件来配置stm32G031芯片的引脚和功能。这个软件可以帮助快速地生成初始化代码,包括时钟、GPIO和外设等。
然后,根据硬件设计了的电路图,将所有的硬件组件焊接起来。这个电路图包括了电源、复位和调试接口(暂时是预留SWD接口)等。
最后,通过使用Keil MDK开发工具来编写应用程序代码。代码包括了初始化、中断处理和通信、操作等部分。
通过这个设计,成功地实现了一个基于stm32G031核心模块的灯光切换,这个设计不仅
具有实用性,而且也很容易扩展和生活使用,可以根据不同的需求进行修改和优化。
2、外设和功能定义说明:
STM32G031扩展板中使用了一些外设,包括按键、LED灯、WS2812灯带和有源蜂鸣器等。
具体功能如下:
- 按键1:使用SW1开关控制灯光的开关,通过按下SW1开关来接通或断开报警和切换。
- 按键2:通过外接按键与STM32G031芯片的GPIO连接,具体来说就是控制灯光的模式。
- LED灯:使用PB8板载LED灯来显示整个工作的状态。
- WS2812灯带:通过PA8引脚连接WS2812灯带,用于显示闪烁效果。
- 有源蜂鸣器:通过STM32G031芯片的GPIO控制有源蜂鸣器的开关,用于发出声音报警。
外设照片:
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、板连接示意图:
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对应位图片:
8.工作效果:
显示红灯:
显示白灯:
蓝灯显示:
9、问题点:
1、在设计时,由于非常的急,对相关的外设读的不是很认真,所以在后面写软件时,就遇到了麻烦,比如驱动不了灯工作,后面只能通过飞线完成功能。
2、对核心与底板的外设考虑不是很周到,比如OLED的方向放反了,结果只能与杜绑进行连接,原本设计是放在板上面的。
10、总结:
通过上面的设计以STM32G031核心模块,扩展实现对灯光系统的控制和切换。通过按键控制开关和模式,LED灯显示工作状态,WS2812灯带实现闪烁效果,有源蜂鸣器发出声音报警。设计具有实用性和扩展性,可根据需求进行修改和优化,从中我学习到了设计过程中要注意细节,要充分考虑周到才能设计合理等。