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

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

3天内不再提示

【有那么点详细的CW32学习笔记】通用异步收发器—中断接收篇

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2023-11-17 17:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上回说到单片机Uart发送,我们编写了一个发送函数循环发送固定的字符串,这回我们讲Uart的中断接收功能。

说一下中断是什么 ,大概就是说,单片机只有一个核,就是只有一个大脑,他无法一核二用地做事,但有时候迫不得已需要去响应一些紧急的命令,就好比你打游戏开团了,你妈喊你去倒开水,倒开水就会触发咱们人类的“中断”功能。放在单片机上,进行中断操作需要以下几个条件和步骤:拥有 中断源中断控制器正常工作触发中断保护现场响应中断恢复现场

看名字可能会比较抽象,我来具体解释一下。

中断源 ,单片机上会有很多的中断源,也就是有很多办法、或者说“渠道”去触发中断,Uart外设就有很多触发中断的办法,而我们本文涉及到的就是接收信息会触发的中断,具体怎么触发的,后文会详细解释。

中断控制器 ,这个东西是一个物理存在于单片机内核里面的一块数字电路,这一块电路的功能就是用来管理中断的。对于一些老旧型号的单片机,比如C51单片机,他内部也有这个东西,只不过其中断优先级是固定的,这个控制器只扮演了“总闸”这样的角色。再看CW32这种32位单片机,使用cortex-M0+内核, 拥有可编程的中断控制器 ,单片机上会有很多个中断源,但这是内核可以使用和管理的部分,芯片制造厂使用这一款内核制造单片机,并不会用到所有的中断资源,不只是搭载的功能有限,还受限于封装,很多中断资源会被闲置。但是 只要使用芯片的中断都必须正确配置内核里面的中断控制器否则中断是无法工作的 ,因为不论单片机外设设计的如何天花乱坠, 外设只负责触发中断而响应中断的一定是内核

中断的触发 ,前面提到了中断源, 一个指定的中断只能由特定的、与其绑定的中断源触发,一个中断可能绑定多个中断源但是只会有一个与中断绑定的中断服务函数 ,至于什么是中断服务函数,后文会解释。那这个时候肯定会有读者问了“那单片机如何在一个中断里面区分不同的中断源呢?”,单片机对不同的中断源,都设计了中断标志位,假设有ABC三个中断源,那他们就对应了3个标志位(3比特位),没触发中断的时候,ABC的中断标志位就是默认值0,如果触发中断, 电路硬件会对其对应的标志比特位进行置位操作 ,也叫置1操作,该比特位会变成1。这个 置位行为会直接反馈到内核的中断控制器,随后内核会对中断信号进行响应

保护现场 ,看名字似乎和编程关系不大,这个名词在教科书上的中断章节会高频出现。我们无法预测中断会在什么时候到来,CPU也不能一直傻傻地等中断到来,所以不需要响应中断的时候,CPU还是照常工作的。想象现在CPU正在执行一个函数function(),倘若函数还未执行完成,中断被触发,CPU应该怎么做?是放下function函数不管不顾直接去响应,抑或是先做点什么?显而易见,后者更好更合理,需要做的,正是保护现场,函数执行到哪一步,CPU就会把执行到这一步的CPU数据(不只是我们要看的数据,还包括了程序执行的情况)存放到堆栈中,在中断响应完成之前,这些数据都会被封存,以避免响应完成后数据的丢失。

响应中断 ,这个是大部分人最关心的部分,因为这个部分直接涉及到中断服务函数的编写。在一切准备就绪后,CPU会放弃下一条需要执行的语句并直接进入中断服务函数 ,这里需要理解 “中断服务函数”它仍然是个函数 ,初学者可能会认为,C语言的函数需要调用才会被执行,这里没被调用却被执行了,那肯定不是函数。实际上看过单片机原理或者了解过计算机原理的小伙伴会告诉你,CPU内部会有一个程序指针,程序指针会按照代码编译之后的逻辑去依次指向需要被执行的函数,单片机进入中断服务函数的原理就是直接设置这个指针指向中断服务函数,之后CPU就能执行中断代码响应中断了。

恢复现场 ,对应于保护现场,CPU必须在响应中断之后回到之前被中断打断的语句那里继续执行,取出原路堆栈中的数据就完成了恢复。

