RISC-V MCU中文社区

【分享】 E203串口中断使用总结

发表于 开源蜂鸟E203 2023-05-30 14:42:44
0
1566
1

报名编号:CICC2969

团队名称:火锅队

学校名称:广东工业大学

一、串口中断参数设置

与STM32的串口中断不同,E203的串口中断标志位是自动清零的,也就是说,只要进入了串口中断服务函数并且执行完串口中断服务函数中的代码,E203的串口中断标志位就会被清零,接着E203就能接受下一条串口中断请求。下面将介绍E203的串口中断的过程。

首先来看下面这段代码:

函数“my_uart_init( )”为笔者自己写的函数,函数中包含了需要设置串口中断参数的所有函数。在Nuclei Studio IDE中查看函数定义即可知道这些函数的参数有哪些。在这里,只解释其中两条函数的含义。

函数"uart_set_rx_th( )"为设置rx中断中断阈值。”中断阈值“指的是外面输入多少个字符后才引起中断。在STM32中,存在一个队列,可以获取中断产生前存下的字符数,但在E203的软件代码当中,笔者并没有看到能获取 rx 字符队列的函数或者寄存器,只有一个8位的获取最后输入字符的寄存器,因此笔者认为E203不存在 rx 的 FIFO,而E203的中断阈值的功能仅仅是实现了间隔多少个字符才获取一个字符的功能。这就意味着,如果想要获取字符串,就必须自己写通信协议。

函数“PLIC_Register_IRQ()”作用是确定中断优先级,并且让计算机找到中断服务函数的函数名。与 Keil 不同,STM32的中断服务函数名是不能更改的,而Nuclei Studio IDE中设计的E203的中断服务函数名是可以自定义的。在上面这段代码中,笔者定义的 UART0 的中断服务函数名是“plic_uart0_handler()”。

在完成以上函数的设置后,就可以在中断服务函数中写下自己需要的中断处理功能,并且在 main() 函数中写下“my_uart_init()”,就能实现串口中断。

二、串口接收字符串

首先需要注意的是,由于E203的时钟频率很低,并且不能实现中断嵌套,因此为了能即使处理中断,笔者建议在串口中断函数中只实现信息的获取,至于通信协议的实现,就放到 main() 中的“while()”循环当中。

首先看下以下代码:

代码中使用函数“uart_read()”来读取 rx 中的内容。该函数只能读取一条 "uint8_t" 类型的数据。在该程序中,笔者将数据包设定为10个单精度浮点数的长度,即40个 uint8 类型数据,因此这里的变量 s_len=40。代码 155-156 行作用是:当全局数组 temp_s 获取了 s_len 个 uint8 字符后,就通知 main() 开始重组数据。在这里,笔者假设通信不会丢包或者数据出错,因此不设置通信协议,只规定了数据包的大小。main() 中的代码如下图:

当上位机用串口传数据时,会先从低位开始一个一个字符地传,因此在接受数据后,必须把数据给倒过来重新组合下。例如,上位机想要传输的单精度浮点数的十六进制代码为 0x AF 3B 4D 5C,则E203接收到的数据是 0x 5C 4D 3B AF。代码 101-117 行就是将接收到的数据倒序排放。在代码所在的工程中,笔者设定为上位机直接传输单精度浮点数的 IEEE 754 格式的原二进制数据,而不是将浮点数转换成字符输出,因此在上面的代码中,笔者使用移位实现串口接收数据的重组。

以上就是本帖的内容!

喜欢1
用户评论
Lalaland

Lalaland 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板