0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用外部中斷和CPU定時(shí)器將GPIO模擬成SCI接口的方法和例程

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-01-13 14:19 ? 次閱讀

作者: TI 北方區(qū)工程師 Young Hu 和 Jingyuan Zhao

引言:

C2000 Piccolo系列MCU芯片內(nèi)部一般都集成了1-2個(gè)硬件SCI (UART) 。有時(shí)出于成本或者Layout面積的考慮,只能選擇小封裝或資源較少的型號(hào),那么就會(huì)出現(xiàn)硬件SCI不夠用的情況。這時(shí)便可使用GPIO軟件模擬成SCI接口

本文給出了使用外部中斷和CPU定時(shí)器將GPIO模擬成SCI接口的方法和例程。

一、測(cè)試相關(guān)環(huán)境

測(cè)試相關(guān)的軟硬件環(huán)境如下表所示:

CCS Version6.2.0.00050

Compiler VersionTI v15.12.3.LTS

ControlSUITEV3.4.9

測(cè)試芯片型號(hào)TMS320F28069M

硬件環(huán)境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提供了與一些常用外設(shè)的通信接口。SCI的數(shù)據(jù)幀格式,如圖1所示,通常由以下部分組成:

1 bit 起始位:一位邏輯0,表示傳輸開始。

1-8 bit 數(shù)據(jù)位:小端傳輸,先傳輸?shù)臀辉賯鬏敻呶弧?/p>

1 bit奇偶校驗(yàn)位(可選):加上這一位后使數(shù)據(jù)位1的個(gè)數(shù)為奇數(shù)或者偶數(shù)。

1或2 bit停止位:一位或兩位邏輯1,表示傳輸結(jié)束。

圖1 SCI數(shù)據(jù)幀格式

1. 發(fā)送程序框圖和發(fā)送狀態(tài)機(jī)

發(fā)送使能后,CPU定時(shí)器打開,每隔8.67us(115200 bps)產(chǎn)生一次中斷,在定時(shí)器中斷發(fā)生時(shí)改變引腳的輸出電平實(shí)現(xiàn)數(shù)據(jù)發(fā)送。第一個(gè)定時(shí)器中斷時(shí),發(fā)送引腳電平置低,標(biāo)志數(shù)據(jù)發(fā)送開始。之后以小端模式從低位到高位依次發(fā)送數(shù)據(jù)位、校驗(yàn)位。采用奇校驗(yàn)時(shí),數(shù)據(jù)按位異或的結(jié)果和校驗(yàn)位的異或結(jié)果應(yīng)為1;采用偶校驗(yàn)時(shí),數(shù)據(jù)按位異或的結(jié)果和校驗(yàn)位的異或結(jié)果應(yīng)為0。傳輸結(jié)束后,發(fā)送引腳輸出一位高電平,標(biāo)志發(fā)送結(jié)束。

2. 接收程序框圖和接收狀態(tài)機(jī)

接收使能后,開啟外部中斷。SCI接收引腳在空閑狀態(tài)下處于高電平,接收數(shù)據(jù)的起始位為低電平。由于數(shù)據(jù)到來時(shí)間的不確定,故采用外部中斷下降沿觸發(fā)的方式檢測(cè)數(shù)據(jù)傳輸?shù)钠鹗嘉?。外部中斷檢測(cè)到下降沿后,標(biāo)志數(shù)據(jù)傳輸開始。此時(shí)先延時(shí)4us,等待信號(hào)電平穩(wěn)定,然后關(guān)閉外部中斷,打開定時(shí)器。與發(fā)送相同,定時(shí)器每8.67us產(chǎn)生一次中斷。每次中斷產(chǎn)生時(shí),對(duì)接收引腳的電平進(jìn)行采樣,依次接收數(shù)據(jù)位、校驗(yàn)位和停止位。當(dāng)所有數(shù)據(jù)接收完成后,關(guān)閉定時(shí)器,等待接收下次使能。

3. 功能描述

波特率: 115200 bps (可調(diào)), 停止位:1 bit,數(shù)據(jù)位:1-8 bit,校驗(yàn)位:無校驗(yàn)、奇校驗(yàn)或偶校驗(yàn)??筛鶕?jù)實(shí)際需求在宏定義中修改recvBuffLen確定接收緩沖區(qū)大小:

