This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我正在使用 Code Composer Studio 中的 Energia Sketch、我想通过蓝线与 Launchpad 建立通信、但串行硬件的.cpp 将 GPIO 84和84配置为串行通信、但 LaunchPad 没有这些物理引脚。
有人可以帮帮我吗?
这是 HardwareSerial.cpp 代码:
*
(二
* HardwareSerial.cpp
*
*适用于 C2000的 Arduino 核心文件
*版权所有(c) 2012 Eric Ma。 保留所有权利。
*
*
(三
源自:
HardwareSerial.cpp -适用于 Wiring 的硬件串行库
版权所有(c) 2006 Nicholas Zambetti. 保留所有权利。
此库是免费软件;您可以重新分发和/或
根据 GNU Lesser General Public 的条款对其进行修改
免费软件基金会发布的许可证;或者
许可证2.1版或(您可以选择)任何更高版本。
发布该库的目的是希望它将有所帮助、
但没有任何保证;甚至没有的暗示保证
适销性或特定用途的适用性。 请参阅 GNU
较低一般公共许可证以了解更多详细信息。
您应该已经收到 GNU Lesser General Public 的副本
许可证以及此库;如果没有、请写入免费软件
Foundation、Inc.、51 Franklin St、Fifth Floor、Boston、 MA 02110-1301美国
2006年11月23日由 David A. Mellis 修改
2010年9月28日由 Mark Sproul 修改
*
#include
#include
#include
#include
#include "Energia.h"
#include "wiring_prive.h"
#include "sci_isr_handler.h"
#include "HardwareSerial.h"
HardwareSerial *SerialPtr;
#define serial_buffer_size 16.
struct ring_buffer
{
unsigned char buffer[serial_buffer_size];
volatile unsigned int head;
volatile unsigned int tail;
};
环形缓冲器 Rx_buffer ={0}、0、0};
环形缓冲器 TX_BUFFER ={0}、0、0};
内联 void store_char (unsigned char c、ring 缓冲区*缓冲区)
{
unsigned int i =(unsigned int)(buffer->head + 1)% serial_buffer_size;
//我们是否应该将接收到的字符存储到该位置
//在尾前面(意味着头将前进到
//尾的当前位置)、我们将溢出缓冲区
//这样我们就不会写字符或将头前移。
if (i!= buffer->tail){
Buffer->buffer[缓冲区->head]= c;
Buffer->Head = I;
}
}
void serialEvent();
void serialEvent(){}
void serialEventRun (void)
{
if (Serial.available ()) serialEvent();
}
//构造函数////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
硬件串行::硬件串行(ring 缓冲区* rx_buffer、ring 缓冲区* tx_buffer)
{
_Rx_buffer = Rx_buffer;
_TX_buffer = TX_buffer;
}
//公共方法////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef TMS320F28069
#define CPU_FREQ 90E6 //针对 F28069设置为90MHz
#Elif defed (TMS320F28027)
#define CPU_FREQ 60E6 //默认值= 60MHz。 对于50MHz 器件更改为50E6
#Elif Defined (TMS320F28377S)
#define CPU_FREQ 200E6 //针对 F28377S 设置为200MHz
其他
#define CPU_FREQ 60E6 //默认值= 60MHz。 对于50MHz 器件更改为50E6
#endif
#define LSPCLK_FREQ CPU_FREQ/4
空硬件串行::begin (无符号长波特)
{
EALLOW;
#ifdef TMS320F28377S
//将 GPIO84配置为 SCITXDA (输出引脚)
//将 GPIO85配置为 SCIRXDA (输入引脚)
GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1;
GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1;
GpioCtrlRegs.GPCGMUX2.bit.GPIO85=1;
GpioCtrlRegs.GPCMUX2.bit.GPIO85=1;
//将 GPIO85 (SCIRXDA)配置为异步引脚
GpioCtrlRegs.GPCQSEL2.bit.GPIO85=3;
其他
/*为所选引脚启用内部上拉*/
/*禁用所选输出引脚的内部上拉电阻
以降低功耗。 *
//用户可以启用或禁用上拉。
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 GPIO28启用上拉(SCIRXDA)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1;//禁用 GPIO29的上拉(SCITXDA)
/*将所选引脚的限定条件设置为仅异步*/
默认情况下、//输入与 SYSCLKOUT 同步。
//这将为所选引脚选择异步(无限定条件)。
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//异步输入 GPIO28 (SCIRXDA)
/*使用 GPIO 寄存器配置 SCI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SCI 功能引脚。
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//为 SCIRXDA 操作配置 GPIO28
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;//为 SCITXDA 操作配置 GPIO29
#endif //TMS320F28377S
EDIS;
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
#ifdef TMS320F28377S
PieVectTable.SCIA_RX_INT =&UART_Rx_ISR;
PieVectTable.SCIA_TX_INT =&UART_TX_ISR;
其他
PieVectTable.SCIRXINTA =&UART_Rx_ISR;
PieVectTable.SCITXINTA =&UART_TX_ISR;
#endif
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中
EALLOW;
#ifdef TMS320F28377S
CpuSysRegs.PCLKCR7.bit.SCI_A = 1;
ClkCfgRegs.LOSPP.bit.LSPCLKDIV = 1;
其他
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;// SCI-A
SysCtrlRegs.LOSPP.bit.LSPCLK = 1;//LSPCLK = SYSCLK/2
#endif
EDIS;
SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
#ifdef TMS320F28377S
SciaRegs.SCIHBAUD.all =(unsigned int)((f_cpu/(ClkCfgRegs.LOSPP.bit.LSPCLKDIV * 2))/(*波特8)-1)>8;
SciaRegs.SCILBAUD.all =(unsigned int)((F_CPU/(ClkCfgRegs.LOSPP.bit.LSPCLKDIV * 2))/(*波特8)-1)&0x00FF;
其他
SciaRegs.SCIHBAUD =(unsigned int)((f_cpu/(SysCtrlRegs.LOSPP.bit.LSPCLK * 2))/(baud *8)-1)>8;
SciaRegs.SCILBAUD =(unsigned int)((F_CPU/(SysCtrlRegs.LOSPP.bit.LSPCLK * 2))/(BAUD*8)-1)&0x00FF;
#endif
//SciaRegs.SCICCR.bit.LOOPBKENA=0;//禁用回路
SciaRegs.SCIFFTX.All=0xC020;
SciaRegs.SCIFFRX.All=0x0021;
SciaRegs.SCIFFCT.All=0x0;
SciaRegs.SCICTL1.all =0x0023;//从复位中撤回 SCI
SciaRegs.SCIFFTX.bit.TXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
//启用 sci 所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE 组9,INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1;// PIE 组9,int2
IER |= 0x100;//启用 CPU INT
EINT;
}
空硬件串行:end()
{
//等待传出数据的传输
while (_TX_buffer->head!=_TX_buffer->tail);
rx_buffer->head =_rx_buffer->tail;
//禁用 FIFO 中断
SciaRegs.SCIFFTX.bit.TXFFIENA=0;
SciaRegs.SCIFFRX.bit.RXFFIENA=0;
}
内部硬件串行:可用(空)
{
return (unsigned int)(serial_buffer_size +_rx_buffer->head -_rx_buffer->tail)% serial_buffer_size;
}
硬件串行:operator bool()
{
返回 true;
}
内部硬件串行::peek (void)
{
if (_rx_buffer->head =_rx_buffer->tail){
返回-1;
}否则{
return _rx_buffer->buffer[_rx_buffer->tail];
}
}
内部硬件串行:读取(空)
{
//如果头不在尾前面,我们就没有任何字符
if (_rx_buffer->head =_rx_buffer->tail){
返回-1;
}否则{
unsigned char c =_rx_buffer->buffer[_rx_buffer->tail];
_rx_buffer->tail =(unsigned int)(_rx_buffer->tail + 1)% serial_buffer_size;
返回 c;
}
}
空硬件序列::flush()
{
while (_TX_buffer->head!=_TX_buffer->tail);
}
size_t 硬件串行::写入(uint8_t c)
{
unsigned int i =(_tx_buffer->head + 1)% serial_buffer_size;
//如果输出缓冲区已满,则除至之外没有任何其他缓冲区
//等待中断处理程序将其清空一个位
//返回0呢?
while (i =_TX_buffer->tail);
_tx_buffer->buffer[_TX_buffer->head]= c;
_tx_buffer->head = I;
//SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCIFFTX.bit.TXFFIENA=1;
返回1;
}
中断空 UART_Rx_ISR (空)
{
unsigned char c = SciaRegs.SCIRXBUF.all;
STORE_CHAR (c、&Rx_buffer);
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK
}
中断空 UART_TX_ISR (空)
{
if (tx_buffer.head = tx_buffer.tail){
//缓冲器为空,所以禁用中断
//SciaRegs.SCICTL2.bit.TXINTENA=0;
SciaRegs.SCIFFTX.bit.TXFFIENA=0;
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
PieCtrlRegs.PIEACK.All|=0x100;
返回;
}
unsigned char c = TX_buffer.buffer[TX_buffer.tail];
tx_buffer.tail =(tx_buffer.tail + 1)% serial_buffer_size;
#ifdef TMS320F28377S
SciaRegs.SCITXBUF.all = c;
其他
SciaRegs.SCITXBUF = c;
#endif
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK
}
//预实例化对象//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
硬件串行(&Rx_buffer、&TX_buffer);