前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BME280传感器与STM32 Blue Pill连接并使用STM32CubeIDE

BME280传感器与STM32 Blue Pill连接并使用STM32CubeIDE

原创
作者头像
IDC科技
修改2023-02-21 11:44:38
1.2K0
修改2023-02-21 11:44:38
举报
文章被收录于专栏:IDC杂谈IDC杂谈

在本教程中,我们将学习如何将 BME280 传感器与 STM32 Blue Pill 连接,并使用 HAL 库在 STM32CubeIDE 中对其进行编程。首先,我们将简要介绍 BME280 传感器,然后将其与我们的 STM32 接口,并使用 STMCube IDE 对其进行编程以测量温度、压力和湿度。为了演示,我们将 SSD1306 OLED 与 STM32 Blue Pill 连接以查看 OLED 上的传感器数据。

BME280传感器介绍

BME280 传感器用于测量有关环境温度、大气压力和相对湿度的读数。它主要用于以低功耗为关键的网络和移动应用程序。该传感器使用 I2C 或 SPI 与微控制器进行数据通信。尽管市场上有多种不同版本的 BME280,但我们将要研究的版本使用 I2C 通信协议。

I2C是Inter-Integrated Circuit的意思,工作原理是同步的多主多从系统。对于 BME280,STM32 Blue Pill 充当主设备,而 BME280 传感器充当从设备,因为它是一个外部设备,充当从设备。Blue Pill 通过 I2C 协议与 BME280 传感器通信,获取温度、气压、相对湿度和高度。

下图显示了 BME280 传感器及其引脚排列。

  • VCC:接3.3V
  • SCL:用于产生时钟信号
  • SDA:用于发送和接收数据

将 BME280 传感器与 STM32 Blue Pill 和 OLED 接口

我们将需要此项目的以下组件。

  1. STM32 Blue Pill
  2. BME280传感器
  3. SSD1306 有机发光二极管
  4. 面包板
  5. 连接线

BME280 与 Blue Pill 的连接非常简单。我们要将VCC端接3.3V,地线接大地(共地),传感器的SCL接模块的SCL,传感器的SDA接板子的SDA脚。

OLED 显示屏有 4 个端子,我们将与 STM Blue Pill 连接。由于 OLED 显示器需要 3.3-5V 的工作电压,因此我们将 VCC 端子连接到 3.3V,这将与电路板和传感器共用。显示器的SCL 与模块的SCL 引脚相连,显示器的SDA 与模块的SDA 相连。所有三个设备的地面将保持共同。

由于 OLED 和 BME280 传感器都使用 I2C 通信协议与 STM32 Blue Pill 通信,因此我们将使用 I2C1_SCL 和 I2C1_SDA 引脚连接传感器和 OLED 的每个 SCL 和 SDA 引脚。

我们正在使用的三个设备之间的连接如下所示。

OLED 和 Blue Pill 之间的连接可以在下面看到。

STM32 Blue Pill

BME280

SSD1306 OLED显示器

3.3V

车辆识别号

虚拟控制中心

PB7 (I2C1_SDA)

SDA

SDA

PB6 (I2C_SCL)

SCL

SCL

地线

地线

地线

连接 BME280 传感器和带有 STM32 Blue Pill 的 OLED,如下图所示。我们使用与上表中指定的连接相同的连接。

STM32 Blue Pill BME280 代码带OLED

我们将使用 STM32Cube IDE 对我们的 STM32 板进行编程。打开 IDE 并转到一个新项目。

然后对于目标选择,指定 STM32 Blue Pill 板号。之后单击任何列,如下图所示。然后单击“下一步”按钮。

指定项目的名称,然后单击“完成”以完成项目的设置。

转到连接 > I2C1。选择 I2C 模式为“I2C”。然后转到“参数设置”并将 I2C 速度模式设置为“快速模式”。这对于 SSD1306 OLED 是必需的。

现在我们将保存我们的文件。按 Ctrl + S。将出现以下窗口。点击“是”。这将为您生成模板代码。

将出现另一个窗口,询问您是否要打开透视图。点击“是”。

STM32 BME280 库