#define recvBuffLen 800

以接收緩沖區(qū)大小為800 Bytes為例,每當(dāng)程序從GPIO0接收滿800 Bytes數(shù)據(jù)后,就會(huì)把全部接收到的數(shù)據(jù)通過GPIO32發(fā)出。

三、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:校驗(yàn)位??稍O(shè)置為0:無校驗(yàn),1:奇校驗(yàn),2:偶校驗(yàn)。

dataLength:數(shù)據(jù)位長(zhǎng)度,可配置為1-8比特。

recvBuffLen:接收緩沖區(qū)大小,通??稍O(shè)置為數(shù)據(jù)包長(zhǎng)度。

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:定義軟件串口模式。為節(jié)省硬件資源,采用半雙工模式。0為接收模式,1為發(fā)送模式。

rxData:從GPIO接收到的單字節(jié)數(shù)據(jù)。

rxState:接收程序狀態(tài)機(jī)狀態(tài),0-3為有效狀態(tài),詳見圖3。

rxError:接收錯(cuò)誤指示標(biāo)志,在調(diào)用接收相關(guān)API后值會(huì)相應(yīng)改變,需手動(dòng)清零。具體定義如下:

0x000x010x020x03

接收正常校驗(yàn)錯(cuò)誤未檢測(cè)到停止位停止位+校驗(yàn)位錯(cuò)誤

txData:從GPIO發(fā)送到的單字節(jié)數(shù)據(jù)。

txState:發(fā)送程序狀態(tài)機(jī)狀態(tài),0-5為有效狀態(tài),詳見圖2。

3. 函數(shù)

// 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);

函數(shù)名稱功能描述

Uint16 sw_sci_recv_byte(void)返回GPIO0接收到的單字節(jié)數(shù)據(jù)。

void sw_sci_recv_bytes(Uint16*dataBuff, Uint16 len)從GPIO0接收len個(gè)字節(jié)數(shù)據(jù)存入緩沖區(qū)dataBuff中。

void sw_sci_send_byte(Uint16 data);使用GPIO33發(fā)送單字節(jié)數(shù)據(jù)。

void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len)使用GPIO33發(fā)送dataBuff中l(wèi)en個(gè)連續(xù)字節(jié)數(shù)據(jù)。

void sw_sci_send_string(char* txString);使用GPIO33發(fā)送字符串txString。txString必須以\0結(jié)尾,方便用戶調(diào)試使用。

四、測(cè)試

1. 波特率及CPU負(fù)載測(cè)試

為測(cè)試軟件SCI的性能,本例程額外使用了GPIO32作為測(cè)試引腳用于指示程序狀態(tài)。當(dāng)程序進(jìn)入軟件SCI定時(shí)器中斷時(shí),GPIO32輸出高電平;其余時(shí)間GPIO32輸出低電平。圖4為8位數(shù)據(jù)位、1位奇校驗(yàn)、1位停止位、115200波特率下,發(fā)送0x55時(shí)TX引腳(藍(lán)線)和測(cè)試引腳(黃線)的波形。從圖中可以看出,實(shí)際發(fā)送波特率為116280bps,誤差0.9%。測(cè)試引腳的高電平持續(xù)時(shí)間和,即為軟件SCI發(fā)送單字節(jié)數(shù)據(jù)占用CPU的時(shí)間。經(jīng)過測(cè)量,測(cè)試引腳高電平共持續(xù)10.32us,單字節(jié)理論發(fā)送時(shí)間為95.49us,故發(fā)送時(shí)CPU負(fù)載為10.8%。

圖4軟件串口例程發(fā)送測(cè)試

圖5為8位數(shù)據(jù)位、1位奇校驗(yàn)、1位停止位、115200波特率下,接收0x55時(shí)RX引腳(藍(lán)線)和測(cè)試引腳(黃線)的波形。經(jīng)過測(cè)量,測(cè)試引腳高電平共持續(xù)7.2us,單字節(jié)理論接收時(shí)間為95.49us,故接收時(shí)CPU負(fù)載為7.5%。

圖5軟件串口例程接收測(cè)試

在沒有示波器的情況下也可使用C2000 MCU內(nèi)部的eCAP測(cè)量實(shí)際發(fā)送波特率和CPU負(fù)載。

2. 數(shù)據(jù)收發(fā)測(cè)試