掌握中断相关的知识后,我们就可以自己编写和中断相关的代码了,编写程序时,基本上只需要注意中断标志位、中断服务函数、中断控制器就可以,保护现场什么的单片机会自己完成。

在包含了必要的头文件之后,在初始化函数中加入下图的代码即可完成对中断控制器的设置:

图片

第一行和第二行的函数均是对内核里的中断控制器进行寄存器操作。

解释一下第二行的设置中断优先级,这里涉及到一个中断嵌套的概念,中断不会只有一个,并且很有可能下一个中断触发的时候,上一个中断还没有执行完,此时就需要严格设置中断优先级,在单片机中,根据内核用户手册,优先级从0开始递增, 优先级数字越低,其优先级越高高优先级中断可以直接打断低优先级中断的响应,立刻响应高优先级中断 ,形成中断嵌套,这里设置为1是因为这个回发功能不算很重要的功能,相比之下嘀嗒定时器会为单片机程序提供时基信号,其优先级应该更高。关于优先级的具体解释,可以进行网上搜索或是查看《cortex-M0+内核手册》。

关于最后一行代码,CW_UART1这个外设拥有很多个中断源,这些中断源的使用是独立的,这里只使用了接收中断这一个中断源,芯片手册的通用异步收发器章节展示了Uart中断包含的中断源。

图片

当有数据进入单片机的Uart1接收缓冲区时,接收中断会触发,中断标志位置1,程序跳转至Uart1的中断服务函数。单片机几乎所有的中断服务函数都会由一个单独的文件收录,名为interrupt_xxxx.c或者xxxx_it.c。这里贴一张简易的中断服务函数代码,其功能是在尽量不破坏单片机实时性的情况下把数据放入一个既有的数组。

图片

前文有提到,硬件会根据中断标志位决定是否进入中断服务函数,如果不在中断服务函数中清除中断标志位,单片机就会反复进入中断,导致程序死在中断里。

说一下代码的思路,len是一个变量,是缓冲区内非空数据的个数;data_rx是一个字符数组,作为接收缓冲区,缓冲区大小为200;进入中断之后首先判断缓冲区是否还有位置,也就是len是否超出缓冲区数组下标上限,超出则判定为缓冲区已满,丢掉后续所有的数据直到缓冲区有空位;变量 Rx_Flag是一个8位无符号数,作为缓冲区有数据&缓冲区满的标志位使用;对于接收的所有数据,均会判断是否是“rn”,这个字符串在编码中是换行符,只要判断到最近接收的两个字节数据是连续的0X0D和0X0A,就认定接收到换行符,本次数据接收完毕,Rx_Flag置1表示完成一次完整的数据接收。

需要注意的是, 中断的响应并非一个非常可靠的函数调用 ,一些编译器会试图优化掉代码对某些变量的修改操作(他们可能察觉不到中断函数的存在而认为变量不需要被修改),因此需要在中断中修改的变量需要加上“volatile”关键字以防止对变量的操作被编译器优化。

图片

到目前位置,数据其实已经被保存在数组data_rx里面了,但这段数据我们从外部是看不到的,也看不到是否是我们设想的功能完成的接收,所以我编写了如下函数,此函数可以在Uart1完成了一次完整的数据接收(Rx_Flag置1)后立刻回发接收的数据,并清空接收缓冲区,允许进行下一次接收。

图片

因为函数包含发送功能,所以保留了超时跳出的保险措施。这里解释一下time_ms这个变量的作用,该变量定义在嘀嗒定时器文件中,并在嘀嗒定时器中断服务函数中递增1,即每1ms该变量都会增加1,作为毫秒计数值使用,本系列教程大部分实时性较弱的功能都会依赖此功能进行定时。如有疑问可以移步《内核外设-嘀嗒定时器》章节学习。

在轮询中加入这个回发函数,最大发送容忍时间100ms,并设置间隔1000ms发送一次“success”+“换行符”。随后在串口助手中发送不超过200字节的文本数据,即可验证接收是否成功。

图片

图片

看来单片机顺利接收了数据并进行了回发操作,本节完。

总结:

1.注意理解中断的概念;

2.同一个中断可能会有多个中断源;

3.中断的执行不可靠,中断内涉及到修改的变量需要加上volatile防止优化;

4.串口的每一次发送携带很少的数据量,因此非常建议使用缓冲区来接收数据,待需要时再主动读取;

