RT-Thread初识学习-05-设备操作

2023-05-16

 IO设备模型

 

 IO设备的理解,比如我们使用了一款传感器,但是RTT并没有提供软件包给我们使用,并且我们不需要使用HAL库进行开发,而是想使用RTT给我们的函数,比如下面的rt_device_find()等,那么我们就需要将该设备注册到驱动中,类似于linux的驱动开发,并且基本上我们不会涉及到设备驱动层开发,我们一般只需要涉及到I/0设备管理层即可

下面的图我们只需要涉及到应用程序和IO设备管理器即可了,至于设备驱动框架和设备驱动,一般是不会让我们写的,跟linux一样

 

 

模拟添加设备驱动以及如何使用 

 添加drv.demo.c文件成为我们的驱动文件

在该文件中写驱动文件,在main函数中直接使用应用程序对该设备进行操作即可

 驱动代码编写

模拟其他驱动进行编写即可,先不写init函数,并且使用INIT_BOARD_EXPORT把该初始化函数注册到内核中去,那样内核就会调用我们写的initial函数,而我们在init的操作就是赋值多个函数比如close、open等函数

static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag)
{
    LOG_D("emac open");
    return RT_EOK;
}

static rt_err_t rt_stm32_eth_close(rt_device_t dev)
{
    LOG_D("emac close");
    return RT_EOK;
}

static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
{
    LOG_D("emac read");
    rt_set_errno(-RT_ENOSYS);
    return 0;
}

static rt_size_t rt_stm32_eth_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
{
    LOG_D("emac write");
    rt_set_errno(-RT_ENOSYS);
    return 0;
}

static rt_err_t rt_stm32_eth_control(rt_device_t dev, int cmd, void *args)
{
    switch (cmd)
    {
    case NIOCTL_GADDR:
        /* get mac address */
        if (args) rt_memcpy(args, stm32_eth_device.dev_addr, 6);
        else return -RT_ERROR;
        break;

    default :
        break;
    }

    return RT_EOK;
}


static int rt_hw_stm32_eth_init(void)
{
    rt_err_t state = RT_EOK;

    
    stm32_eth_device.dev_addr[0] = 0x00;
    stm32_eth_device.dev_addr[1] = 0x80;
    stm32_eth_device.dev_addr[2] = 0xE1;
    /* generate MAC addr from 96bit unique ID (only for test). */
    stm32_eth_device.dev_addr[3] = *(rt_uint8_t *)(UID_BASE + 4);
    stm32_eth_device.dev_addr[4] = *(rt_uint8_t *)(UID_BASE + 2);
    stm32_eth_device.dev_addr[5] = *(rt_uint8_t *)(UID_BASE + 0);

    stm32_eth_device.parent.parent.init       = rt_stm32_eth_init;
    stm32_eth_device.parent.parent.open       = rt_stm32_eth_open;
    stm32_eth_device.parent.parent.close      = rt_stm32_eth_close;
    stm32_eth_device.parent.parent.read       = rt_stm32_eth_read;
    stm32_eth_device.parent.parent.write      = rt_stm32_eth_write;
    stm32_eth_device.parent.parent.control    = rt_stm32_eth_control;
    stm32_eth_device.parent.parent.user_data  = RT_NULL;

   

       
}
INIT_DEVICE_EXPORT(rt_hw_stm32_eth_init);

#endif /* BSP_USING_ETH */

 

rt_device_t  My_device = RT_NULL;

rt_err_t My_device_open(rt_device_t dev, rt_uint16_t oflag)
{
    rt_kprintf("My_device_open Enter\r\n");
    
    return RT_EOK;
}

rt_err_t My_device_close(rt_device_t dev)
{
    rt_kprintf("My_device_close Enter\r\n");
    
    return RT_EOK;
    
}


rt_err_t My_device_init(rt_device_t dev)
{
    rt_kprintf("My_device_init Enter\r\n");
    
    My_device = rt_device_create(RT_Device_Class_Char, 32);
    
    My_device->close = My_device_close;
   
    My_device->open =  My_device_open;
    
    rt_device_register(My_device, "My_device",RT_DEVICE_FLAG_RDWR);
    
    return RT_EOK;
}

INIT_BOARD_EXPORT(My_device_init);//初始化函数,等设备运行时,内核会调用rt_demo_init
//如果这一条代码不存在的话,则下面的find设备是会出问题的

