【TI C2000】F28002x的系統延時、GPIO配置及SCI(UART)串口發送、接收
文章目錄
- 系統延時
- GPIO配置
- GPIO輸出
- SCI配置
- SCI發送、接收
- 測試
- 附錄:F28002x開發板上手、環境配置、燒錄及TMS320F280025C模板工程建立
- F28002x敘述
- 燒錄
- SDK庫文件說明
- 工程建立
- 更方便的路徑導入
- 調試
系統延時
在device.h中 有系統延時函數
該函數為微妙級延時:
#define DEVICE_DELAY_US(x) SysCtl_delay(((((long double)(x)) / (1000000.0L / \(long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L)
所以可以包裝一層毫秒延時:
void delay_ms(uint32_t ms)
{while(ms--){DEVICE_DELAY_US(1000);}
}
GPIO配置
C2000的GPIO庫與常見的不同
取消了Pinmux設定 取而代之的是Pin Config
在使用GPIO時 需要用GPIO_setPinConfig
函數進行設置
傳參位于pin_map.h 該頭文件只在配置函數中有效
如:
#define GPIO_31_GPIO31 0x00081E00U
#define GPIO_31_CANA_TX 0x00081E01U
#define GPIO_31_SPIB_SOMI 0x00081E03U
#define GPIO_31_OUTPUTXBAR8 0x00081E05U
#define GPIO_31_EQEP1_INDEX 0x00081E06U
#define GPIO_31_FSIRXA_D1 0x00081E09U
#define GPIO_31_EPWM1_B 0x00081E0BU
#define GPIO_31_HIC_D10 0x00081E0EU
其實就是取代了Pinmux功能
另外還要使用以下函數對其進行方向、功能、時鐘配置
GPIO_setDirectionMode
GPIO_setPadConfig
GPIO_setQualificationMode
第一個傳參為GPIO序號 第二個為選擇的功能
如果是復用功能的話 上面這兩種傳參都會在device.h中被定義好
如:
//
// SCI for USB-to-UART adapter on FTDI chip
//
#define DEVICE_GPIO_PIN_SCIRXDA 28U // GPIO number for SCI RX
#define DEVICE_GPIO_PIN_SCITXDA 29U // GPIO number for SCI TX
#define DEVICE_GPIO_CFG_SCIRXDA GPIO_28_SCIA_RX // "pinConfig" for SCI RX
#define DEVICE_GPIO_CFG_SCITXDA GPIO_29_SCIA_TX // "pinConfig" for SCI TX
另外 設置模擬模式則使用GPIO_setAnalogMode
設置采樣周期則使用GPIO_setQualificationPeriod
設置中斷則使用GPIO_setInterruptPin
后三個函數根據需求設置 前面四個函數配置為基本配置
方向配置就是輸入/輸出(如果配復用模式 如UART的TX功能 那么也要配置這個為輸出)
typedef enum
{GPIO_DIR_MODE_IN, //!< Pin is a GPIO inputGPIO_DIR_MODE_OUT //!< Pin is a GPIO output
} GPIO_Direction;
對于功能配置(推挽、開漏、上拉等等) 有以下:
#ifndef DOXYGEN_PDF_IGNORE
//*****************************************************************************
//
// Values that can be passed to GPIO_setPadConfig() as the pinType parameter
// and returned by GPIO_getPadConfig().
//
//*****************************************************************************
#define GPIO_PIN_TYPE_STD 0x0000U //!< Push-pull output or floating input
#define GPIO_PIN_TYPE_PULLUP 0x0001U //!< Pull-up enable for input
#define GPIO_PIN_TYPE_INVERT 0x0002U //!< Invert polarity on input
#define GPIO_PIN_TYPE_OD 0x0004U //!< Open-drain on output
#endif
對于時鐘配置 有以下四種:
typedef enum
{GPIO_QUAL_SYNC, //!< Synchronization to SYSCLKGPIO_QUAL_3SAMPLE, //!< Qualified with 3 samplesGPIO_QUAL_6SAMPLE, //!< Qualified with 6 samplesGPIO_QUAL_ASYNC //!< No synchronization
} GPIO_QualificationMode;
一般而言 時鐘就配置為GPIO_QUAL_ASYNC
即可 也就是異步
若配置為GPIO_QUAL_SYNC
則會根據系統時鐘對齊
GPIO輸出
若配置為GPIO輸出的話 則用以下函數 如GPIO31和34 對應開發板上的LED4 LED5
//GPIO 31 34 OutputGPIO_setPinConfig(GPIO_31_GPIO31);GPIO_setDirectionMode(31, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(31, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(31, GPIO_QUAL_ASYNC);GPIO_setPinConfig(GPIO_34_GPIO34);GPIO_setDirectionMode(34, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(34, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(34, GPIO_QUAL_ASYNC);
同樣 使用GPIO_writePin
或GPIO_setPortPins
即可寫入輸出值 后者是一整個Port的輸出函數
如:
GPIO_writePin(31,0);GPIO_writePin(34,1);
其中 Port只有三種:
typedef enum
{GPIO_PORT_A = 0, //!< GPIO port AGPIO_PORT_B = 1, //!< GPIO port BGPIO_PORT_H = 7 //!< GPIO port H
} GPIO_Port;
使用GPIO_togglePin
則切換電平高低
GPIO_togglePin(31);GPIO_togglePin(34);
SCI配置
SCI與UART基本一致 但是多了一個Address模式
也就是多了一位地址位 該模式可以在SCI_setAddrMultiProcessorMode
中開啟
若不開啟 就是普通模式
在使用時 可以直接當作UART來使用
在開發板上 默認使用的UART為SCIA的TX、RX 對應GPIO28、29
配置SCI前 需要先配置GPIO基本配置
//// GPIO28 is the SCI Rx pin.//GPIO_setPinConfig(DEVICE_GPIO_CFG_SCIRXDA);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_DIR_MODE_IN);GPIO_setPadConfig(DEVICE_GPIO_PIN_SCIRXDA, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_QUAL_ASYNC);//// GPIO29 is the SCI Tx pin.//GPIO_setPinConfig(DEVICE_GPIO_CFG_SCITXDA);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(DEVICE_GPIO_PIN_SCITXDA, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_QUAL_ASYNC);
這里就是把TX配置為輸出、RX配置為輸入 其他默認
外設配置很簡單調用SCI_setConfig
函數配置波特率、時鐘、數據即可
然后通過SCI_enableModule
打開相應模式
再將通道復位清空即可
SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 |SCI_CONFIG_STOP_ONE |SCI_CONFIG_PAR_NONE));SCI_enableModule(SCIA_BASE);SCI_enableTxModule(SCIA_BASE);SCI_enableRxModule(SCIA_BASE);SCI_resetChannels(SCIA_BASE);SCI_performSoftwareReset(SCIA_BASE);
SCI發送、接收
發送有好幾種方式 最常用的是SCI_writeCharArray
extern void
SCI_writeCharArray(uint32_t base, const uint16_t * const array,uint16_t length);
該方式為阻塞發送
對應阻塞接收為:
extern void
SCI_readCharArray(uint32_t base, const uint16_t * const array,uint16_t length);
測試
代碼如下:
/*** main.c*/
#include "device.h"
#include "driverlib.h"#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>//
// Globals
////
// Send data for SCI-A
//
uint16_t TX_Buf[2]={0xAA,0xBB};//
// Received data for SCI-A
//
uint16_t RX_Buf[2]={0xFF,0xFF};
//
// Function Prototypes
//
void Init_GPIO(void)
{//// GPIO28 is the SCI Rx pin.//GPIO_setPinConfig(DEVICE_GPIO_CFG_SCIRXDA);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_DIR_MODE_IN);GPIO_setPadConfig(DEVICE_GPIO_PIN_SCIRXDA, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_QUAL_ASYNC);//// GPIO29 is the SCI Tx pin.//GPIO_setPinConfig(DEVICE_GPIO_CFG_SCITXDA);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(DEVICE_GPIO_PIN_SCITXDA, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_QUAL_ASYNC);//GPIO 31 34 OutputGPIO_setPinConfig(GPIO_31_GPIO31);GPIO_setDirectionMode(31, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(31, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(31, GPIO_QUAL_ASYNC);GPIO_setPinConfig(GPIO_34_GPIO34);GPIO_setDirectionMode(34, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(34, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(34, GPIO_QUAL_ASYNC);GPIO_writePin(31,0);GPIO_writePin(34,1);
}void Init_SCI(void)
{SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 |SCI_CONFIG_STOP_ONE |SCI_CONFIG_PAR_NONE));SCI_enableModule(SCIA_BASE);SCI_enableTxModule(SCIA_BASE);SCI_enableRxModule(SCIA_BASE);SCI_resetChannels(SCIA_BASE);SCI_performSoftwareReset(SCIA_BASE);
}void delay_ms(uint32_t ms)
{while(ms--){DEVICE_DELAY_US(1000);}
}int main(void)
{//// Initializes system control, device clock, and peripherals//Device_init();Device_initGPIO();Init_GPIO();Init_SCI();//// Initializes PIE and clear PIE registers. Disables CPU interrupts.// and clear all CPU interrupt flags.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell interrupt// Service Routines (ISR).//Interrupt_initVectorTable();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;delay_ms(10);SCI_writeCharArray(SCIA_BASE, TX_Buf, 2);while (1){delay_ms(500);GPIO_togglePin(31);GPIO_togglePin(34);SCI_readCharArray(SCIA_BASE, RX_Buf, 1);SCI_writeCharArray(SCIA_BASE, RX_Buf, 1);}}
配置好后運行
可以觀測到串口回環以及每次的LED反轉
附錄:F28002x開發板上手、環境配置、燒錄及TMS320F280025C模板工程建立
F28002x敘述
作為TI C28x架構的DSP 其屬于C2000系列
其開發板套件如 F28002x LaunchPad 電路板自帶XDS110 極大的方便了開發
對于其環境開發外 除安裝IDE CCS外 還應安裝SDK C2000WARE、UniFlash等
其中 紅框為必要安裝 藍框為可選安裝
Motor Control SDK (C2000WARE-MOTORCONTROL-SDK) 適用于各種三相電機控制應用,例如工業驅動器和伺服拓撲結構。Digital Power SDK (C2000WARE-DIGITALPOWER-SDK) 適用于開發針對各種交流/直流、直流/直流和直流/交流電源應用的數字電源系統。
F28002x連接PC后 需要安裝C2000WARE(或其他TI自帶XDS110驅動的SDK包)才能有XDS110驅動
成功安裝后即可正常使用
燒錄
通過UniFlash即可進行擦除和燒錄
插上即可自動識別 通過XDS110進行操作
擦除:
燒錄時 可選擇bin、out等文件 這極大的方便了開發
.out文件可以由CCS直接編譯而來 .bin文件則通過.out轉換而來
(TI的MMWave系列芯片就不能直接燒錄.out文件)
燒錄時 建議先擦除再燒錄
燒錄的地址、位置 由工程編譯后的.out文件決定
SDK庫文件說明
在建立工程前 確保安裝了C2000WARE
在C2000的SDK中 主要要用到這兩個文件夾:
driverlib中存儲了必要的頭文件、lib文件(這里的文件可以不用拷貝)
其中 CCS下面的Debug和Release文件夾 則有兩個不同的lib 分別在不同的情況下使用
device_support中則存放了cmd文件和SDK的頭文件
分別位于common的cmd中和include中
其中 driverlib.h
、device.h
、device.c
建議拷貝到工程中使用 即為庫函數開發包(上面的driverlib也可以拷 但是沒必要)
cmd文件在建立工程時會自動生成 但也可以根據需要拷貝其他文件或進行修改
這里常用的就是RAM_Link和Flash_Link
另外 還應拷貝f28002x_codestartbranch.asm
文件 即start文件
Flash和RAM的區別就是燒錄和運行的地址不同 如果要發布 則用Flash 如果只是調試 就用RAM
這兩個cmd文件不能同時使用 可以根據工程配置Debug、Release來進行選擇
如果要額外使用寄存器開發的話:
device_support下的headers文件夾則在寄存器開發中被使用
如果想通過寄存器(類似于標準庫)的方式開發 而非TI推薦的庫函數方式開發
則需要另外導入headers下的cmd和include
同樣可以根據需要替換或修改cmd文件
如果要使用 則下面的頭文件和源文件都要拷貝
工程建立
通過CCS進行工程建立
工程中額外加入device.h、device.c、driverlib.h和啟動asm文件:
建立main.c并寫入以下代碼:
/*** main.c*/
#include "device.h"
#include "driverlib.h"#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>int main(void)
{//// Initializes system control, device clock, and peripherals//Device_init();Device_initGPIO();//// Initializes PIE and clear PIE registers. Disables CPU interrupts.// and clear all CPU interrupt flags.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell interrupt// Service Routines (ISR).//Interrupt_initVectorTable();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;DEVICE_DELAY_US(1000);while (1){}}
cmd文件可以使用生成自帶的文件 也可以在SDK中拷貝
其中 工程屬性中 要選擇小端格式ELF
并選擇rts2800_fpu32_eabi.lib支持庫文件
在頭文件中 導入SDK包的位置
C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28002x\driverlib\inc
C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28002x\driverlib
${workspace_loc:/${ProjName}/Device}
${workspace_loc:/${ProjName}}
${PROJECT_ROOT}
${CG_TOOL_ROOT}/include
并在C2000 Link中導入lib文件和目錄
rts2800_fpu32_eabi.lib
C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28002x\driverlib\ccs\Debug\driverlib.lib${CG_TOOL_ROOT}/lib
C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28002x\driverlib\ccs\Debug
${CG_TOOL_ROOT}/include
如果要為了方便 可以在這里添加變量
建立好后編譯即可
更方便的路徑導入
添加C2000Ware包后 更容易導入庫
${COM_TI_C2000WARE_INCLUDE_PATH}
${COM_TI_C2000WARE_INSTALL_DIR}
${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28002x/driverlib/inc
${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28002x/driverlib
${workspace_loc:/${ProjName}/Device}
${workspace_loc:/${ProjName}}
${PROJECT_ROOT}
${CG_TOOL_ROOT}/include${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28002x/driverlib/ccs/Debug/driverlib.lib${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28002x/driverlib/ccs/Debug
調試
通過Load Program和XDS110下載后即可調試