基于STM32G031最小系统模块的扩展板设计
- 概述
本文使用STM32G031最小系统模块,设计了一块扩展板。扩展板具有GPIO、ADC、SPI屏幕等接口,可通过扩展板学习STM32G031单片机的使用与编程。
扩展板的原理框图如下图所示
扩展板引出了ADC0和ADC1两路模拟量输入信号,可外接双轴手柄;开发板引出了8路GPIO信号,可接LED输出模块,也可接测试按键;此外,还引出了SPI接口,并引出屏幕所需的电源及控制引脚,可直接连接一块SPI彩色显示屏。因时间关系,主要测试完成了ADC和GPIO功能。
下图是扩展板的实物图。
- 硬件设计
扩展板使用的核心是STM32G031最小系统模块,通过排针引出了GPIO、ADC、SPI等接口,便于拆装与组合测试。
下图为使用Kicad设计的电路原理图
PCB打板
电路板设计问题,因本人在出差,这次考虑最简单快捷满足要求,使用了电子积木的方法。
只是设计了一个微型的“面板板”,板上只有排母,可以方便的插接和替换几种模块。
kicad进行设计时,扩展板ADC的引脚和屏幕的引脚有复用情况,这样扩展板ADC和屏幕不能同时使用。应该ADC和左边的GPIO复用部分引脚更加合理。
- 搜集素材的过程
这次重点还是软件调试这一部分。主要是STM32CubeIDE及STM32CubeProgrammer如何使用,STM32G031如何编程使用HAL库。
网上相关资料比较丰富,重点参考了CSDN网站资料。
STM32G031-使用STM32CubeIDE实现DMA处理ADC ,
https://blog.csdn.net/qq_43715171/article/details/113754776
STM32Cube生成hex,bin文件
https://blog.csdn.net/dnct55/article/details/130050708
- 软件调试
软件使用ST公司的开发环境STM32CubeIDE 1.13.1进行编程,下载时使用STM32CubeProgrammer通过usb连接核心板的uart口进行下载。
调试时,需要按住boot,然后USB插入电脑,即可识别UART;
或者插入电脑USB后,按住boot,然后点击一下reset,再同时松开按钮也可。
本次实现的功能
功能1:跑马灯
通过扩展板左侧的GPIO排母,连接一个多路LED指示灯模块,实现指示灯闪烁功能。
功能2:ADC手柄测试
通过手柄上下左右四个方向,控制四个指示灯点亮。
- 关键代码及说明
指示灯闪烁例程中,在main函数中添加以下代码。
首先初始化GPIO端口,SET为端口置1;Reset为端口置0.
然后在while循环中,通过延时定时控制引脚翻转。
HAL_GPIO_WritePin(GPIOB, DIO0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, DIO1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, DIO2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, DIO3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, DIO4_Pin, GPIO_PIN_SET);
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(GPIOB, DIO0_Pin);
HAL_GPIO_TogglePin(GPIOB, DIO1_Pin);
HAL_GPIO_TogglePin(GPIOA, DIO2_Pin);
HAL_GPIO_TogglePin(GPIOC, DIO3_Pin);
HAL_GPIO_TogglePin(GPIOA, DIO4_Pin);
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
- 在ADC转换的例程中
重点是使用STM32CubeIDE对引脚进行配置
配置完引脚,软件会自动生成关键代码。详细ADC配置过程见上文提到的ADC参考链接。
在此基础上,再增加下面的代码。根据两路ADC的采样值,控制GPIO输出。
if (ad0<1000) //x轴 左 //最大值4095
{
HAL_GPIO_WritePin(GPIOB, DIO0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, DIO1_Pin,GPIO_PIN_RESET);
}
else if (ad0>3000) //x轴 右
{
HAL_GPIO_WritePin(GPIOB, DIO0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, DIO1_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOB, DIO0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, DIO1_Pin,GPIO_PIN_RESET);
}
if (ad1<1000) // y轴 上 最大值4095
{
HAL_GPIO_WritePin(GPIOA, DIO2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, DIO3_Pin,GPIO_PIN_RESET);
}
else if (ad1>3000) //y轴 下
{
HAL_GPIO_WritePin(GPIOA, DIO2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, DIO3_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA, DIO2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, DIO3_Pin,GPIO_PIN_RESET);
}
- STM32G031核心模块的优势与局限
STM32G031优势是体积小巧,接口资源丰富,便于携带,方便连接电子积木,随时学习。
可通过USB的Uart编程,编程也比较方便,不使用ST-LINK下载器就可以下载程序。
当然,USB下载也有局限,不便于在线调试,下载时需要切换编程软件和下载软件两个软件,操作比较麻烦。