本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该仿真项目提供了STM32F103微控制器与DS18B20数字温度传感器之间通信的源码,旨在通过实践示例教授嵌入式系统开发者如何在硬件上实现温度监测。DS18B20传感器通过1-Wire协议与STM32F103进行数据交换,包括初始化、命令发送、数据读取及错误检测。源码包括完整的项目文件,如驱动代码、主循环逻辑以及配置文件,有助于开发者理解传感器的集成过程和1-Wire协议的应用。
STM32 温度传感器DS18B20仿真_STM32F103_源码

1. STM32F103微控制器与DS18B20传感器的通信实现

在现代嵌入式系统设计中,准确的温度监测是确保设备安全运行的关键要素之一。本章我们将深入探讨如何利用STM32F103微控制器与DS18B20数字温度传感器进行通信,实现精准的温度测量。

首先,我们需要对DS18B20传感器的工作原理有所了解。DS18B20是一款高精度、低功耗的数字温度传感器,它可以提供9位至12位的摄氏温度测量值。与传统模拟温度传感器不同,DS18B20通过数字接口与微控制器通信,大大简化了硬件设计并提高了测量精度。

接下来,我们将详细分析STM32F103微控制器与DS18B20之间的通信协议。为了实现二者之间的通信,我们需要了解并应用一种特殊的通信协议——1-Wire协议。这种协议允许通过单一的数据线传输数据和电源,极大地减少了所需的引脚数量,非常适合资源受限的嵌入式应用。

通过接下来的章节,我们将一步一步地探讨如何初始化DS18B20,实现微控制器与传感器之间的有效通信,并处理与显示温度数据。我们还将展示如何通过硬件抽象层(HAL)库或低层(LL)库来简化编程工作,以及如何设置相关的配置文件以优化系统性能。

1.1 选择合适的硬件平台

在开始之前,选择一个适合本项目的硬件平台是至关重要的。STM32F103系列微控制器因其高性能和丰富的内置功能而被广泛应用于各种工业和消费类电子产品中。我们选用STM32F103系列中的一个型号,例如STM32F103C8T6,因为它提供了足够的GPIO引脚和丰富的外设支持,是学习与实验的理想选择。

1.2 接线与硬件准备

准备硬件是实现通信的第一步。确保DS18B20传感器的VDD引脚连接到3.3V电源,GND引脚连接到地,而数据线(DQ)连接到STM32F103的一个GPIO引脚(例如PA7)上,并通过一个4.7kΩ的上拉电阻连接到VDD,以确保数据线在空闲时保持高电平。

1.3 软件开发环境搭建

在硬件准备就绪后,我们需要设置软件开发环境。对于STM32F103微控制器,一般推荐使用Keil uVision IDE结合ARM编译器,或是STM32CubeIDE进行项目开发。这两种开发环境都提供了丰富的开发工具和库函数支持,可以高效地开发和调试程序。

通过以上步骤,我们就完成了从硬件选择、接线到软件开发环境搭建的基本准备工作。下一章将深入探讨1-Wire协议,这是实现STM32F103与DS18B20通信的核心内容。

2. 1-Wire协议在温度监测中的应用

2.1 1-Wire协议概述

2.1.1 1-Wire协议的特点

1-Wire协议是一种串行通信协议,由Dallas半导体公司开发。它使用单根数据线,加上地线,就可以实现与单个或多个设备之间的数据交换。它的一个显著特点是其简单性,仅需要一根线和接地,就可以完成数据传输和设备供电。

1-Wire协议支持多点通信,可在同一个数据线上连接多个设备,每个设备都有唯一的64位序列号,通过软件寻址来实现与特定设备的数据交换。1-Wire支持低速数据传输,但其传输速率足以满足多数低速设备的需求,例如数字温度传感器。

它广泛应用于远程温度监测,因为它不仅可以传输数据,还可以为传感器提供能量。此外,由于其线路简单,1-Wire协议在布线复杂或空间受限的场合中非常有用。

2.1.2 1-Wire通信原理

1-Wire协议的通信原理基于主从架构,单个主机控制多个从设备。在数据传输过程中,主机负责启动通信、提供时钟信号和时序,而从设备则响应主机的请求并传输数据。数据线的电平变化用于表示逻辑0和逻辑1。

在1-Wire通信中,数据传输分为三个阶段:初始化、ROM命令传输、功能命令传输。初始化阶段由主机发起,通过复位脉冲和应答脉冲来同步通信。ROM命令阶段允许主机识别和选择特定的从设备。功能命令阶段则是主机发送具体的数据读取或写入命令给从设备。

2.2 1-Wire协议的数据交换过程

