打印
[STM32F3]

如何使用HAL库进行UART和I2C配置的示例代码

[复制链接]
284|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高级安全大使|  楼主 | 2024-10-31 23:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32CubeMX配置
在开始之前,使用STM32CubeMX进行基本配置:

选择微控制器:打开STM32CubeMX,选择你的STM32微控制器。
配置UART:
在“Pinout & Configuration”选项卡中,选择UART并配置引脚(如TX和RX)。
设置波特率(例如115200)。
配置I2C:
选择I2C并配置引脚(SDA和SCL)。
设置I2C时钟速度(如100 kHz)。
生成代码:点击“Project”设置名称和保存位置,然后生成代码。
2. 代码实现
下面是一个示例代码,展示如何使用HAL库配置和使用UART和I2C。

a. 头文件和全局变量
c
复制代码
#include "stm32f4xx_hal.h"  // 根据具体型号修改

// UART句柄
UART_HandleTypeDef huart1;

// I2C句柄
I2C_HandleTypeDef hi2c1;
b. UART初始化函数
c
复制代码
void MX_USART1_UART_Init(void)
{
    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;
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
        // 初始化错误处理
        Error_Handler();
    }
}
c. I2C初始化函数
c
复制代码
void MX_I2C1_Init(void)
{
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000; // I2C时钟速度
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if (HAL_I2C_Init(&hi2c1) != HAL_OK)
    {
        // 初始化错误处理
        Error_Handler();
    }
}

使用特权

评论回复
沙发
高级安全大使|  楼主 | 2024-10-31 23:25 | 只看该作者
数据发送和接收
UART发送函数
c
复制代码
void UART_Send(const char *message)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
}
I2C读取函数
c
复制代码
HAL_StatusTypeDef I2C_Read(uint8_t device_addr, uint8_t reg_addr, uint8_t *data)
{
    // 发送寄存器地址
    HAL_I2C_Master_Transmit(&hi2c1, device_addr << 1, &reg_addr, 1, HAL_MAX_DELAY);
    // 读取数据
    return HAL_I2C_Master_Receive(&hi2c1, device_addr << 1, data, 1, HAL_MAX_DELAY);
}
e. 主循环示例
c
复制代码
int main(void)
{
    HAL_Init();  // 初始化HAL库
    SystemClock_Config();  // 配置系统时钟
    MX_USART1_UART_Init(); // 初始化UART
    MX_I2C1_Init();        // 初始化I2C

    uint8_t sensor_data;
    char buffer[50];

    while (1)
    {
        // 从I2C设备读取数据
        if (I2C_Read(0x1A, 0x00, &sensor_data) == HAL_OK)
        {
            // 发送读取的数据到UART
            sprintf(buffer, "Sensor Data: %d\n", sensor_data);
            UART_Send(buffer);
        }
        else
        {
            UART_Send("I2C Read Error\n");
        }

        HAL_Delay(1000); // 延时1秒
    }
}

使用特权

评论回复
板凳
高级安全大使|  楼主 | 2024-10-31 23:25 | 只看该作者
错误处理函数
确保定义一个简单的错误处理函数:

c
复制代码
void Error_Handler(void)
{
    // 用户可以添加自己的错误处理逻辑
    while (1)
    {
        // 错误指示灯闪烁或进入死循环
    }
}
4. 总结
通过以上步骤,你可以使用STM32的HAL库配置UART和I2C接口,实现简单的数据通信。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

408

帖子

1

粉丝