目录
用于控制STM32F103C8T6开发板上的UART通信。我们将以技术文档的形式详细记录整个开发过程。
技术文档:基于BSP的UART通信项目
1. 项目概述
项目名称:基于BSP的UART通信项目
项目目标:设计并实现一个嵌入式系统,用于通过UART接口在STM32F103C8T6开发板上发送和接收数据。
开发工具:STM32CubeIDE
开发环境:Windows 10
硬件平台:STM32F103C8T6 开发板
2. 项目需求
-
功能需求:
- 初始化UART接口,配置波特率、数据位、停止位和校验位。
- 实现数据发送功能,能够通过UART接口发送字符串。
- 实现数据接收功能,能够通过UART接口接收数据并显示在串口调试助手或其他终端上。
- 提供一个简单的用户界面,允许用户通过按键触发数据发送。
-
性能需求:
- UART通信应稳定可靠,无数据丢失。
- 用户界面应响应迅速,按键操作应可靠。
3. 系统建模
3.1 硬件接口
- UART接口:使用USART1接口,TX引脚连接到PA9,RX引脚连接到PA10。
- 按键:连接到GPIO口,例如PA0。
3.2 软件架构
- 初始化:初始化GPIO口和UART接口。
- 主循环:在主循环中检测按键状态,根据按键状态触发数据发送。
- UART发送和接收函数:实现UART数据的发送和接收功能。
4. BSP层设计
4.1 创建项目
-
启动STM32CubeIDE:
- 打开STM32CubeIDE。
- 选择“File” > “New” > “STM32 Project”。
-
选择MCU:
- 在“Select MCU/Board”窗口中,搜索并选择“STM32F103C8T6”。
- 点击“Next”继续。
-
配置项目:
- 在“Project name”字段中输入项目名称,例如“UART_Communication_Project”。
- 选择合适的项目位置,点击“Finish”完成项目创建。
4.2 配置UART接口
-
打开STM32CubeMX:
- 在STM32CubeIDE中,选择“Project” > “Open STM32CubeMX Project”。
-
配置UART引脚:
- 在STM32CubeMX中,选择“Connectivity”标签页。
- 配置USART1接口,TX引脚连接到PA9,RX引脚连接到PA10。
- 设置波特率为115200,8位数据位,1位停止位,无校验位。
-
配置按键引脚:
- 配置PA0引脚为“GPIO_Input”模式。
-
生成代码:
- 点击“Project” > “Generate Code”生成初始化代码。
4.3 编写BSP层代码
-
创建BSP文件:
- 在项目中创建一个新的文件夹,例如“src/bsp”。
- 在“src/bsp”文件夹中创建两个文件:
bsp_uart.c
和bsp_key.c
。
-
编写UART通信函数:
- 在
bsp_uart.c
文件中编写UART通信函数: c深色版本
#include "stm32f1xx_hal.h" #include "bsp_uart.h" UART_HandleTypeDef huart1; void BSP_UART_Init(void) { __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); } void BSP_UART_SendString(char *str) { HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), HAL_MAX_DELAY); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { char received_char = huart->Instance->DR; // 处理接收到的数据 HAL_UART_Transmit(&huart1, (uint8_t *)&received_char, 1, HAL_MAX_DELAY); } } void BSP_UART_StartReceive(void) { HAL_UART_Receive_IT(&huart1, (uint8_t *)&huart1.Instance->DR, 1); }
- 在
-
编写按键检测函数:
- 在
bsp_key.c
文件中编写按键检测函数: c深色版本
#include "stm32f1xx_hal.h" #include "bsp_key.h" void BSP_Key_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } uint8_t BSP_Key_Read(void) { return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); }
- 在
-
创建头文件:
-
在
src/bsp
文件夹中创建两个头文件:bsp_uart.h
和bsp_key.h
。 -
在
cbsp_uart.h
文件中声明UART通信函数:深色版本
#ifndef BSP_UART_H #define BSP_UART_H void BSP_UART_Init(void); void BSP_UART_SendString(char *str); void BSP_UART_StartReceive(void); #endif // BSP_UART_H
-
在
cbsp_key.h
文件中声明按键检测函数:深色版本
#ifndef BSP_KEY_H #define BSP_KEY_H void BSP_Key_Init(void); uint8_t BSP_Key_Read(void); #endif // BSP_KEY_H
-
4.4 主程序设计
-
修改主程序:
- 在
main.c
文件中包含BSP层头文件: c深色版本
#include "stm32f1xx_hal.h" #include "bsp_uart.h" #include "bsp_key.h"
- 在
-
初始化BSP层:
- 在
main()
函数中初始化BSP层: c深色版本
int main(void) { HAL_Init(); SystemClock_Config(); BSP_UART_Init(); BSP_UART_StartReceive(); BSP_Key_Init(); while (1) { if (BSP_Key_Read() == 0) { HAL_Delay(50); // 去抖动 if (BSP_Key_Read() == 0) { // 触发数据发送 while (BSP_Key_Read() == 0); HAL_Delay(50); // 去抖动 BSP_UART_SendString("Button pressed!\r\n"); } } } }
- 在
5. 编译与下载
-
编译项目:
- 在STM32CubeIDE中,点击“Build”按钮编译项目。
-
下载程序:
- 将开发板通过USB线连接到电脑。
- 在STM32CubeIDE中,选择“Run” > “Run As” > “STM32 Program Downloader”下载程序到开发板。
6. 测试与调试
-
运行程序:
- 下载程序后,开发板上的UART接口应正常工作。
- 使用串口调试助手(如PuTTY或TeraTerm)连接到开发板的UART接口,波特率设置为115200。
- 按下按键,开发板应通过UART接口发送字符串“Button pressed!\r\n”。
-
调试:
- 使用STM32CubeIDE的调试功能,设置断点,逐步执行代码,检查变量值,确保程序按预期运行。
7. 结论
通过基于BSP的UART通信项目,我们成功实现了STM32F103C8T6开发板上的UART通信功能。该项目展示了如何使用STM32CubeIDE进行嵌入式系统开发,并通过BSP层实现硬件抽象,提高代码的可移植性和可维护性。