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函数怎么搞?希望大师指导指导
将Mbed OS的代码转换为使用HAL库的代码涉及到以下几个步骤:
定义引脚:根据具体的STM32型号,使用HAL库定义引脚。
初始化引脚:使用HAL GPIO初始化函数进行初始化。
延时函数:将Mbed的wait_us函数替换为HAL库中的延时函数。
GPIO操作:使用HAL库的GPIO操作函数
初始化和定义引脚
首先定义引脚和初始化函数:
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() /
这个OS好像宣布停止更新和维护了 将Mbed OS中的功能转换为使用STM32 HAL库的功能,主要涉及到对硬件访问方式的改变,因为Mbed OS和STM32 HAL库提供了不同的抽象层来与STM32微控制器交互。 这个要改成 HAL,主要是把 DigitalOut 改成 HAL_GPIO_WritePin,wait_us 换成 HAL_Delay,其他逻辑应该差不多。 你这个 TextLCD 是用 4 线模式驱动 1602/12864 的吗?用 HAL 就是 GPIO 方式模拟,流程基本一样。 writeByte 这个函数你是怎么写的?如果是直接输出到 GPIO,改成 HAL_GPIO_WritePin 就可以了。 wait_us(1500) 这种短延时的话,HAL_Delay 可能不够精确,建议用 for 循环或者 DWT_Delay 实现。 你用的 STM32 型号是哪款?有些 HAL 库里自带 LCD 驱动,比如 stm32f1xx_hal_lcd.c,可以参考一下。 HAL 里通常用 GPIO_InitTypeDef 先初始化 GPIO,再用 HAL_GPIO_WritePin 控制引脚,你有初始化代码吗? 这个 _d(d4, d5, d6, d7) 应该是 BusOut 组合输出,改成 HAL 就是多个 HAL_GPIO_WritePin 了。 你可以封装一个 lcd_write_nibble(uint8_t data),用 HAL_GPIO_WritePin 设置 D4~D7,再拉高 E 脉冲,模拟数据写入。 cls() 是清屏函数,应该是 writeCommand(0x01),改成 HAL 也是一样的,调用 HAL_GPIO_WritePin 发送数据。 如果只是改成 HAL,代码逻辑变化不大,主要是 DigitalOut 改 GPIO 操作,延时换 HAL_Delay,你可以试试先改 writeByte 看看效果。
		页: 
[1]