0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt-thread 驱动篇(四)serialX 多架构适配

出出 ? 来源:出出 ? 作者:出出 ? 2022-06-10 10:21 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

自笔者提出 serialX 串口驱动到今天近半年了,当初只在 STM32F4 NUC970 两个系列芯片上做过理论验证。一个是 ARM CM4 核心架构,一个是 ARM9。这两款芯片能完美实现笔者的需求。

经过这半年的实践考验,笔者还是相信 serialX 的实力的,最近这几天笔者尝试在 N32 AB32 RA6M4 上适配 serialX,下面就向各位汇报一下适配结果。

芯片 STM32F4 NUC970 N32 AB32 RA6M4 GD32F4
架构 CM4 ARM9 CM4 RISC-V CM33 CM4

N32G45

因为这个也是 CM4,和 STM32F4 相较而言,可能差别很小。让笔者感到欣慰的是用`DMA_GetFlagStatus(uart->dma_tx.dma_flag, uart->dma_tx.dma_module) == SET` 代替了 `uart->dmaTxing` 。这是一处小改进。
除此之外,没啥可说的了。

已实现的功能有:

  • 轮询收发
  • 中断收发(可阻塞可非阻塞)
  • DMA 收发(可阻塞可非阻塞)

AB32VG1

这个是 RISC-V 架构的 CPU

从芯片手册我们可以看到,它的串口外设只有“接收一个字节完成”和“发送一个字节完成”两个中断。
在 serialX 的设计构想里,我们希望有个“发送寄存器空”中断。因为这样很容易启动一次中断,在中断里判断是否有数据需要发送,进而启动一次发送过程。
假如没有这个中断,我们必须通过先写一个字节引起一次“发送完成中断”,然后借助这次中断继续判断是否有数据需要发送。在数据所有数据发送完之前,我们还需要有个 flag 标识一下现在处于发送流程中。
因此,serialX 需要进行一些改动:
`_serial_int_tx` 函数

       // TODO: start tx
#if defined (RT_SERIAL_NO_TXEIT)
       if (serial->ops->is_int_txing != RT_NULL && serial->ops->is_int_txing(serial) == RT_FALSE) {
           ch = _serial_fifo_pop_data(tx_fifo);
           serial->ops->start_tx(serial, ch);
       }
#else
       serial->ops->start_tx(serial);
#endif
```
`struct rt_uart_ops`
```
#if defined (RT_SERIAL_NO_TXEIT)
   rt_bool_t (*is_int_txing)(struct rt_serial_device *serial);
   void (*start_tx)(struct rt_serial_device *serial, rt_uint8_t ch);
#else
   void (*start_tx)(struct rt_serial_device *serial);
#endif

因为这些改动,AB32VG1 的底层驱动写法也就不一样了,多了一个判断是否处于发送流程中的 api。start_tx stop_tx 也不仅仅是开关中断那么简单了,需要改变 intTxing 这个 flag 标识发送流程状态。

rt_bool_t ab32_int_txing(struct rt_serial_device *serial)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);

   return uart->intTxing;
}

static void ab32_start_tx(struct rt_serial_device *serial, rt_uint8_t ch)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);
   uart->intTxing = RT_TRUE;
   hal_uart_control(uart->handle.instance, UART_TXIT_ENABLE, HAL_ENABLE);
   hal_uart_write(uart->handle.instance, ch);
}

static void ab32_stop_tx(struct rt_serial_device *serial)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);
   hal_uart_control(uart->handle.instance, UART_TXIT_ENABLE, HAL_DISABLE);
   uart->intTxing = RT_FALSE;
}

为此,我们需要添加个新配置,components/drivers/Kconfig

           config RT_SERIAL_NO_TXEIT
               bool "No TX Empty interrupt"
               default n
               help
                   Useful only if the chip hasn't Transmit Register Empty interrupt
                   Such as: AB32 RA6M4

意思是说,当芯片没有“发送寄存器空中断”支持的时候,我们需要用 `intTxing` 代替实现控制发送过程。