要使用 STMCube IDE 通过 STM32 Blue Pill 获取 BME280 温度、压力和湿度读数,我们需要一些 BME280 库。让我们向您展示如何将它们包含在您的项目中以访问 bme280.h 提供的 API

Src文件夹中创建一个名为BME280的新文件夹。将以下文件复制并保存在 BME280 文件夹中。

  • bme280.c
  • bme280.h
  • bme280_defs.h

STM32 SSD1306 OLED库

当我们使用带有 STM32 Blue Pill 的 SSD1306 OLED 时,我们将需要 ssd1306.h 和 fonts.h 库。这些库将用于访问不同的功能,使我们能够以各种方式在 OLED 上显示文本和数字。

ssd1306.h

转到 Core > Inc 并创建一个名为“ ssd1306.h ” 的新文件从该链接复制以下代码并将其保存到该文件。

fonts.h

转到 Core > Inc 并创建一个名为“ fonts.h ” 的新文件从该链接复制以下代码并将其保存到该文件。

ssd1306.c

同样,转到 Core > Src 并创建一个名为“ ssd1306.c ” 的新文件。从该链接复制以下代码并将其保存到该文件。

fonts.c

转到 Core > Src 并创建一个名为“ fonts.c ” 的新文件从该链接复制以下代码并将其保存到该文件中。

STM32 Blue Pill BME280 传感器代码 STM32CubeIDE

现在让我们看看生成的 main.c 文件。在 main.c 文件中,通过包含下面给出的代码行来确保以下代码是脚本的一部分。我们将使用 bme280.h 库函数访问 BME280 传感器数据,并使用 fonts.h 和 ssd1306.h API 将它们显示在 OLED 上。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include "./BME280/bme280.h"
#include "fonts.h"
#include "ssd1306.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

float temperature;
float humidity;
float pressure;

struct bme280_dev dev;
struct bme280_data comp_data;
int8_t rslt;

char hum_string[50];
char temp_string[50];
char press_string[50];

int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), &reg_addr, 1, 10) != HAL_OK) return -1;
  if(HAL_I2C_Master_Receive(&hi2c1, (id << 1) | 0x01, data, len, 10) != HAL_OK) return -1;

  return 0;
}

void user_delay_ms(uint32_t period)
{
  HAL_Delay(period);
}

int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  int8_t *buf;
  buf = malloc(len +1);
  buf[0] = reg_addr;
  memcpy(buf +1, data, len);

  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), (uint8_t*)buf, len + 1, HAL_MAX_DELAY) != HAL_OK) return -1;

  free(buf);
  return 0;
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();


  /* BME280 init */
  dev.dev_id = BME280_I2C_ADDR_PRIM;
  dev.intf = BME280_I2C_INTF;
  dev.read = user_i2c_read;
  dev.write = user_i2c_write;
  dev.delay_ms = user_delay_ms;

  rslt = bme280_init(&dev);

  /* BME280 settings */
  dev.settings.osr_h = BME280_OVERSAMPLING_1X;
  dev.settings.osr_p = BME280_OVERSAMPLING_16X;
  dev.settings.osr_t = BME280_OVERSAMPLING_2X;
  dev.settings.filter = BME280_FILTER_COEFF_16;
  rslt = bme280_set_sensor_settings(BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL, &dev);

  /* Initialize OLED*/
  SSD1306_Init();

  while (1)
  {
    /* Forced mode setting, switched to SLEEP mode after measurement */
    rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
    dev.delay_ms(40);
    /*Get Data */
    rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
    if(rslt == BME280_OK)
    {
      temperature = comp_data.temperature / 100.0;
      humidity = comp_data.humidity / 1024.0;
      pressure = comp_data.pressure / 10000.0;

      /*Display Data */
      memset(hum_string, 0, sizeof(hum_string));
      memset(temp_string, 0, sizeof(temp_string));
      memset(press_string, 0, sizeof(press_string));

      sprintf(hum_string, "Humidity %03.1f %% ", humidity);
      sprintf(temp_string, "Temperature %03.1f C ", temperature);
      sprintf(press_string, "Pressure %03.1f hPa ", pressure);

      SSD1306_GotoXY (0, 0);
      SSD1306_Puts (hum_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 20);
      SSD1306_Puts (temp_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 40);
      SSD1306_Puts (press_string, &Font_7x10, 1);
      SSD1306_UpdateScreen();
    }

    HAL_Delay(1000);
  }

}

