豌豆爹 发表于 2022-12-11 09:41

Mbed OS 的函数,改成HAL函数怎么写?请教请教


[*]TextLCD::TextLCD(PinName rs, PinName e, PinName d4, PinName d5,
[*]               PinName d6, PinName d7, LCDType type) : _rs(rs),
[*]      _e(e), _d(d4, d5, d6, d7),
[*]      _type(type) {
[*]
[*]    _e= 1;
[*]    _rs = 0;            // command mode
[*]
[*]    wait_us(1500);      // Wait 15ms to ensure powered up
[*]
[*]    /* send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)*/
[*]    for (int i=0; i<3; i++) {
[*]      writeByte(0x3);
[*]      wait_us(1640);// this command takes 1.64ms, so wait for it
[*]    }
[*]    writeByte(0x2);   // 4-bit mode
[*]    wait_us(40);    // most instructions take 40us
[*]
[*]    writeCommand(0x28); // Function set 001 BW N F - -
[*]    writeCommand(0x0C);
[*]    writeCommand(0x6);// Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
[*]    cls();
[*]}

复制代码
这个原来是Mbed OS 的函数,改成 HAl函数怎么搞?希望大师指导指导

家有两宝呀 发表于 2024-7-31 23:59

将Mbed OS的代码转换为使用HAL库的代码涉及到以下几个步骤:

定义引脚:根据具体的STM32型号,使用HAL库定义引脚。
初始化引脚:使用HAL GPIO初始化函数进行初始化。
延时函数:将Mbed的wait_us函数替换为HAL库中的延时函数。
GPIO操作:使用HAL库的GPIO操作函数

家有两宝呀 发表于 2024-7-31 23:59

初始化和定义引脚
首先定义引脚和初始化函数:

c

#include "stm32f4xx_hal.h"

// 定义引脚
#define RS_PIN GPIO_PIN_0
#define RS_PORT GPIOA
#define E_PIN GPIO_PIN_1
#define E_PORT GPIOA
#define D4_PIN GPIO_PIN_2
#define D4_PORT GPIOA
#define D5_PIN GPIO_PIN_3
#define D5_PORT GPIOA
#define D6_PIN GPIO_PIN_4
#define D6_PORT GPIOA
#define D7_PIN GPIO_PIN_5
#define D7_PORT GPIOA

// GPIO初始化函数
void GPIO_Init() {
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 配置RS引脚
    GPIO_InitStruct.Pin = RS_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(RS_PORT, &GPIO_InitStruct);

    // 配置E引脚
    GPIO_InitStruct.Pin = E_PIN;
    HAL_GPIO_Init(E_PORT, &GPIO_InitStruct);

    // 配置数据引脚D4, D5, D6, D7
    GPIO_InitStruct.Pin = D4_PIN | D5_PIN | D6_PIN | D7_PIN;
    HAL_GPIO_Init(D4_PORT, &GPIO_InitStruct);
}

// 延时函数(微秒)
void delay_us(uint32_t us) {
    uint32_t start = DWT->CYCCNT;
    uint32_t ticks = us * (HAL_RCC_GetHCLKFreq() /


gouguoccc 发表于 2024-8-1 08:18

这个OS好像宣布停止更新和维护了

onlycook 发表于 2024-8-2 17:11

将Mbed OS中的功能转换为使用STM32 HAL库的功能,主要涉及到对硬件访问方式的改变,因为Mbed OS和STM32 HAL库提供了不同的抽象层来与STM32微控制器交互。

公羊子丹 发表于 2025-3-20 08:20

这个要改成 HAL,主要是把 DigitalOut 改成 HAL_GPIO_WritePin,wait_us 换成 HAL_Delay,其他逻辑应该差不多。

周半梅 发表于 2025-3-20 08:21

你这个 TextLCD 是用 4 线模式驱动 1602/12864 的吗?用 HAL 就是 GPIO 方式模拟,流程基本一样。

帛灿灿 发表于 2025-3-20 08:22

writeByte 这个函数你是怎么写的?如果是直接输出到 GPIO,改成 HAL_GPIO_WritePin 就可以了。

童雨竹 发表于 2025-3-20 08:23

wait_us(1500) 这种短延时的话,HAL_Delay 可能不够精确,建议用 for 循环或者 DWT_Delay 实现。

万图 发表于 2025-3-20 08:24

你用的 STM32 型号是哪款?有些 HAL 库里自带 LCD 驱动,比如 stm32f1xx_hal_lcd.c,可以参考一下。

Wordsworth 发表于 2025-3-20 08:25

HAL 里通常用 GPIO_InitTypeDef 先初始化 GPIO,再用 HAL_GPIO_WritePin 控制引脚,你有初始化代码吗?

Bblythe 发表于 2025-3-20 08:26

这个 _d(d4, d5, d6, d7) 应该是 BusOut 组合输出,改成 HAL 就是多个 HAL_GPIO_WritePin 了。

Pulitzer 发表于 2025-3-20 08:27

你可以封装一个 lcd_write_nibble(uint8_t data),用 HAL_GPIO_WritePin 设置 D4~D7,再拉高 E 脉冲,模拟数据写入。

Uriah 发表于 2025-3-20 08:28

cls() 是清屏函数,应该是 writeCommand(0x01),改成 HAL 也是一样的,调用 HAL_GPIO_WritePin 发送数据。

Clyde011 发表于 2025-3-20 08:29

如果只是改成 HAL,代码逻辑变化不大,主要是 DigitalOut 改 GPIO 操作,延时换 HAL_Delay,你可以试试先改 writeByte 看看效果。
页: [1]
查看完整版本: Mbed OS 的函数,改成HAL函数怎么写?请教请教