另外,发送寄存器也没有空状态,`putc` 函数倒是可以判断发送完成标志,但是这样就不能在中断里调用 `putc` 了;不加发送完成判断,就不能在轮询发送中调用它。总之,轮询发送和中断发送不用用一样的 `putc` 函数了。

已实现的功能有:

  • 中断收发(可阻塞可非阻塞)


RA6M4

RA6M4 是一款 CM33 核 ARM 芯片,本以为它比 CM4 高级可以很容易实现 CM4 上实现的操作。

但是,笔者也没有从手册中找到“发送寄存器空中断”。所以 RA6M4 和 AB32VG1 有一样的补救处理。
但是,笔者还发现另外一个问题,**如果是中断发送,每次写完 TDR 寄存器后,必须重新使能发送中断**。不这样做,就不会出现发送完成中断。

虽然如此,连续发送多个字节仍然会出现发送中断不触发(或丢失)的情况,导致发送功能完全瘫痪(这也是 `intTxing` 引入的隐患)。

已实现的功能有:

  • 中断接收(可阻塞可非阻塞)
  • 中断发送(未完),暂时可以用轮询发送代替

多说两句,RA6M4 的 SCI 好像可以启用 FIFO ,这样一来串口收发寄存器就是带 FIFO 的。遗憾的是笔者不会用啊,有会用的大佬可以尝试移植一下,用 FIFO 了就相当于用 DMA 了。

GD32F4

这个也可以做到和 STM32F4 一样的程度,DMA 没有发送标志,只能继续用 `dmaTxing` 。

已实现的功能有:

  • 轮询收发
  • 中断收发(可阻塞可非阻塞)
  • DMA收发(可阻塞可非阻塞)

注:只分配了 UART0 的 DMA 通道,如果其它的也需要开启 DMA 请自行修改 `struct gd32_uart uarts` 数组变量分配 DMA 通道。

注:还有一点,rt-studio 里下载的 GD32F4 firmware 库版本是很多年前的,现在已经改动过好几次了。笔者使用的 `gd32f4xx_usart.h` 版本是 “2020-09-30, V2.1.0, firmware for GD32F4xx” 。如有编译错误请升级 firmware 库。

结束语

关于 serialX 理论的部分,之前的文章已经说的够多了。这次是想在多种平台上用实践检验一下 serialX 理论的可行性。经过这几天的投入,最终多多少少有些收获,还是很欣慰的。

汇总一下,目前可以适配的芯片包括如下几类
1. 没有 DMA ,只有串口接收发送中断
2. 没有“发送寄存器空”状态或没有“发送寄存器空”中断
3. 带接收 IDLE 检测,带“发送寄存器空”中断
4. 带 DMA ,并且至少有 DMA 半传输中断和全传输中断
5. 串口外设自带收发 FIFO (可认为是 DMA ,但是比 DMA 使用更简单)