守则如何运作?

我们首先包含该项目的必要库,其中包括用于传感器的 bme280.h 以及用于 OLED 功能的 fonts.h 和 ssd1306.h。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include "./BME280/bme280.h"
#include "fonts.h"
#include "ssd1306.h"

创建一些我们稍后将在草图中使用的变量来存储 BME280 传感器数据。

代码语言:javascript
复制
float temperature;
float humidity;
float pressure;

struct bme280_dev dev;
struct bme280_data comp_data;
int8_t rslt;

char hum_string[50];
char temp_string[50];
char press_string[50];

user_i2c_read() 函数以阻塞模式调用数据传输和接收 I2C HAL API 以进行读取。如果主机的 I2C 读取数据发送和接收成功,该函数返回 0。否则,如果其中任何一个失败,则返回 -1。

代码语言:javascript
复制
int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), &reg_addr, 1, 10) != HAL_OK) return -1;
  if(HAL_I2C_Master_Receive(&hi2c1, (id << 1) | 0x01, data, len, 10) != HAL_OK) return -1;

  return 0;
}

user_delay_ms() 函数接受一个参数,该参数是其中的“period”。该函数将根据设置的周期被调用以引起延迟。

代码语言:javascript
复制
void user_delay_ms(uint32_t period)
{
  HAL_Delay(period);
}

user_i2c_write() 函数以阻塞模式调用数据传输 I2C HAL API 以进行写入。如果主机的 I2C 写数据传输成功,该函数返回 0。否则,返回 -1。

代码语言:javascript
复制
int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  int8_t *buf;
  buf = malloc(len +1);
  buf[0] = reg_addr;
  memcpy(buf +1, data, len);

  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), (uint8_t*)buf, len + 1, HAL_MAX_DELAY) != HAL_OK) return -1;

  free(buf);
  return 0;
}
main()

在main函数内部,首先初始化所有外设,配置系统时钟,初始化所有配置的外设。

代码语言:javascript
复制
HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();
初始化 BME280 传感器

指定用于初始化的BME280设备结构参数,包括设备id、接口、读函数指针、写函数指针和延迟函数指针。通过调用 bme280_init() 来初始化 BME280 传感器,它会读取芯片 ID 并校准来自传感器的数据。这个函数接受一个参数,它是指向 bme280 设备结构的指针。

代码语言:javascript
复制
dev.dev_id = BME280_I2C_ADDR_PRIM;
  dev.intf = BME280_I2C_INTF;
  dev.read = user_i2c_read;
  dev.write = user_i2c_write;
  dev.delay_ms = user_delay_ms;

  rslt = bme280_init(&dev);

接下来,我们设置 BME280 传感器的设置,包括湿度、压力和温度过采样值。函数 bme280_set_sensor_settings() 负责设置过采样、滤波器和待机时长。它有两个参数,即所需的设置和指向 bme280 设备结构的指针。

代码语言:javascript
复制
  dev.settings.osr_h = BME280_OVERSAMPLING_1X;
  dev.settings.osr_p = BME280_OVERSAMPLING_16X;
  dev.settings.osr_t = BME280_OVERSAMPLING_2X;
  dev.settings.filter = BME280_FILTER_COEFF_16;
  rslt = bme280_set_sensor_settings(BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL, &dev);

此外,我们通过调用SSD1306_Init()函数来初始化OLED。

代码语言:javascript
复制
SSD1306_Init();
获取传感器数据

在无限循环中,我们首先将 BME280 传感器设置为强制模式设置,然后在测量后将其切换到睡眠模式。传感器的模式通过函数 bme280_set_sensor_mode() 配置。

代码语言:javascript
复制
  rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
   dev.delay_ms(40);

短暂延迟后,我们将开始从传感器访问传感器数据。bme280_get_sensor_data() 将从 BME280 传感器读取温度、压力和湿度读数,补偿它们并将它们存储在 bme280_data 结构中。

代码语言:javascript
复制
  rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
显示传感器数据

如果该函数返回成功响应,那么我们将开始在 OLED 屏幕上显示传感器读数。每秒读数将更新为新值。