軟件串口例程配置為115200波特率、8bit數(shù)據(jù)位、1停止位、奇校驗(yàn),PC端串口助手采用相同配置時(shí),數(shù)據(jù)可以正常收發(fā):

將串口助手軟件改為偶校驗(yàn),例程提示校驗(yàn)位錯(cuò)誤:

軟件串口例程配置為無校驗(yàn)位,串口助手采用奇校驗(yàn)時(shí),例程實(shí)際在接收結(jié)束位時(shí)接收到的是校驗(yàn)位,此時(shí)例程提示結(jié)束位錯(cuò)誤:

例程和串口助手采用相同配置時(shí),以5Hz頻率發(fā)送800 Bytes數(shù)據(jù)包,收發(fā)正常:

五、注意事項(xiàng)

1. 改變通信波特率可通過調(diào)整CPU定時(shí)器的分頻系數(shù)實(shí)現(xiàn)。

理論分頻系數(shù) =

以LAUNCHXL-F28069M 為例,LAUNCHXL-F28069M主頻為90 MHz。理論分頻系數(shù)應(yīng)為:

實(shí)際使用時(shí)由于系統(tǒng)時(shí)鐘會(huì)有誤差,推薦使用示波器測(cè)量實(shí)際輸出波特率對(duì)分頻系數(shù)進(jìn)行調(diào)整。

2. TX引腳可根據(jù)需求更改至任意引腳。RX引腳需要通過外部中斷下降沿判斷數(shù)據(jù)起始位,所以只能在GPIO0-GPIO31中進(jìn)行選擇。

3. 為節(jié)省硬件資源,接收和發(fā)送程序使用同一CPU定時(shí)器,所以僅能進(jìn)行半雙工通信。若想實(shí)現(xiàn)全雙工通信可再多使用一個(gè)定時(shí)器將發(fā)送和接收分開。

六、待辦事項(xiàng)

1. 增加使用eCAP測(cè)量波特率和CPU負(fù)載功能。