审核编辑 黄宇

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

    关注

    0

    文章

    37

    浏览量

    11096
  • CW32
    +关注

    关注

    1

    文章

    281

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用CW32 MCU来实现UART串口通信与GPIO控制

    处理函数。当串口接收到数据后,通过中断判断数据内容,并根据接收到的字符控制GPIO,点亮或熄灭LED。 这个简单的例子展示了如何通过CW32 MCU的UART串口
    发表于 12-04 08:17

    CW32单片机在智能马桶的应用

    1.温度感应与控制 智能马桶内设有温度传感,通过CW32单片机的处理,可以实时感知到用户所需的座圈温度并根据用户的设定进行调节。当温度过高或过低时,单片机将发出信号,通过控制模块对座圈的加热或制冷
    发表于 12-04 08:01

    如果CW32芯片锁死什么方法可以解锁吗?

    之前用别家芯片容易出现芯片锁死的情况,解锁一般可以用ISP,请问,如果CW32芯片锁死,什么方法可以解锁吗?
    发表于 12-04 07:50

    基于芯源CW32 MCU的LED闪烁示例及代码分析

    最近我在项目中使用了芯源的CW32 MCU,这是一款非常适合物联网和低功耗应用的微控制。在初步学习和使用中,我做了一个简单的LED闪烁实验,通过这篇帖子给大家分享一下代码及相关的配置步骤。 硬件
    发表于 12-04 06:52

    CW32的I2C是否好用?照比ST的来说?

    最初STM32F103的硬件I2C是bug的,容易出现超时等待,那么请问,CW32的I2C有没有类似于STM32F103的BUG呢?CW32的I2C是否比较稳定
    发表于 12-04 06:02

    CW32L010的学习笔记

    串口中断CW32单片机的串口好几种工作方式,异步全双工,同步半双工,单线半双工,由于没有DMA通道,为了避免频繁的进入中断,采用串口
    发表于 12-01 08:26

    cw32 systick怎么用?

    cw32 systick怎么用
    发表于 12-01 08:10

    CW32定时中断介绍

    ,否则将触发系统复位。WWDT 通常被用来监测严格时间要求的程序执行流程,防止由外部干扰或未知条件造成应用程序的执行异常, 导致发生系统故障。 01 CW32定时中断 定时
    发表于 12-01 07:08

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要安装CW
    发表于 11-12 07:52

    CW32 MCU哪些系列?

    目前CW32 MCU通用高性能MCU、安全低功耗MCU、无线射频MCU等3个系列。其中射频MCU集成了无线收发器,主要包括CW32R031
    发表于 11-12 07:34

    CW32 MCU的工作电压、工作温度是多少?

    CW32通用型MCU工作电压是1.65V~5.5V,射频MCU工作电压则是1.8V/2.2V~3.6V;通用CW32F系列MCU,比如:CW
    发表于 11-12 06:49

    CW32 MCU用什么仿真开发?

    理论上各主流IDE枚举的、支持ARM Cortex内核的所有硬件仿真,比如:J-LINK,ULINK,DAP,ST-Link等,都可以仿真、下载CW32 MCU的应用代码。如果想实现量产或者离线下载应用代码,则必须配套支持CW32
    发表于 11-12 06:01

    第二十四章 通用同步异步收发器(USART)

    本文介绍了W55MH32的通用同步异步收发器(USART),其支持全双工异步通信、NRZ格式,具分数波特率发生,可编程数据字长、停止位等。
    的头像 发表于 05-29 15:44 2068次阅读
    第二十四章 <b class='flag-5'>通用</b>同步<b class='flag-5'>异步</b><b class='flag-5'>收发器</b>(USART)

    代码+案例+生态:武汉芯源半导体CW32嵌入式开发实战正式出版

    关于 CW32 单片机的书籍。在这本书中,我们从最基础的知识讲起,详细介绍了 CW32 单片机的硬件架构、内核特性、存储系统以及各类外设功能。无论是刚刚踏入嵌入式开发领域的新手,还是经验丰富的专业人士
    发表于 03-03 15:14

    TMS320DM643 DMP通用异步收发器(UART)手册

    电子发烧友网站提供《TMS320DM643 DMP通用异步收发器(UART)手册.pdf》资料免费下载
    发表于 12-16 10:10 0次下载
    TMS320DM643 DMP<b class='flag-5'>通用</b><b class='flag-5'>异步</b><b class='flag-5'>收发器</b>(UART)手册