rt_device_t  My_dv;
int main(void)
{
   My_dv = rt_device_find("My_device");  //形参为设备名字,返回值为设备对象 
   if(My_dv != RT_NULL)
       rt_kprintf("find is success\r\n");
   
   thread23_sample();
    
   return 0;
}

串口设备使用

#define SAMPLE_UART_NAME    "uart2" /* 串 口 设 备 名 称 */
rt_device_t serial_device; /* 串 口 设 备 句 柄 */

int main(void)
{
   serial_device = rt_device_find(SAMPLE_UART_NAME);
    if(serial_device != RT_NULL)
        rt_kprintf("serial is success\r\n");
    
   thread23_sample();

   return 0;
}

 出现的问题,找不到设备,原因是rtconfig.h没有配置

rtconfig.h的作用相当于freertos上的config.h,因此我这里只定义了串口2,而并没有定义串口1 

 

串口在RTT中是存在初始化设置的,因此如果我们不配置串口的波特率的话,它存在默认选择 ,或者说当我们使用串口的时候,我们可以直接在这里修改即可,无需通过函数进行改变

#define SAMPLE_UART_NAME "uart2" /* 串 口 设 备 名 称 */
static rt_device_t serial; /* 串 口 设 备 句 柄 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初 始 化 配 置 参 数 */
/* step1: 查 找 串 口 设 备 */
serial = rt_device_find(SAMPLE_UART_NAME);
/* step2: 修 改 串 口 配 置 参 数 */
config.baud_rate = BAUD_RATE_9600; //修 改 波 特 率 为 9600
config.data_bits = DATA_BITS_8; //数 据 位 8
config.stop_bits = STOP_BITS_1; //停 止 位 1
config.bufsz = 128; //修 改 缓 冲 区 buff size 为 128
config.parity = PARITY_NONE; //无 奇 偶 校 验 位
/* step3: 控 制 串 口 设 备。 通 过 控 制 接 口 传 入 命 令 控 制 字, 与 控 制 参 数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
/* step4: 打 开 串 口 设 备。 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread初识学习-05-设备操作 的相关文章

随机推荐

  • pycharm常用快捷键

    常用快捷键 复制粘贴撤销就不用我说了吧复制选中行并在该行下粘贴批量注释多行缩进多行删除缩进全局关键字搜索该页关键字搜索查看内置函数源码该函数被哪里引用按文件名搜索py文件按文件名搜索所有类型的文件 复制粘贴撤销就不用我说了吧 复制 xff1
  • linux源码安装python3

    python3源码安装 前置环境解压提前解决依赖性源码编译三部曲验证安装 前置环境 先要准备好源码包 xff0c 去官网下载自己想要的版本https www python org ftp python 我下的是3 9 7的直接下到了要安装p
  • 【shell】用 grep 查找包含字符串的文件|grep 过滤|取匹配行的前后n行

    目录 即可即用 grep 匹配多个关键字 与find的不同 grep检索文件内容详解 grep指定搜索的文件类型 grep 不起作用 xff1f 过滤了还是显示 匹配特定的列 指定在哪些文件 哪类文件 哪个目录里搜索 搜索时包含 排除哪类文
  • 基于FreeRTOS+STM32实践-01

    目的 xff1a 复习FreeRTOS以及STM32的使用 xff0c 完成51单片机到stm32的过渡 该项目会与传感器以及其他种类的外设相联系 xff0c 以提升代码管理能力和逻辑能力 在51单片机中我们使用了很多传感器和外设 xff0
  • C++点亮stm32LED灯

    目的 xff1a 引导初学者使用C 43 43 对STM32进行编程 1 xff1a 在C语言中我们没有封装 继承 多态的概念 xff0c 没有面向对象的程序思想 这些思想一般是源于C 43 43 语言的 xff0c C语言是面向过程的语言
  • 基于FreeRTOS+STM32实践-02

    按键学习 按键常见的为独立按键和行列按键 stm32中不存在Bit类型数据 而在51内核中存在bit类型的 按键引脚分配 开发板自带3个独立按键 xff1a KEY0 PC5 KEY1 PA15 WK UP PA0 行列键盘引脚分配 xff
  • 基于FreeRTOS+STM32实践-03

    03 xff1a 按键的扫描 资源 xff1a 软件定时器 43 信号量 43 消息队列 在51单片机中的按键扫描是 xff1a 标志位在10ms定时器1的中断中置一 xff0c 在while 1 中写一个如下的按键扫描程序 xff0c 目
  • 【正点原子】手把手教你学FreeRTOS-01

    内容为 xff1a 正点原子FreeRTOS的视频前1 8 目的 xff1a 简单的回忆一下 xff0c 加深印象和理解 单片机的发展趋势 操作系统的核心就是 任务调度器 xff0c 关于这些特点 xff0c 也是我们学习FreeRTOS的
  • 【正点原子】手把手教你学FreeRTOS-02

    内容为 xff1a 正点原子FreeRTOS的视频第9 10节 一个任务所需要的资源这些东西在标准库需要我们自己写 xff0c 但是在MX软件中可以自己生成 四项基本 xff1a 优先级 堆栈大小 句柄 任务函数声明 一个XXX任务需要的资
  • 【正点原子】手把手教你学FreeRTOS-03

    基本内容 xff1a 任务的创建 控制块 删除 挂起 恢复的使用 创建任务函数的核心 栈的增长方向为向下的则portSTACK GROWTH gt 0 而我们stm32使用的就是向下因此执行这个 xff0c 下面的就是向上不执行 核心函数p
  • 【正点原子】手把手教你学FreeRTOS-04

    FreeRTOS的中断配置是一个很重要的内容 xff0c 需要根据所使用的MCU来具体配置 重点 xff1a 不同的MCU所在FreeRTOS的配置是不一样的 xff0c 当你使用了其他芯片 xff0c 配置就有所不同了 xff0c 不要固
  • 千锋教育+计算机四级网络-计算机网络学习-01

    目录 课程链接 最早的广域网 计算机网络发展阶段 计算机网络的定义与要点 英文单词网络术语与解释 计算机网络分类 广域网技术 城域网 局域网 个人局域网 五种基本的网络拓扑结构 误码率 电路交换网特点 分组交换 交换方式 TCP IP协议族
  • Keil + STM32学习嵌入式数据结构-01

    视频链接 初识数据结构 xff0c 十天搞定嵌入式数据结构 哔哩哔哩 bilibili 课程目的 学会嵌入式经常使用的数据结构 具备基础知识 具有C语言基础 xff08 结构体 指针 内存 xff08 malloc xff09 具有数据结构
  • 【网络】nmcli 网络管理工具|ip命令|ethtool 命令|centOS 8 重启网络服务 / 重启网卡

    目录 nmcli 命令 前提 重启网络服务 重启网卡 实例 nmcli输出说明 3种网络配置方法 nmcli的命令参数 Tips ethtool 命令 IP命令 添加网卡到配置文件 Linux系统怎么查看网卡的UUID nmcli 命令 原
  • 正点原子【第四期】手把手教你学 Linux之驱动开发篇-01

    学习目的 了解驱动开发和应用开发的过程 xff0c 具有一定的基础就行 第一讲 xff1a linux驱动开发与裸机开发区别 刚开始听不懂很正常 xff0c 等之后学了一点你就会知道它说啥了 第二讲 xff1a 字符设备驱动开发基础 字符设
  • 普中科技手把手教你学ESP32--基于MicroPython-02

    第四讲 xff1a LED灯实验 MicroPython函数使用 本来需要加入machine 的 xff0c 但是我引入了form machine import Pin就可以直接省略了 machine是一个模块 xff0c Pin是mach
  • 千锋教育嵌入式物联网教程之系统编程篇学习-05

    目录 无名管道 无名管道创建 pipe 管道重点问题 无名管道读写规律 fcntl设置文件阻塞特性 文件描述符概述 文件描述符的复制 dup和dup2 dup函数 dup2 无名管道 进程间的通信 xff0c 大部分都是使用内核空间进行操作
  • 黑马程序员-Linux系统编程-01

    课程链接 01 Linux命令基础习惯 Linux系统编程 哔哩哔哩 bilibili 课程重点笔记 01 linux命令基础习惯 终端 终端 xff1a 一切输入 输出的总称 xff0c 因此终端并不是一定指的是命令行 xff0c 只要是
  • RT-Thread初识学习-04-GPIO操作

    前言 xff1a 在裸机开发和FreeRTOS开发过程中 xff0c 我们使用的GPIO操作函数都是由stm32库函数提供 xff0c 如GPIO SetBits GPIO Init GPIO结构体对端口进行初始化 模式 速度 管脚号等操作
  • RT-Thread初识学习-05-设备操作

    IO设备模型 IO设备的理解 xff0c 比如我们使用了一款传感器 xff0c 但是RTT并没有提供软件包给我们使用 xff0c 并且我们不需要使用HAL库进行开发 xff0c 而是想使用RTT给我们的函数 xff0c 比如下面的rt de