国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    瀏覽量

    10515
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    CW32定時器及其中斷介紹

    可以由硬件自 動執行觸發信號的濾波操作,還能令觸發事件產生中斷和 DMA 請求。 低功耗定時器:CW32L083 內部集成 1 個 16 位低功耗定時器(LPTIM),可以以很低的功耗實現
    發表于 01-14 06:42

    【乾芯QXS320F開發板試用】定時器中斷

    學會操作GPIO后,開啟定時器來精確控制LED voidtimer_init(uint16_t ms); intmain(void) { Device_init
    發表于 12-09 16:56

    CW32L0開發板學習記錄四,高級定時器ATIM學習

    ,配置完成后,記得使能定時器,這時候定時器開始工作 就計算方法定時器的主頻為 8Mhz。8000000 /80 =100000100000/10000 =10次,也就是說 每秒進入
    發表于 12-01 07:35

    CW32定時器中斷介紹

    可以由硬件自 動執行觸發信號的濾波操作,還能令觸發事件產生中斷和 DMA 請求。 低功耗定時器:CW32L083 內部集成 1 個 16 位低功耗定時器(LPTIM),可以以很低的功耗實現
    發表于 12-01 07:08

    單片機定時器中斷

    分頻后送來;另一個是T0或T1引腳輸入的外部脈沖源。如果定時器/計數工作在定時模式,則表示時間已到;如果工作在計數模式,則表示計數值已經滿了。
    發表于 11-24 06:22

    PWM、定時器、SysTick 區別及應用場景

    。下面我們來梳理清楚。一、基本概念定時器(Timer)MCU內最基礎的計數外設,通過計數時鐘周期實現定時、計數功能。多數MCU內部有多個通用定時器,可配置為定時中斷
    的頭像 發表于 11-17 10:53 ?524次閱讀
    PWM、<b class='flag-5'>定時器</b>、SysTick 區別及應用場景

    cs32a010定時器的問題

    按照例程寫了定時器的初始化,還是無法進入中斷 比較奇怪我使用定時器為什么要用輸入捕獲? 還有周期是否該設為x-1?
    發表于 11-06 10:49

    SysTick系統滴答定時器簡介

    SysTick—系統定時器是屬于CM33內核中的一個外設,內嵌在NVIC中。系統定時器是一個24bit的向下遞減的計數,計數每計數一次的時間為 1/SYSCLK,一般我們設置系統時
    的頭像 發表于 09-23 09:50 ?1628次閱讀
    SysTick系統滴答<b class='flag-5'>定時器</b>簡介

    何時使用 GPIO 中斷外部中斷

    何時使用 GPIO 中斷外部中斷
    發表于 08-26 07:27

    【中科昊芯Core_DSC280025C開發板試用體驗】---定時器中斷方式的LED流水燈

    不算什么,但對于初學者來說卻不是那么簡單的事了,筆者經過一番研究終于用定時器中斷點亮流水燈了。 官方文件中 代碼GPIO_setPinConfig(GPIO_5_GPIO5);是配置
    發表于 08-07 22:14

    [經驗] 【中科昊芯Core_DSC280025C開發板試用體驗】---模擬SPI及定時器的應用

    ,可以用模擬SPI驅動74HC595,會定時器的最簡單應用,能驅動8位數碼管。筆者參考廠家的例程,學習了定時器的用法,并參考STM32單片機的資料,編寫了
    發表于 08-07 11:07

    【中科昊芯Core_DSC280025C開發板試用體驗】+SCI測試與代碼解讀

    ; stopCaptures=0; } } return 0; } 大多數嵌入式初始化過程類似,都是先完成系統時鐘、中斷配置以及GPIO初始化;打開配置SCI初始化函scia_config(9600
    發表于 07-17 10:42

    第十二章 SysTick——系統定時器

    本章介紹了W55MH32的SysTick系統定時器,它是24位遞減計數,含4個寄存,可配置定時中斷,用于產生時基 等。
    的頭像 發表于 05-22 17:16 ?1084次閱讀
    第十二章 SysTick——系統<b class='flag-5'>定時器</b>

    MCU定時器/計數

    RISC-V核低功耗MCU通過靈活的定時器架構、低功耗模式適配及硬件級中斷優化,在工業控制、智能家居等場景中實現高精度計時與能耗控制的協同設計,滿足復雜任務調度與實時響應的雙重需求?。 一、?硬件
    的頭像 發表于 04-27 13:54 ?778次閱讀

    基于小凌派RK2206開發板:OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實驗簡介本實驗演示如何在小凌派-RK2206開發板上使用IOT庫的GPIO中斷模式,進行GPIO編程開發。例程
    的頭像 發表于 04-21 10:39 ?1107次閱讀
    基于小凌派RK2206開發板:OpenHarmony如何使用IoT<b class='flag-5'>接口</b>控制<b class='flag-5'>GPIO</b><b class='flag-5'>中斷</b>