在此,特别感谢[嚜軒公告](https://club.rt-thread.org/u/7c37fff6229d1ccd)支援的开发板,最终完成了 serialX 在这些平台上的实现。

下期预告,我们来扒一扒 serialX 的缺陷,对,它的缺陷。准确的讲是在 RTOS 上引入的坑有哪些以及怎么避免。

附 [serialX](https://gitee.com/thewon/serialX) 仓库地址,感兴趣的可以下载最新版 serialX 源码。本文提到的几种芯片的驱动也都已提交。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9396

    浏览量

    380076
  • N32
    N32
    +关注

    关注

    0

    文章

    18

    浏览量

    7444
  • STM32F4
    +关注

    关注

    3

    文章

    203

    浏览量

    29181
  • RT-Thread
    +关注

    关注

    32

    文章

    1441

    浏览量

    42360
  • serialX
    +关注

    关注

    0

    文章

    7

    浏览量

    858
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 ?2431次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结

    VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两,将手把手教您移植。上篇对
    的头像 发表于 07-17 14:40 ?2365次阅读
    <b class='flag-5'>RT-Thread</b> Nano硬核移植指南:手把手实现VGLite图形<b class='flag-5'>驱动</b><b class='flag-5'>适配</b> | 技术集结

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 ?691次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驱动</b>深度<b class='flag-5'>适配</b>指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    贡献,荣获年度“优秀开源项目奖”。RT-Thread睿赛德荣获2025优秀开源项目奖目前,开源已从软件领域延展至硬件、数据、算法、标准、内容等领域。作为国内开源
    的头像 发表于 07-04 09:04 ?1956次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    玄铁加入RT-Thread 高级会员合作伙伴 | 战略新篇

    。深化合作,共建RISC-V生态RT-Thread作为国内领先的嵌入式操作系统,与玄铁团队在技术适配、生态共建方面已建立长期紧密的合作关系。目前,RT-Thread
    的头像 发表于 06-23 20:22 ?590次阅读
    玄铁加入<b class='flag-5'>RT-Thread</b> 高级会员合作伙伴 | 战略新篇

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 ?771次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 ?2047次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    从开源中来到开源中去-RT-Thread北京社区

    RT-Thread今年全域推行不同区域社区网,通过建立区域社区网,构建更加紧密联系的开源社区,实现更广泛的开源资源共享,让更多的RT-Thread开发者受益。今年8月份RT-Thread正式启动北京
    的头像 发表于 11-29 01:05 ?550次阅读
    从开源中来到开源中去-<b class='flag-5'>RT-Thread</b>北京社区<b class='flag-5'>篇</b>

    【S32K146 RT-Thread】之 使用SFUD组件驱动spi flash

    【S32K146 RT-Thread】之 使用SFUD组件驱动spi flash
    的头像 发表于 11-21 01:05 ?1267次阅读
    【S32K146 <b class='flag-5'>RT-Thread</b>】之 使用SFUD组件<b class='flag-5'>驱动</b>spi flash

    RT-Thread上CAN实践

    开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来我们要完成CAN_FD的驱动移植,并正常启动
    的头像 发表于 11-13 01:03 ?2290次阅读
    <b class='flag-5'>RT-Thread</b>上CAN实践

    混合部署 | 在迅为RK3568上同时部署RT-Thread和Linux系统

    RT-Thread介绍 RT-Thread 是一个高安全性、实时性的操作系统,广泛应用于任务关键领域,例如电力、轨道交通、车载系统、工业控制和新能源等。它的加入让 RK3568 能够在保证系统实时性
    发表于 11-01 10:31

    【S32K146 RT-thread】之 SPI驱动适配

    概述RT-Thread对SPI总线的驱动,抽象出了spibus的设备驱动,我们基于S32K146的硬件学习spibus设备驱动
    的头像 发表于 11-01 08:11 ?1399次阅读
    【S32K146 <b class='flag-5'>RT-thread</b>】之 SPI<b class='flag-5'>驱动</b><b class='flag-5'>适配</b>

    开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!

    亲爱的RT-Thread开发者我们很高兴地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread开发者大会)正式启动报名!2024RT-Threa
    的头像 发表于 10-29 08:06 ?1033次阅读
    开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名启动!

    混合部署 | 在迅为RK3568上同时部署RT-Thread和Linux系统

    RT-Thread介绍 RT-Thread 是一个高安全性、实时性的操作系统,广泛应用于任务关键领域,例如电力、轨道交通、车载系统、工业控制和新能源等。它的加入让 RK3568 能够在保证系统实时性
    发表于 09-18 10:54

    新书发布——《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》

    我们非常高兴地宣布,由郑苗秀、沈鸿飞和廖建尚编著的《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》一书正式发布。本书的编写团队由多位在嵌入式和实时操作系统领域有着丰富经验的专家组
    的头像 发表于 09-03 08:06 ?1467次阅读
    新书发布——《<b class='flag-5'>RT-Thread</b>嵌入式实时操作系统内核、<b class='flag-5'>驱动</b>和应用开发技术》