打印
[其他ST产品]

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

[复制链接]
735|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
豌豆爹|  楼主 | 2022-12-11 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 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好像宣布停止更新和维护了

使用特权

评论回复
5
onlycook| | 2024-8-2 17:11 | 只看该作者
将Mbed OS中的功能转换为使用STM32 HAL库的功能,主要涉及到对硬件访问方式的改变,因为Mbed OS和STM32 HAL库提供了不同的抽象层来与STM32微控制器交互。

使用特权

评论回复
6
公羊子丹| | 2025-3-20 08:20 | 只看该作者
这个要改成 HAL,主要是把 DigitalOut 改成 HAL_GPIO_WritePin,wait_us 换成 HAL_Delay,其他逻辑应该差不多。

使用特权

评论回复
7
周半梅| | 2025-3-20 08:21 | 只看该作者
你这个 TextLCD 是用 4 线模式驱动 1602/12864 的吗?用 HAL 就是 GPIO 方式模拟,流程基本一样。

使用特权

评论回复
8
帛灿灿| | 2025-3-20 08:22 | 只看该作者
writeByte 这个函数你是怎么写的?如果是直接输出到 GPIO,改成 HAL_GPIO_WritePin 就可以了。

使用特权

评论回复
9
童雨竹| | 2025-3-20 08:23 | 只看该作者
wait_us(1500) 这种短延时的话,HAL_Delay 可能不够精确,建议用 for 循环或者 DWT_Delay 实现。

使用特权

评论回复
10
万图| | 2025-3-20 08:24 | 只看该作者
你用的 STM32 型号是哪款?有些 HAL 库里自带 LCD 驱动,比如 stm32f1xx_hal_lcd.c,可以参考一下。

使用特权

评论回复
11
Wordsworth| | 2025-3-20 08:25 | 只看该作者
HAL 里通常用 GPIO_InitTypeDef 先初始化 GPIO,再用 HAL_GPIO_WritePin 控制引脚,你有初始化代码吗?

使用特权

评论回复
12
Bblythe| | 2025-3-20 08:26 | 只看该作者
这个 _d(d4, d5, d6, d7) 应该是 BusOut 组合输出,改成 HAL 就是多个 HAL_GPIO_WritePin 了。

使用特权

评论回复
13
Pulitzer| | 2025-3-20 08:27 | 只看该作者
你可以封装一个 lcd_write_nibble(uint8_t data),用 HAL_GPIO_WritePin 设置 D4~D7,再拉高 E 脉冲,模拟数据写入。

使用特权

评论回复
14
Uriah| | 2025-3-20 08:28 | 只看该作者
cls() 是清屏函数,应该是 writeCommand(0x01),改成 HAL 也是一样的,调用 HAL_GPIO_WritePin 发送数据。

使用特权

评论回复
15
Clyde011| | 2025-3-20 08:29 | 只看该作者
如果只是改成 HAL,代码逻辑变化不大,主要是 DigitalOut 改 GPIO 操作,延时换 HAL_Delay,你可以试试先改 writeByte 看看效果。

使用特权

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

本版积分规则

518

主题

2001

帖子

6

粉丝