代码语言:javascript
复制
 if(rslt == BME280_OK)
    {
      temperature = comp_data.temperature / 100.0;
      humidity = comp_data.humidity / 1024.0;
      pressure = comp_data.pressure / 10000.0;

      /*Display Data */
      memset(hum_string, 0, sizeof(hum_string));
      memset(temp_string, 0, sizeof(temp_string));
      memset(press_string, 0, sizeof(press_string));

      sprintf(hum_string, "Humidity %03.1f %% ", humidity);
      sprintf(temp_string, "Temperature %03.1f C ", temperature);
      sprintf(press_string, "Pressure %03.1f hPa ", pressure);

      SSD1306_GotoXY (0, 0);
      SSD1306_Puts (hum_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 20);
      SSD1306_Puts (temp_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 40);
      SSD1306_Puts (press_string, &Font_7x10, 1);
      SSD1306_UpdateScreen();
    }

首先,我们将从 bme_280 结构中获取以摄氏度为单位的单独补偿温度读数、以百分比为单位的补偿湿度读数和以 hPa 为单位的补偿压力读数。

代码语言:javascript
复制
   temperature = comp_data.temperature / 100.0;
      humidity = comp_data.humidity / 1024.0;
      pressure = comp_data.pressure / 10000.0;

然后我们将浮点变量转换为由读数和单位组成的字符串,并将它们显示在 OLED 上。

要在 OLED 上显示传感器数据,首先,我们将设置文本开始的 x 和 y 轴位置。SSD1306_gotoXY() 函数用于设置写指针。我们将 (0,0) 作为参数传递,因此文本从左上角开始。我们使用 SSD1306_Puts() 函数在屏幕上显示湿度读数及其单位。该函数接受三个参数,即要显示的字符串、字体名称和文本颜色。同样,要显示温度和压力读数,我们首先将起始 x 轴和 y 轴分别设置为 (0,20) 和 (0,40),然后调用 SSD1306_Puts() 来显示字符串。此外,调用 SSD1306_UpdateScreen() 以在屏幕上显示文本。

代码语言:javascript
复制
      memset(hum_string, 0, sizeof(hum_string));
      memset(temp_string, 0, sizeof(temp_string));
      memset(press_string, 0, sizeof(press_string));

      sprintf(hum_string, "Humidity %03.1f %% ", humidity);
      sprintf(temp_string, "Temperature %03.1f C ", temperature);
      sprintf(press_string, "Pressure %03.1f hPa ", pressure);

      SSD1306_GotoXY (0, 0);
      SSD1306_Puts (hum_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 20);
      SSD1306_Puts (temp_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 40);
      SSD1306_Puts (press_string, &Font_7x10, 1);
      SSD1306_UpdateScreen();

main.c文件

这是一个完整的main.c文件修改后的样子。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include "./BME280/bme280.h"
#include "fonts.h"
#include "ssd1306.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

float temperature;
float humidity;
float pressure;

struct bme280_dev dev;
struct bme280_data comp_data;
int8_t rslt;

char hum_string[50];
char temp_string[50];
char press_string[50];

int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), &reg_addr, 1, 10) != HAL_OK) return -1;
  if(HAL_I2C_Master_Receive(&hi2c1, (id << 1) | 0x01, data, len, 10) != HAL_OK) return -1;

  return 0;
}

void user_delay_ms(uint32_t period)
{
  HAL_Delay(period);
}

