一、前言
在FastBond3基础部分的文档中,完成了方案框图的绘制,这次挑战部分将会完成整个PCB的绘制以及实现点亮一个led的功能。
项目和创意方向介绍:本项目旨在开发一款基于STM32G030的自制开发板,预留多个IO口,以便为后续的开发和学习提供良好的基础平台。同时将在此板上实现点亮一个LED灯的功能,以探索物联网方向的创意应用。
二、原理图及PCB介绍
供电部分使用Typec接口5V供电,通过AMS1117降压到3.3V给STM32F103CBT6和STM32G030F6P6供电。
AMS1117:
AMS1117是一款输出电流为1A的三端输出低压差线性稳压器,有1.2V、1.8V、2.5V、3.3V、5.0V及输出电压可调等多种版本,其在1A的电压降仅为1.2V。以其优异的性能和极致的经济性能,适用于各种电器产品。
●有固定输出电压1.2V、1.8V、2.5V、3.3V、5.0V及可调输出电压版本
●固定输出电压1.2V电压精度为2%
●固定输出电压1.8V、2.5V、3.3V、5.0V及可调输出电压精度为1.5%
●温度范围:-40℃~ + 125℃
AMS1117的应用电路IN和OUT端都需要接1个100nF的滤高频,和一个220uF的贴片型铝电解电容滤低频。
STM32G030F6P6
STM32G030F6P6主流超值系列Arm Cortex-M0+ MCU,工作频率高达64 MHz。它们提供高水平的集成,适用于消费,工业和家电领域的广泛应用,并为物联网(IoT)解决方案做好准备。包括一个内存保护单元(MPU)、高速嵌入式存储器(高达64 kb的Flash程序存储器和8 kb的SRAM)、DMA和广泛的系统功能、增强的I/ o和外设。器件提供标准通信接口(2个i2c, 2个spi / 1个I2S和2个usart), 1个12位ADC (2.5 MSps),最多19个通道,1个低功耗RTC, 1个高级控制PWM定时器,4个通用16位定时器,2个看门狗定时器和1个SysTick定时器。设备工作环境温度为-40 ~ 85℃。它们可以在2.0 V到3.6 V的电源电压下工作。优化的动态消耗与一套全面的节能模式相结合,允许设计低功耗应用。VBAT直接电池输入允许保持RTC和备用寄存器供电。
特性
- 核心:Arm 32 位 Cortex-M0+ CPU,频率高达 64 MHz®®
- -40°C至85°C工作温度
- 记忆
- 高达 64 KB 的闪存,带保护功能
- 8 KB SRAM,带硬件奇偶校验
- CRC计算单元
- 复位和电源管理
- 电压范围:2.0 V 至 3.6 V
- 上电/断电复位 (POR/PDR)
- 低功耗模式:睡眠、停止、待机
- 时钟管理
- 4 至 48 MHz 晶体振荡器
- 带校准功能的 32 kHz 晶体振荡器
- 内部 16 MHz RC,带 PLL 选项
- 内部 32 kHz RC 振荡器 (±5 %)
- 多达 44 个快速 I/O
- 所有映射均可在外部中断向量上
- 多个 5 V 耐压 I/O
- 具有灵活映射功能的 5 通道 DMA 控制器
- 12 位、0.4 μs ADC(多达 16 个外部通道)
- 高达 16 位,具有硬件过采样功能
- 转换范围:0 至 3.6V
- 8 个定时器:16 位用于高级电机控制、4 个 16 位通用定时器、2 个看门狗、SysTick 定时器
- 日历 RTC,带闹钟和定期从停止/待机唤醒
- 通信接口
- 两个i2c总线接口支持Fast-mode Plus (1mbit /s)与额外的电流吸收,一个支持SMBus/PMBus和从停止模式唤醒
- 两个USART,带主/从同步SPI;一个支持ISO7816接口、LIN、IrDA 功能、自动波特率检测和唤醒功能
- 2个spi (32mbit /s), 4 ~ 16位可编程位帧,1个多路复用I2S接口
- 开发支持:串行线调试(SWD)
- 所有封装均ECOPACK2兼容
STM32G030F6P6的外围电路很简单,仅添加了两个去耦电容和一个控制使用的LED。
在这里将DAPlink部分与STM32G030F6P6部分分隔开,通过跳线帽连接。
在设计时还使用了指定厂家Rohm Semiconductor制造的100欧的贴片电阻,功率为0.063W,容差 ±1%。
三、成品功能测试
pcb打板后焊接的照片,在这里遇到了一个问题,就是两端的排针相距的有一点远,使用跳线帽无法将DAPlink与STM32G030F6P6进行连接,所以现在只能使用杜邦线将两端连接,影响了整体的美观。
关键代码及说明:
uint8_t Rx_dat = 0;
uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Closed!\r\n";
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(Rx_dat == 0xa1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000);
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
}
else if(Rx_dat == 0xa2)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000);
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
}
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
// HAL_Delay(1000);
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000); //向上位机发送“hello world!”
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
// HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
程序中首先初始化GPIO、UART两种功能。其中UART用于测试DAPlink的功能,GPIO用于点亮LED灯,在串口中断中对上位机发送的数据进行处理,一上电STM32G030F6P6向上位机发送"hello world!,LED是熄灭的状态,当接收到A1时,LED亮并且向上位机发送"LED1 Open!",当接收到A2时,LED熄灭并且向上位机发送"LED1 Closed!"。以上就是主要程序的说明,实现的一个简单的点亮LED的功能。
四、活动总结
通过本项目的设计与实现,在项目中,我学会了设计一个简单的单片机外围电路,预留出IO口,为后续的开发和学习提供一个良好的基础平台,并且实现了点亮一个led灯的功能,检验了整个系统的可靠性,这不仅增强了我的硬件设计能力,还提升了解决问题的能力和在设计过程中考虑系统完整性的能力。未来,我将继续深入学习和探索,感谢此次活动能够让我自制一个STM32开发板。