2.2.1 初始化过程

1-Wire通信开始于一个初始化序列。主机首先拉低数据线至少480微秒,然后释放数据线,让数据线通过一个上拉电阻回到高电平状态。所有连接在1-Wire总线上的设备必须检测到这个复位脉冲,并在15-60微秒内响应一个存在脉冲。

初始化过程确保了总线上所有设备的同步,为下一步的通信做好准备。这一步骤是1-Wire协议中不可或缺的一部分,没有初始化,主机无法与从设备进行有效通信。

2.2.2 ROM命令通信

在1-Wire总线上,每个从设备都有一个唯一的64位ROM代码。ROM命令用于识别和选择特定的从设备。主机在完成初始化过程后,可以发送一个或多个ROM命令,包括跳过ROM (0x3C)、匹配ROM (0x55)、搜索ROM等。

跳过ROM命令使主机可以对总线上的所有设备广播命令;匹配ROM命令则是用来选择特定设备;搜索ROM命令用于识别总线上的所有设备,这个过程会重复,直到找到一个设备。

2.2.3 功能命令通信

当特定从设备被选择后,主机可以发送功能命令来进行数据的读取或写入。对于温度传感器DS18B20来说,常用的功能命令包括“Convert T”命令,用于启动温度转换过程,以及“Read Scratchpad”命令,用于读取温度数据。

功能命令的交换依赖于主机和选定从设备之间的正确通信,数据的准确性依赖于通信时序的正确性。通过这种方式,1-Wire协议可以灵活地控制和读取多个不同设备的数据。

2.3 1-Wire协议在DS18B20中的应用

2.3.1 DS18B20的工作模式

DS18B20是Maxim公司生产的一款数字温度传感器,它支持1-Wire通信协议。DS18B20有几种工作模式,包括温度转换模式和数据读取模式。温度转换模式下,DS18B20会对环境温度进行采样和转换,完成转换后,主机可以读取温度数据。

DS18B20提供了多种分辨率设置,从9位到12位,分辨率越高,温度读取的精度越高,但转换时间也相应更长。用户可以根据实际需求来配置DS18B20的分辨率。

2.3.2 1-Wire协议与DS18B20的交互流程

为了与DS18B20通信,主机首先必须执行1-Wire协议的初始化序列。之后,主机发送匹配ROM命令,并在ROM命令后发送“Convert T”命令来启动温度转换。温度转换完成后,主机通过“Read Scratchpad”命令读取DS18B20中的温度数据。

在读取过程中,DS18B20会按照1-Wire协议的数据交换规则,将温度值转换为数字信号并通过数据线传输给主机。这一交互过程需要严格按照1-Wire协议的时序要求来执行,以确保数据的准确性和完整性。

3. DS18B20初始化与通信步骤

3.1 DS18B20初始化流程

3.1.1 硬件连接要求

DS18B20温度传感器是一款数字型传感器,其与STM32微控制器之间的连接非常简单。在硬件连接上,只需将DS18B20的数据线(DQ)连接到STM32的一个GPIO口上,并且通过上拉电阻连接至VDD,实现外部上拉。一般情况下,我们选择STM32的一个支持复用功能的GPIO作为1-Wire总线的数据线。此外,DS18B20还需要连接电源(VDD)和地(GND)。DS18B20的数据线在未进行通信时应保持高电平,因此在设计电路时,应确保GPIO在未初始化或作为输入时,被设置为高电平。

3.1.2 初始化代码实现

以下是初始化DS18B20的步骤及其实现代码:

// GPIO初始化函数
void DS18B20_GPIO_Init(void) {
    // 此处初始化GPIO的代码,依赖于具体使用的MCU型号和开发环境
}

// DS18B20初始化函数
uint8_t DS18B20_Init(void) {
    uint8_t presence;

    DS18B20_GPIO_Init(); // 初始化GPIO

    // 拉低数据线至少480us
    DS18B20_RESET_LOW();
    DQ_DELAY();
    // 拉高数据线
    DS18B20_RESET_HIGH();
    DQ_DELAY();

    // 检测DS18B20的存在脉冲
    presence = DS18B20檢測存在脉冲(DQ_PIN);
    if (presence) {
        // 存在脉冲检测到,初始化成功
        return 1;
    }
    // 初始化失败
    return 0;
}

在上述代码中, DS18B20_RESET_LOW() DS18B20_RESET_HIGH() 为控制DS18B20复位的函数, DS18B20檢測存在脉冲() 用于检测DS18B20的存在脉冲。 DQ_DELAY() 函数提供必要的时序延迟。初始化流程的关键是确保初始化序列的时间精度,以满足DS18B20的时序要求。

