HPM6750 rt-thread SPI ST7796S 驱动分享(1)
[复制链接]
我靠虑还是依靠rt-thread 的设备框架进行开发,先辑半导体的这个MCU太复杂了那么使用RTOS会更加易用一点,省着造轮子了
1. 硬件GPIO 链接
LCD
IO分配
CS PF03
RESET PF09
DC/RS PE28
SDI(MOSI) PB22
SCK PB21
LED PF4
SDO(MISO) PB25
2.rt-thread 下的 GPIO使用
很懵逼,哎完全不知道从何入手,他的gpio的一个寄存器的结构跟市场上常见ARM完全是不一样的,这个MCU太复杂了
这个是drv_gpio.h
/*
* Copyright (c) 2021 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
* Change Logs:
* Date Author Notes
* 2022-01-11 HPMICRO First version
* 2022-03-22 zhangjun add GET_PIN
*/
#ifndef DRV_GPIO_H
#define DRV_GPIO_H
#define __HPM_PORT(port) IOC_PAD_P##port##00
#define GET_PIN(PORTx,PIN) (__HPM_PORT(PORTx) + PIN)
int rt_hw_pin_init(void);
#endif /* DRV_GPIO_H */
rt-thread 是使用 GET_PIN这个宏 来获得pin的信息
drv_gpio.c 定义了 PIN 设备管理接口 ,其中有个hpm_pin_ops结构体
const static struct rt_pin_ops hpm_pin_ops = {
.pin_mode = hpm_pin_mode,
.pin_write = hpm_pin_write,
.pin_read = hpm_pin_read,
.pin_attach_irq = hpm_pin_attach_irq,
.pin_detach_irq = hpm_pin_detach_irq,
.pin_irq_enable = hpm_pin_irq_enable};
rt_pin_ops 是一组 函数指针
struct rt_pin_ops
{
void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode);
void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value);
rt_int8_t (*pin_read)(struct rt_device *device, rt_base_t pin);
rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin,
rt_uint8_t mode, void (*hdr)(void *args), void *args);
rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin);
rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled);
rt_base_t (*pin_get)(const char *name);
};
然后使用了rt_hw_pin_init调用那个结构体
int rt_hw_pin_init(void)
{
int ret = RT_EOK;
ret = rt_device_pin_register("pin", &hpm_pin_ops, RT_NULL);
return ret;
}
rt_hw_board_init()函数调用了rt_hw_pin_init函数,也就是这个函数 会跟RTOS 一起初始化
所以应用程序通过 RT-Thread 提供的 PIN 设备管理接口来访问 GPIO,相关接口如下所示:
函数 |
描述 |
rt_pin_get() |
获取引脚编号 |
rt_pin_mode() |
设置引脚模式 |
rt_pin_write() |
设置引脚电平 |
rt_pin_read() |
读取引脚电平 |
rt_pin_attach_irq() |
绑定引脚中断回调函数 |
rt_pin_irq_enable() |
使能引脚中断 |
rt_pin_detach_irq() |
脱离引脚中断回调函数 |
那如何获得引脚编号 那我们分析这个宏
#define __HPM_PORT(port) IOC_PAD_P##port##00
#define GET_PIN(PORTx,PIN) (__HPM_PORT(PORTx) + PIN)
也很懵逼那这个红应该填什么呢
那查找一下IOC_PAD_P这个字符串
但是这个编辑的查找只能在一个文件里查找
可以使用这个放大镜搜索在工作区间里搜索字符串
点击那个放大镜
那由此图可以分析出 应该这么写
GET_PIN(F,3)
3.实验验证
|