手把手教你学BSP(11.4)bsp实例--基于BSP的UART通信项目

目录

技术文档:基于BSP的UART通信项目

1. 项目概述

2. 项目需求

3. 系统建模

3.1 硬件接口

3.2 软件架构

4. BSP层设计

4.1 创建项目

4.2 配置UART接口

4.3 编写BSP层代码

4.4 主程序设计

5. 编译与下载

6. 测试与调试

7. 结论


用于控制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 创建项目
  1. 启动STM32CubeIDE

    • 打开STM32CubeIDE。
    • 选择“File” > “New” > “STM32 Project”。
  2. 选择MCU

    • 在“Select MCU/Board”窗口中,搜索并选择“STM32F103C8T6”。
    • 点击“Next”继续。
  3. 配置项目

    • 在“Project name”字段中输入项目名称,例如“UART_Communication_Project”。
    • 选择合适的项目位置,点击“Finish”完成项目创建。
4.2 配置UART接口
  1. 打开STM32CubeMX

    • 在STM32CubeIDE中,选择“Project” > “Open STM32CubeMX Project”。
  2. 配置UART引脚

    • 在STM32CubeMX中,选择“Connectivity”标签页。
    • 配置USART1接口,TX引脚连接到PA9,RX引脚连接到PA10。
    • 设置波特率为115200,8位数据位,1位停止位,无校验位。
  3. 配置按键引脚

    • 配置PA0引脚为“GPIO_Input”模式。
  4. 生成代码

    • 点击“Project” > “Generate Code”生成初始化代码。
4.3 编写BSP层代码
  1. 创建BSP文件

    • 在项目中创建一个新的文件夹,例如“src/bsp”。
    • 在“src/bsp”文件夹中创建两个文件:bsp_uart.c 和 bsp_key.c
  2. 编写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);
      }
  3. 编写按键检测函数

    • 在 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);
      }
  4. 创建头文件

    • src/bsp 文件夹中创建两个头文件:bsp_uart.hbsp_key.h

    • bsp_uart.h 文件中声明UART通信函数:

       c 

      深色版本

      #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
    • bsp_key.h 文件中声明按键检测函数:

       c 

      深色版本

      #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 主程序设计
  1. 修改主程序

    • 在 main.c 文件中包含BSP层头文件:
       c 

      深色版本

      #include "stm32f1xx_hal.h"
      #include "bsp_uart.h"
      #include "bsp_key.h"
  2. 初始化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. 编译与下载
  1. 编译项目

    • 在STM32CubeIDE中,点击“Build”按钮编译项目。
  2. 下载程序

    • 将开发板通过USB线连接到电脑。
    • 在STM32CubeIDE中,选择“Run” > “Run As” > “STM32 Program Downloader”下载程序到开发板。
6. 测试与调试
  1. 运行程序

    • 下载程序后,开发板上的UART接口应正常工作。
    • 使用串口调试助手(如PuTTY或TeraTerm)连接到开发板的UART接口,波特率设置为115200。
    • 按下按键,开发板应通过UART接口发送字符串“Button pressed!\r\n”。
  2. 调试

    • 使用STM32CubeIDE的调试功能,设置断点,逐步执行代码,检查变量值,确保程序按预期运行。
7. 结论

通过基于BSP的UART通信项目,我们成功实现了STM32F103C8T6开发板上的UART通信功能。该项目展示了如何使用STM32CubeIDE进行嵌入式系统开发,并通过BSP层实现硬件抽象,提高代码的可移植性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蘑菇二号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值