3.2 DS18B20通信协议

3.2.1 读写时序

DS18B20使用一种称为“单总线”(1-Wire)的通信协议,这意味着数据线(DQ)被用于数据的发送和接收。1-Wire协议规定了严格的时间约束,每个通信步骤都必须在规定的时间范围内完成。以下是DS18B20通信中的关键时序要求:

  • 复位脉冲 :主机(STM32)将数据线拉低480微秒以上,然后释放总线,DS18B20在之后的15至60微秒内拉低数据线以响应。
  • 存在脉冲 :DS18B20在检测到复位脉冲后,在释放数据线前发送一个存在脉冲,主机需要检测这个脉冲的存在与否。
  • 写时序 :主机在写逻辑”0”时必须将数据线保持低电平至少60微秒,写逻辑”1”时则在开始后15微秒内释放数据线。
  • 读时序 :在读取数据时,DS18B20会将数据线拉低以表示”0”,并且维持至少1微秒,然后释放数据线,让其回到高电平状态。

3.2.2 数据转换与处理

DS18B20从温度传感器获取的原始数据必须被转换和处理才能用于计算实际的温度值。DS18B20提供了一个16位的数字表示,其中分为整数部分和小数部分。转换的关键在于识别温度寄存器中的正负号,以及转换格式(通常为摄氏度)。例如,DS18B20的默认分辨率是9位,分辨率为0.5°C,此时实际温度计算公式为:

实际温度 = (整数部分) + (小数部分 / 16)

3.3 DS18B20的配置与使用

3.3.1 分辨率设置

DS18B20支持可编程的分辨率,可从9位到12位不等。设置分辨率可以调整温度传感器的测量精度和转换时间。分辨率设置越高,转换得到的温度值越精确,但测量时间也越长。例如,要设置DS18B20的分辨率为12位,需要写入相应的ROM命令和功能命令。

以下是通过代码设置DS18B20分辨率为12位的一个示例:

// 设置分辨率函数
void DS18B20_SetResolution(uint8_t resolution) {
    uint8_t resolutionCommand;

    switch (resolution) {
        case 9:
            resolutionCommand = DS18B20_RESOLUTION_9;
            break;
        case 10:
            resolutionCommand = DS18B20_RESOLUTION_10;
            break;
        case 11:
            resolutionCommand = DS18B20_RESOLUTION_11;
            break;
        case 12:
            resolutionCommand = DS18B20_RESOLUTION_12;
            break;
        default:
            // 默认9位
            resolutionCommand = DS18B20_RESOLUTION_9;
    }

    DS18B20_Write(resolutionCommand);
}

3.3.2 报警功能的配置

DS18B20还支持可编程的报警功能,允许用户设置一个温度阈值,当温度超出这个范围时,DS18B20可以触发报警。此功能通过写入温度寄存器的高或低限值来实现。报警功能可以通过硬件连接到STM32的一个GPIO,或者通过轮询检测温度寄存器值来实现。使用报警功能时,需要确保适当配置了相关的命令和数据。

// 设置温度报警函数
void DS18B20_SetAlarm(float lowTemp, float highTemp) {
    int16_t lowTempValue = (int16_t)(lowTemp * 16);
    int16_t highTempValue = (int16_t)(highTemp * 16);
    // 将温度值转换为DS18B20的格式
    DS18B20_WriteByte(lowTempValue & 0xFF); // 发送低限值的低字节
    DS18B20_WriteByte(lowTempValue >> 8);   // 发送低限值的高字节
    DS18B20_WriteByte(highTempValue & 0xFF); // 发送高限值的低字节
    DS18B20_WriteByte(highTempValue >> 8);   // 发送高限值的高字节
}

请注意,示例代码是伪代码,需要根据实际的库函数和硬件配置来实现。

4. GPIO配置与延时函数在STM32中的应用

4.1 GPIO的基本配置与使用

4.1.1 GPIO模式选择与配置

GPIO(General Purpose Input/Output)是微控制器中最常用的接口之一,用于控制和监测外部设备。在STM32F103微控制器中,每个GPIO引脚都可以被编程为输入、输出、模拟或特殊功能模式。

在进行GPIO配置时,首先需要确定每个引脚的功能需求。例如,如果一个引脚需要作为数字输出,那么应该配置为推挽输出模式;如果引脚用于数字输入,则应该设置为浮空输入、上拉输入或下拉输入。模拟模式则用于连接到ADC(模拟-数字转换器)或DAC(数字-模拟转换器),特殊功能模式允许引脚具有如UART、SPI等通信协议的特定功能。

