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

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

3天内不再提示

使用外部中断和CPU定时器将GPIO模拟成SCI接口的方法和例程

电子设计 来源:电子设计 作者:电子设计 2022-01-13 14:19 次阅读

作者: TI 北方区工程师 Young Hu 和 Jingyuan Zhao

引言:

C2000 Piccolo系列MCU芯片内部一般都集成了1-2个硬件SCI (UART) 。有时出于成本或者Layout面积的考虑,只能选择小封装或资源较少的型号,那么就会出现硬件SCI不够用的情况。这时便可使用GPIO软件模拟成SCI接口

本文给出了使用外部中断和CPU定时器将GPIO模拟成SCI接口的方法和例程。

一、测试相关环境

测试相关的软硬件环境如下表所示:

CCS Version6.2.0.00050

Compiler VersionTI v15.12.3.LTS

ControlSUITEV3.4.9

测试芯片型号TMS320F28069M

硬件环境LAUNCHXL-F28069M

GPIO引脚使用TX: GPIO33 RX: GPIO0

硬件资源使用CPU_Timer0, XINT3

您可以选择任意示例工程,这里选择的工程为timed_led_blink,它的工程文件的目录为:

C:\ti\controlSUITE\device_support\f2806x\v151\F2806x_examples_ccsv5\timed_led_blink

在CCS中import该工程后,将Example_2806xLEDBlink.c替换为本文提供的源码即可。

二、 功能描述

SCI (Serial Communications Interface, 串行通信接口) 是一种双线异步串行接口,通常也被称为UART。SCI提供了与一些常用外设的通信接口。SCI的数据帧格式,如图1所示,通常由以下部分组成:

1 bit 起始位:一位逻辑0,表示传输开始。

1-8 bit 数据位:小端传输,先传输低位再传输高位。

1 bit奇偶校验位(可选):加上这一位后使数据位1的个数为奇数或者偶数。

1或2 bit停止位:一位或两位逻辑1,表示传输结束。

图1 SCI数据帧格式

1. 发送程序框图和发送状态机

发送使能后,CPU定时器打开,每隔8.67us(115200 bps)产生一次中断,在定时器中断发生时改变引脚的输出电平实现数据发送。第一个定时器中断时,发送引脚电平置低,标志数据发送开始。之后以小端模式从低位到高位依次发送数据位、校验位。采用奇校验时,数据按位异或的结果和校验位的异或结果应为1;采用偶校验时,数据按位异或的结果和校验位的异或结果应为0。传输结束后,发送引脚输出一位高电平,标志发送结束。

2. 接收程序框图和接收状态机

接收使能后,开启外部中断。SCI接收引脚在空闲状态下处于高电平,接收数据的起始位为低电平。由于数据到来时间的不确定,故采用外部中断下降沿触发的方式检测数据传输的起始位。外部中断检测到下降沿后,标志数据传输开始。此时先延时4us,等待信号电平稳定,然后关闭外部中断,打开定时器。与发送相同,定时器每8.67us产生一次中断。每次中断产生时,对接收引脚的电平进行采样,依次接收数据位、校验位和停止位。当所有数据接收完成后,关闭定时器,等待接收下次使能。

3. 功能描述

波特率: 115200 bps (可调), 停止位:1 bit,数据位:1-8 bit,校验位:无校验、奇校验或偶校验。可根据实际需求在宏定义中修改recvBuffLen确定接收缓冲区大小:

#define recvBuffLen 800

以接收缓冲区大小为800 Bytes为例,每当程序从GPIO0接收满800 Bytes数据后,就会把全部接收到的数据通过GPIO32发出。

三、API

1. 宏定义

#define parity 1 // 0: no parity, 1: odd, 2: even

#define dataLength 8 // data bit length 1 - 8

#define recvBuffLen 25 // receive buffer size

parity:校验位。可设置为0:无校验,1:奇校验,2:偶校验。

dataLength:数据位长度,可配置为1-8比特。

recvBuffLen:接收缓冲区大小,通常可设置为数据包长度。

2. 全局变量

// software sci mode

// 0: rx 1: tx

Uint16 swSciMode = 0;

