查看: 3565|回复: 1

[原创] hal 库中串口的三种传输方式

[复制链接]
  • TA的每日心情
    开心
    2024-1-16 17:48
  • 签到天数: 592 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2018-10-13 17:20:00 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 robe.zhang 于 2018-10-14 20:32 编辑

    hal 库中串口的三种传输方式:
    1.png
    第一种传输方式:HAL_UART_Transmit()  这个方式是直接给 transfer data buffer 寄存器送值,传送,相当于是寄存器操作,因为有个结构体,数据有点抽象,实质还是直接操作寄存器,看图:
    2.png
    第二种方式是 DMA 传输,需要启动 DMA 才能用,
    第三种方式是中断传输,初始化结构体之后,开启空中断如下图,然后就进中断了,这种方式需要打开 uart 中断
    3.png
    串口所有中断都在handler 里了,所以要判断,是什么中断,是空中断就执行这个 传输中断,这个函数在库里面是 static 类型的,外部调用不了,看名字没有 HAL_ 开头,所以不要用,也不能外部调用。
    4.png
    还是寄存器赋值,不过这个是在中断里面给寄存器赋值,所以叫中断传输,传输时候传进去个参数是数据长度,size,
    5.png
    这里面 count 参数的初始值是 size,那就判断,传输一次,count 减去1, 传输没完,还是 发送寄存器空中断,继续中断,继续发送,又回到开头那个位置,继续循环,到这里,如此往复循环,直到 count ==0 了,就进来修改中断标记,把发送寄存器空中断标记去掉,加个 发送完成中断标记,继续去中断
    6.png
    这次中断的时候,判断发现发送完成了,那就不发了,进 发送完成处理函数,这个函数是指 size 个数据全部发完了,来这个endtranmit 函数执行。
    上面的发送完成是指,单个 8/9 bit 数据,也就是 1 size 个数据发送完了,在上面循环,同时 --size, 知道 size==0 来这里处理 end 。
    7.png
    主要就是这种中断的方式 和 直接发送,有点差别。差别也不大。如下:
    直接发送时候 还有个 timeout 参数,是取 systick 时间作为基准,看看有么有超时,超时的话退出。直接发送是 block 函数,阻塞,在 timeout 时间内阻塞,要么发送完成,退出,要么没法送完成,但是 timeout 超时了也要退出。
    中断发送没有 timeout 参数,no-block 函数,先获取 uart 锁,直接把参数传给结构体,把串口设置为忙状态,置位发送寄存器空中断,解锁,就这么多操作。其中锁是 rots 里面采用到,裸机就是操作几个变量,很快就完成了,完事了就退出,其他的事情交给中断处理了。适合很多数据要传输的场景,比如,一个图片,交给 uart 中断方式传输,mcu 立马被释放了,mcu 该干啥还干啥。
    这个是 lock 宏定义:
    8.png
    最后看一下,还是这个图片,箭头的注释部分,应该是 transmit data buffer empty interrupt ,注释错了,不影响代码。 6.png
    stm32cobemx 配置串口参数,中断,DMA 在这里:
    12.png
    9.png
    10.png
    11.png
    最后:  发送了 5KB 数据, 使用 115200 bps 速度,8n1,通过视频看看中断发送和不用中断 mcu 占用情况,
    红色 led 亮灯时间,是中断发送需要的时间,绿色 led 亮灯时间,是不用中断发送需要的时间,

    通过视频能看到,仅仅 5KB 的数据,cpu 占用的差别已经很明显了。 中断发送,不管数据多少,都是占用这么多固定时间,不用终端,数据越多,占用就越多。
    其实第二种 DMA 传输方式,占用 cpu 最少,因为连中断就不用处理了。
    本文用 led 亮灯时间来显示 cpu 占用时间,其实是不严谨的,大概看看对三种方式有个感性认识就好






    评分

    参与人数 1与非币 +60 收起 理由
    satoll + 60 感谢分享

    查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 21:28 , Processed in 0.124259 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.