GPIO的配置通常通过STM32的库函数来实现,如HAL库或LL库。在配置过程中,需要指定GPIO端口(如GPIOA、GPIOB等)和相应的引脚编号(如GPIO_PIN_0、GPIO_PIN_1等),以及需要设置的模式和输出类型等参数。

以下是一个配置GPIO为输出模式的HAL库函数代码示例:

/* 定义一个GPIO_InitTypeDef类型的结构体变量 */
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 使能GPIOA时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();

/* 配置GPIO的模式、输出类型、速度、上拉/下拉 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用内部上拉或下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

4.1.2 GPIO的输入输出控制

在配置完GPIO模式后,我们需要对GPIO引脚进行输入或输出控制。对于输出模式的GPIO,可以通过设置或清除引脚的电平状态来控制连接到该引脚的外部设备。对于输入模式的GPIO,可以读取引脚当前的电平状态。

以下是如何使用HAL库进行GPIO引脚电平控制的示例代码:

/* 设置GPIOA_PIN_0为高电平 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);

/* 延时一段时间 */
HAL_Delay(1000);

/* 设置GPIOA_PIN_0为低电平 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);

/* 读取GPIOA_PIN_1的电平状态 */
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

4.2 延时函数的实现

4.2.1 循环延时的编写

在微控制器编程中,延时是一个常见的需求。循环延时是最简单的延时实现方法,它通过执行一个空操作的循环,消耗一定的时间来实现延时效果。然而,这种方法并不精确,并且依赖于处理器的执行速度。

以下是一个简单的循环延时函数示例:

void delay(uint32_t cycles) {
    uint32_t i;
    while (cycles--) {
        for(i = 0; i < 4500; i++) {
            __NOP(); // 执行空操作(No Operation),该操作不做任何事情,但占用时间
        }
    }
}

4.2.2 基于定时器的精确延时

为了获得更精确的延时,我们可以使用STM32的硬件定时器。硬件定时器基于内部或外部的时钟源,并提供一个可以定时触发中断的计数器。通过配置定时器的相关寄存器,并设置适当的预分频和计数值,可以在中断服务例程中实现精确的延时。

以下是一个基于硬件定时器实现延时的示例:

void TIM2_IRQHandler(void) {
    if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET) {
        if(__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET) {
            __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
            // 在此实现延时后的逻辑处理
        }
    }
}

void delay(uint32_t timeout) {
    /* 启动定时器 */
    HAL_TIM_Base_Start_IT(&htim2);
    /* 设置超时时间 */
    __HAL_TIM_SET_AUTORELOAD(&htim2, timeout);
    /* 清除更新事件标志位 */
    __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
    /* 等待定时器溢出 */
    while(HAL_TIM_Base_PollForTimeout(&htim2, timeout) == HAL_OK);
    /* 停止定时器 */
    HAL_TIM_Base_Stop_IT(&htim2);
}

4.3 GPIO与1-Wire通信的结合

4.3.1 GPIO模拟1-Wire时序

1-Wire是一种单总线通信协议,允许在单一数据线上实现数据的传输。DS18B20温度传感器就是使用1-Wire协议进行通信的。在STM32F103中,虽然没有硬件1-Wire接口,但是可以通过GPIO引脚模拟1-Wire时序来与DS18B20通信。

为了模拟1-Wire协议,我们需要编写一组函数来产生精确的时序控制信号,包括初始化信号、复位信号和数据位的读写。以下是通过GPIO产生1-Wire复位信号的示例代码:

void OW_Reset(void) {
    HAL_GPIO_WritePin(OW_PORT, OW_PIN, GPIO_PIN_RESET); // 拉低数据线
    HAL_Delay(500); // 延时480us以上
    HAL_GPIO_WritePin(OW_PORT, OW_PIN, GPIO_PIN_SET); // 拉高数据线
    HAL_Delay(80); // 等待DS18B20响应
}

4.3.2 代码实例与测试

最后,通过整合上面的GPIO配置、延时函数以及1-Wire模拟时序函数,我们可以构建一套与DS18B20通信的代码。下面是一个简化的例子,展示了如何读取DS18B20的温度值:

void read_temperature(void) {
    uint8_t temp[9];
    uint8_t i, data;
    int16_t temp_read;

    // 初始化1-Wire通信
    OW_Reset();
    // 发送写时序函数,这里是跳过ROM命令0x33
    OW_WriteByte(0x33);
    // 发送读时序函数,这里是读取温度寄存器命令0xBE
    OW_WriteByte(0xBE);

    // 循环读取9个字节数据
    for(i = 0; i < 9; i++) {
        data = OW_ReadByte();
        temp[i] = data;
    }

    // 将读取的数据转换为实际的温度值
    temp_read = (temp[1] << 8) | temp[0];
    // 处理温度值(此处省略温度转换公式)

    // 显示温度值(此处省略显示逻辑)
}