// rx data & state

Uint16 rxData = 0;

Uint16 rxState = 0;

Uint16 rxError = 0;

// tx data & state

Uint16 txData = 0;

Uint16 txState = 0;

swSciMode:定义软件串口模式。为节省硬件资源,采用半双工模式。0为接收模式,1为发送模式。

rxData:从GPIO接收到的单字节数据。

rxState:接收程序状态机状态,0-3为有效状态,详见图3。

rxError:接收错误指示标志,在调用接收相关API后值会相应改变,需手动清零。具体定义如下:

0x000x010x020x03

接收正常校验错误未检测到停止位停止位+校验位错误

txData:从GPIO发送到的单字节数据。

txState:发送程序状态机状态,0-5为有效状态,详见图2。

3. 函数

// Software SCI related functions

Uint16 sw_sci_recv_byte(void);

void sw_sci_recv_bytes(Uint16* dataBuff, Uint16 len);

void sw_sci_send_byte(Uint16 data);

void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len);

void sw_sci_send_string(char* txString);

函数名称功能描述

Uint16 sw_sci_recv_byte(void)返回GPIO0接收到的单字节数据。

void sw_sci_recv_bytes(Uint16*dataBuff, Uint16 len)从GPIO0接收len个字节数据存入缓冲区dataBuff中。

void sw_sci_send_byte(Uint16 data);使用GPIO33发送单字节数据。

void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len)使用GPIO33发送dataBuff中len个连续字节数据。

void sw_sci_send_string(char* txString);使用GPIO33发送字符串txString。txString必须以\0结尾,方便用户调试使用。

四、测试

1. 波特率及CPU负载测试

为测试软件SCI的性能,本例程额外使用了GPIO32作为测试引脚用于指示程序状态。当程序进入软件SCI定时器中断时,GPIO32输出高电平;其余时间GPIO32输出低电平。图4为8位数据位、1位奇校验、1位停止位、115200波特率下,发送0x55时TX引脚(蓝线)和测试引脚(黄线)的波形。从图中可以看出,实际发送波特率为116280bps,误差0.9%。测试引脚的高电平持续时间和,即为软件SCI发送单字节数据占用CPU的时间。经过测量,测试引脚高电平共持续10.32us,单字节理论发送时间为95.49us,故发送时CPU负载为10.8%。

图4软件串口例程发送测试

图5为8位数据位、1位奇校验、1位停止位、115200波特率下,接收0x55时RX引脚(蓝线)和测试引脚(黄线)的波形。经过测量,测试引脚高电平共持续7.2us,单字节理论接收时间为95.49us,故接收时CPU负载为7.5%。

图5软件串口例程接收测试

在没有示波器的情况下也可使用C2000 MCU内部的eCAP测量实际发送波特率和CPU负载。

2. 数据收发测试

软件串口例程配置为115200波特率、8bit数据位、1停止位、奇校验,PC端串口助手采用相同配置时,数据可以正常收发:

将串口助手软件改为偶校验,例程提示校验位错误:

软件串口例程配置为无校验位,串口助手采用奇校验时,例程实际在接收结束位时接收到的是校验位,此时例程提示结束位错误:

例程和串口助手采用相同配置时,以5Hz频率发送800 Bytes数据包,收发正常:

五、注意事项

1. 改变通信波特率可通过调整CPU定时器的分频系数实现。

理论分频系数 =

以LAUNCHXL-F28069M 为例,LAUNCHXL-F28069M主频为90 MHz。理论分频系数应为:

实际使用时由于系统时钟会有误差,推荐使用示波器测量实际输出波特率对分频系数进行调整。

2. TX引脚可根据需求更改至任意引脚。RX引脚需要通过外部中断下降沿判断数据起始位,所以只能在GPIO0-GPIO31中进行选择。

3. 为节省硬件资源,接收和发送程序使用同一CPU定时器,所以仅能进行半双工通信。若想实现全双工通信可再多使用一个定时器将发送和接收分开。

六、待办事项

1. 增加使用eCAP测量波特率和CPU负载功能。

2. 增加波特率自动校正功能。

审核编辑:何安

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

    关注

    0

    文章

    341

    浏览量

    9990