2. 增加波特率自動(dòng)校正功能。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式處理
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    9989
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ESP32 light sleep模式下定時(shí)呼醒和外部中斷呼醒不能同時(shí)使用怎么解決?

    高電平,中斷輸出時(shí)為低電平,然后ESP32配置為GPIO17低電平呼醒,此時(shí)定時(shí)呼醒和外部中斷呼醒可以同時(shí)正常使用; 如果G-sensor
    發(fā)表于 06-19 08:30

    使用定時(shí)器的編碼接口模式,打開定時(shí)器的溢出中斷,當(dāng)定時(shí)器上溢出和下溢出是,是否都會(huì)產(chǎn)生溢出中斷?

    使用定時(shí)器的編碼接口模式,打開定時(shí)器的溢出中斷,當(dāng)定時(shí)器上溢出和下溢出是,是否都會(huì)產(chǎn)生溢出
    發(fā)表于 05-24 07:41

    用STM32F103打開了定時(shí)器2開定時(shí)器中斷,關(guān)閉就報(bào)錯(cuò) ,定時(shí)器如何關(guān)閉呢?

    最近用STM32F103打開了定時(shí)器2 開定時(shí)器中斷,開啟PA11的中斷,在PA11的中斷里把定時(shí)器
    發(fā)表于 05-14 06:52

    stm32定時(shí)器的如何外部啟動(dòng)?

    我想利用stm32定時(shí)器精確定時(shí)一個(gè)信號(hào)從發(fā)生到結(jié)束的時(shí)間,想讓定時(shí)器通過外部觸發(fā)開啟,一般有什么方法
    發(fā)表于 05-10 06:40

    STM32的GPIO引腳能同時(shí)用作外部中斷定時(shí)器輸入捕獲嗎?

    今天突然在項(xiàng)目中想到一種用法,GPIO的某一個(gè)引腳,同時(shí)配置外部中斷(在中斷中做一些邏輯)和復(fù)用為定時(shí)
    發(fā)表于 05-09 08:22

    如何實(shí)現(xiàn)一個(gè)軟件定時(shí)器?

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時(shí)器,原理大同小異。典型的實(shí)現(xiàn)方法是:通過一個(gè)硬件定時(shí)器產(chǎn)生固定的時(shí)鐘節(jié)拍,每次硬件定時(shí)器
    的頭像 發(fā)表于 04-29 11:00 ?559次閱讀

    s7200定時(shí)器的五種故障介紹

    定時(shí)器CPU故障:如果定時(shí)器本身或PLC的CPU出現(xiàn)故障,也可能導(dǎo)致定時(shí)器無法復(fù)位。此時(shí),需要檢查定時(shí)
    的頭像 發(fā)表于 04-03 17:08 ?2070次閱讀

    使用STM32F407定時(shí)器中斷周期不準(zhǔn)怎么解決?

    排除了程序置GPIO所用的時(shí)間導(dǎo)致的,實(shí)在查不出那兒的問題,望大神們指教一下: 如果配置125us,實(shí)測(cè)126us,總是達(dá)不到理論的周期。定時(shí)器的配置
    發(fā)表于 03-15 07:28

    國(guó)產(chǎn)嵌入式教學(xué)實(shí)驗(yàn)箱操作教程:2-13 定時(shí)器控制實(shí)驗(yàn)

    一、實(shí)驗(yàn)?zāi)康?熟悉定時(shí)器的基本結(jié)構(gòu),學(xué)習(xí)定時(shí)器的功能和控制方法,并實(shí)現(xiàn)基于定時(shí)器中斷方式控制程序。 二、實(shí)驗(yàn)原理
    發(fā)表于 02-21 14:09

    單片機(jī)外部中斷定時(shí)器中斷的區(qū)別和用法

    單片機(jī)外部中斷定時(shí)器中斷在觸發(fā)來源、應(yīng)用場(chǎng)景以及功能特點(diǎn)上存在明顯差異** **。
    的頭像 發(fā)表于 01-28 17:35 ?2758次閱讀

    555定時(shí)器的基本功能 555定時(shí)器的工作原理及其應(yīng)用

    定時(shí)器有三種基本工作模式,分別是單穩(wěn)態(tài)、自由運(yùn)放和雙穩(wěn)態(tài)。它可以在多種電子電路中實(shí)現(xiàn)功能的實(shí)現(xiàn)。下面詳細(xì)介紹它們的功能特點(diǎn)。 單穩(wěn)態(tài)模式:在單穩(wěn)態(tài)模式下,555定時(shí)器可以實(shí)現(xiàn)一個(gè)穩(wěn)態(tài)觸發(fā)
    的頭像 發(fā)表于 01-18 11:12 ?1.3w次閱讀

    定時(shí)器會(huì)阻塞線程嗎 定時(shí)器指令有哪幾種

    定時(shí)器會(huì)阻塞線程嗎 定時(shí)器指令有哪幾種? 定時(shí)器一般不會(huì)阻塞線程,但具體是否會(huì)阻塞取決于所使用的定時(shí)器實(shí)現(xiàn)方式和使用方式。 定時(shí)器指令可以分
    的頭像 發(fā)表于 12-19 14:03 ?862次閱讀

    STM32定時(shí)器時(shí)間計(jì)算方法

    詳細(xì)介紹STM32的定時(shí)器時(shí)間計(jì)算方法。 STM32定時(shí)器基本結(jié)構(gòu) STM32的定時(shí)器通常包含一個(gè)計(jì)數(shù),一個(gè)預(yù)分頻
    的頭像 發(fā)表于 12-19 11:31 ?1.1w次閱讀

    定時(shí)器設(shè)計(jì)實(shí)現(xiàn)

    (mTimerTickThread、mTimerCallbackThread)分別用于時(shí)間處理和函數(shù)回調(diào)。 可以使用TimerManager的create方法創(chuàng)建多個(gè)定時(shí)器,每次創(chuàng)建的定時(shí)器ID會(huì)累加,并
    的頭像 發(fā)表于 11-08 16:50 ?556次閱讀

    TMS320F28335學(xué)習(xí)之中斷定時(shí)器的相關(guān)內(nèi)容

    本次總結(jié)為中斷定時(shí)器的相關(guān)內(nèi)容。除了基本的寄存配置,初始化,中斷主要是掌握三級(jí)中斷制,定時(shí)器
    的頭像 發(fā)表于 11-08 10:17 ?2485次閱讀
    TMS320F28335學(xué)習(xí)之<b class='flag-5'>中斷</b>和<b class='flag-5'>定時(shí)器</b>的相關(guān)內(nèi)容