在代码中, OW_WriteByte OW_ReadByte 函数需要根据DS18B20的数据手册中描述的1-Wire协议的时序图来实现。通过这个例子,读者可以理解如何通过GPIO模拟1-Wire协议,并与DS18B20进行基本的数据交换。

5. 整合HAL库或LL库驱动代码和配置文件

5.1 HAL库与LL库的介绍

5.1.1 HAL库与LL库的特点与区别

STM32微控制器的软件开发可以通过不同的库函数进行,其中,HAL(硬件抽象层)库和LL(低层)库是两种常用的软件抽象层。HAL库提供了一套标准化的API,以简化硬件操作,侧重于代码的可移植性和易用性。HAL库拥有较为丰富的函数库,对于初学者和需要快速开发的应用来说,能够提供较为直接的硬件控制接口。

相对而言,LL库则提供了更接近硬件层面的接口,为开发人员提供了更大的灵活性和控制力,尤其是针对性能要求较高和对硬件资源使用有精确定制需求的场合。LL库的优点在于它的简洁性和对性能的极致追求,缺点是代码的可移植性较低,需要开发者对硬件有更深入的理解。

5.1.2 库函数的集成与配置

集成和配置HAL库或LL库的过程中,需要关注几个关键点:
- 项目配置文件 (如 .ioc 文件):通过STM32CubeMX工具可以快速生成项目的基础配置代码,包括时钟树、外设初始化代码等。
- 编译器与IDE :确保开发环境(如Keil uVision、STM32CubeIDE等)支持所选库,并正确配置项目依赖。
- 中断与外设初始化 :在主函数 main.c 中,通过调用HAL或LL库提供的初始化函数来激活所使用的硬件外设。

5.2 驱动代码的整合方法

5.2.1 HAL库下的驱动整合

在HAL库环境下,整合驱动代码的步骤如下:
1. 初始化 :使用 HAL_Init() 函数初始化HAL库。
2. 系统时钟配置 :调用 SystemClock_Config() 函数配置MCU的时钟系统。
3. 外设初始化 :使用HAL提供的 HAL_GPIO_Init() HAL_ADC_Init() 等函数来初始化需要的外设。

整合示例代码片段:

/* 初始化HAL库 */
HAL_Init();

/* 配置系统时钟 */
SystemClock_Config();

/* 初始化GPIO */
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/* 之后添加其他外设初始化代码 */

5.2.2 LL库下的驱动整合

在LL库环境下整合驱动,需要直接操作硬件寄存器或使用LL库提供的低层函数。步骤包括:
1. 时钟使能 :配置并开启所使用的外设时钟。
2. 配置GPIO :直接配置GPIO寄存器来初始化GPIO引脚。
3. 配置外设 :使用LL库函数配置外设相关参数。

整合示例代码片段:

/* 使能GPIO时钟 */
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);

/* 配置GPIO模式为输出 */
GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/* 使用LL库函数配置其他外设 */

5.3 配置文件的设置

5.3.1 系统时钟的配置

正确配置系统时钟是整个项目稳定运行的基础。在STM32中,可以通过STM32CubeMX工具生成的 SystemClock_Config() 函数中对时钟树进行配置,包括PLL设置、总线时钟配置等。

系统时钟配置代码片段:

/* 此函数由STM32CubeMX生成,示例中展示了PLL的设置 */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_9;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  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_3) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
}

5.3.2 中断优先级与NVIC配置

配置中断优先级与NVIC(嵌套向量中断控制器)是确保外设正确响应外部事件和中断信号的关键步骤。代码配置示例如下:

/* 此函数由STM32CubeMX生成,用于配置中断优先级 */
void HAL_NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
{
  /* 此处省略了由STM32CubeMX生成的NVIC配置代码 */
}

/* 在main函数中初始化NVIC */
HAL_NVIC_Init(&nvic_structure);

确保以上配置正确完成,项目代码便能够正常运作,进行温度监控的学习与实践。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该仿真项目提供了STM32F103微控制器与DS18B20数字温度传感器之间通信的源码,旨在通过实践示例教授嵌入式系统开发者如何在硬件上实现温度监测。DS18B20传感器通过1-Wire协议与STM32F103进行数据交换,包括初始化、命令发送、数据读取及错误检测。源码包括完整的项目文件,如驱动代码、主循环逻辑以及配置文件,有助于开发者理解传感器的集成过程和1-Wire协议的应用。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