收藏 人收藏

    评论

    相关推荐

    高级定时器PWM输入模式的配置方法

    我们向大家介绍高级定时器的另一个常见应用——PWM输入模式。在本节课中,我们先围绕输入捕获模式展开,并重点描述PWM输入模式和涉及的寄存,最后通过一个实验
    的头像 发表于 11-08 16:48 273次阅读
    高级<b class='flag-5'>定时器</b>PWM输入模式的配置<b class='flag-5'>方法</b>

    定时器的工作方式介绍

    或实现周期性事件的硬件模块。它可以用于实现各种定时任务,如定时中断、PWM(脉冲宽度调制)输出、频率测量等。定时器通常由一个计数、一个时钟源和一个控制寄存
    的头像 发表于 07-12 10:29 643次阅读

    ESP32 light sleep模式下定时呼醒和外部中断呼醒不能同时使用怎么解决?

    高电平,中断输出时为低电平,然后ESP32配置为GPIO17低电平呼醒,此时定时呼醒和外部中断呼醒可以同时正常使用; 如果G-sensor
    发表于 06-19 08:30

    使用定时器的编码接口模式,打开定时器的溢出中断,当定时器上溢出和下溢出是,是否都会产生溢出中断

    使用定时器的编码接口模式,打开定时器的溢出中断,当定时器上溢出和下溢出是,是否都会产生溢出
    发表于 05-24 07:41

    用STM32F103打开了定时器2开定时器中断,关闭就报错 ,定时器如何关闭呢?

    最近用STM32F103打开了定时器2 开定时器中断,开启PA11的中断,在PA11的中断里把定时器
    发表于 05-14 06:52

    stm32定时器的如何外部启动?

    我想利用stm32定时器精确定时一个信号从发生到结束的时间,想让定时器通过外部触发开启,一般有什么方法
    发表于 05-10 06:40

    STM32的GPIO引脚能同时用作外部中断定时器输入捕获吗?

    今天突然在项目中想到一种用法,GPIO的某一个引脚,同时配置外部中断(在中断中做一些逻辑)和复用为定时
    发表于 05-09 08:22

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器
    的头像 发表于 04-29 11:00 563次阅读

    s7200定时器的五种故障介绍

    定时器CPU故障:如果定时器本身或PLC的CPU出现故障,也可能导致定时器无法复位。此时,需要检查定时
    的头像 发表于 04-03 17:08 2084次阅读

    使用STM32F407定时器中断周期不准怎么解决?

    排除了程序置GPIO所用的时间导致的,实在查不出那儿的问题,望大神们指教一下: 如果配置125us,实测126us,总是达不到理论的周期。定时器的配置
    发表于 03-15 07:28

    国产嵌入式教学实验箱操作教程:2-13 定时器控制实验

    一、实验目的 熟悉定时器的基本结构,学习定时器的功能和控制方法,并实现基于定时器中断方式控制程序。 二、实验原理
    发表于 02-21 14:09

    单片机外部中断定时器中断的区别和用法

    单片机外部中断定时器中断在触发来源、应用场景以及功能特点上存在明显差异** **。
    的头像 发表于 01-28 17:35 2777次阅读

    555定时器的基本功能 555定时器的工作原理及其应用

    定时器有三种基本工作模式,分别是单稳态、自由运放和双稳态。它可以在多种电子电路中实现功能的实现。下面详细介绍它们的功能特点。 单稳态模式:在单稳态模式下,555定时器可以实现一个稳态触发
    的头像 发表于 01-18 11:12 1.3w次阅读

    定时器会阻塞线程吗 定时器指令有哪几种

    定时器会阻塞线程吗 定时器指令有哪几种  定时器一般不会阻塞线程,但具体是否会阻塞取决于所使用的定时器实现方式和使用方式。 定时器指令可以分
    的头像 发表于 12-19 14:03 865次阅读

    STM32定时器时间计算方法

    详细介绍STM32的定时器时间计算方法。 STM32定时器基本结构 STM32的定时器通常包含一个计数,一个预分频
    的头像 发表于 12-19 11:31 1.1w次阅读