int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  int8_t *buf;
  buf = malloc(len +1);
  buf[0] = reg_addr;
  memcpy(buf +1, data, len);

  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), (uint8_t*)buf, len + 1, HAL_MAX_DELAY) != HAL_OK) return -1;

  free(buf);
  return 0;
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();


  /* BME280 init */
  dev.dev_id = BME280_I2C_ADDR_PRIM;
  dev.intf = BME280_I2C_INTF;
  dev.read = user_i2c_read;
  dev.write = user_i2c_write;
  dev.delay_ms = user_delay_ms;

  rslt = bme280_init(&dev);

  /* BME280 settings */
  dev.settings.osr_h = BME280_OVERSAMPLING_1X;
  dev.settings.osr_p = BME280_OVERSAMPLING_16X;
  dev.settings.osr_t = BME280_OVERSAMPLING_2X;
  dev.settings.filter = BME280_FILTER_COEFF_16;
  rslt = bme280_set_sensor_settings(BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL, &dev);

  /* Initialize OLED*/
  SSD1306_Init();

  while (1)
  {
    /* Forced mode setting, switched to SLEEP mode after measurement */
    rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
    dev.delay_ms(40);
    /*Get Data */
    rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
    if(rslt == BME280_OK)
    {
      temperature = comp_data.temperature / 100.0;
      humidity = comp_data.humidity / 1024.0;
      pressure = comp_data.pressure / 10000.0;

      /*Display Data */
      memset(hum_string, 0, sizeof(hum_string));
      memset(temp_string, 0, sizeof(temp_string));
      memset(press_string, 0, sizeof(press_string));

      sprintf(hum_string, "Humidity %03.1f %% ", humidity);
      sprintf(temp_string, "Temperature %03.1f C ", temperature);
      sprintf(press_string, "Pressure %03.1f hPa ", pressure);

      SSD1306_GotoXY (0, 0);
      SSD1306_Puts (hum_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 20);
      SSD1306_Puts (temp_string, &Font_7x10, 1);
      SSD1306_GotoXY (0, 40);
      SSD1306_Puts (press_string, &Font_7x10, 1);
      SSD1306_UpdateScreen();
    }

    HAL_Delay(1000);
  }

}
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief I2C1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_I2C1_Init(void)
{

  /* USER CODE BEGIN I2C1_Init 0 */

  /* USER CODE END I2C1_Init 0 */

  /* USER CODE BEGIN I2C1_Init 1 */

  /* USER CODE END I2C1_Init 1 */
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 400000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C1_Init 2 */

  /* USER CODE END I2C1_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

修改后保存main.c文件。现在我们准备好构建我们的项目了。

构建项目

要构建我们的项目,请按 Ctrl + B 或转到 Project > Build All

您的项目将开始构建。片刻之后,如果没有错误,您的项目将成功构建。

连接ST-Link编程器与STM32

现在我们已经成功构建了我们的项目,让我们继续前进并将代码上传到我们的 STM32 板。首先,我们必须将我们的 Blue Pill STM32 与 ST-Link 编程器连接起来。我们将使用 ST-Link V2。

这将在我们的计算机和我们的 STM32 板之间提供一个接口。它由 10 个引脚组成。我们将使用 pin2 SWDIO、pin6 SWCLK、pin4 GND 和 pin8 3.3V 连接我们的 STM32 开发板。SWDIO 是数据输入/输出引脚,SWCLK 是时钟引脚。按照 ST-LINK V2 上给出的引脚配置来识别每个引脚。

按照下表正确连接两个设备。

STM32

ST-LINK V2

VCC 3.3V 引脚

pin8 3.3V

SWDIO 引脚

引脚 2 SWDIO

SWCLK引脚

pin6 SWCLK

接地引脚

pin4 GND

此外,将 BOOT 跳线移到右侧,使微控制器能够进入编程模式。

  • 现在通过 USB 端口将 ST-LINK V2 连接到计算机。两个设备都将开机。
  • 接下来按 IDE 中的 RUN 按钮。“编辑配置”窗口将打开。单击“确定”。
  • 片刻后,代码将成功发送到STM32板。否则,请按 STM32 开发板上的 RESET 按钮。
  • 现在要将蓝色药丸恢复到正常模式,请确保将 BOOT 跳线恢复到原位。

将代码上传到电路板后,OLED 将开始在屏幕上显示湿度、温度和压力读数,每秒更新一次新值。

以上内容由IC先生www.mrchip.cn编辑整理发布,请勿转载。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BME280传感器介绍
  • 将 BME280 传感器与 STM32 Blue Pill 和 OLED 接口
  • STM32 Blue Pill BME280 代码带OLED
  • STM32 BME280 库
  • STM32 SSD1306 OLED库
    • ssd1306.h
      • fonts.h
        • ssd1306.c
          • fonts.c
          • STM32 Blue Pill BME280 传感器代码 STM32CubeIDE
            • 守则如何运作?
              • main()
            • 构建项目
              • 连接ST-Link编程器与STM32
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档