大家好、
我尝试从 docklight 软件接收阵列、但阵列的最后一个字节最初并未接收。波特率为9600、奇偶校验无、停止位1。
例如、
如果 我从 docklight 软件发送"Hello"。 微控制器仅接收到"Hell"。
如果我发送"Hello"控制器接收"oHell"、
这意味着阵列的最后一个字节将与第二个阵列一起接收。 我已附上我的代码供您参考
#include "F28x_Project.h"
//全局
//so、Tpwm =(2001)/(12.5m)= 0.00016
//Fpwm = 1/Tpwm = 1/0.00016 = 6.246kHz
//so、以从频率中查找计数
// count (tbprd)= 12.5MHz/ freq ...其中 tbprd=max+min
char ReceivedChar[1000];
char *msg;
int j;
//函数原型
void SCIC_echoback_init (void);
void SCIC_xmit (int a);
void SCIC_msg (char * msg);
中断 void scicRxFifoIsr (void);
void main (void)
{
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
InitGpio();
//对于这个示例、只初始化针对 SCI-A 端口的引脚。
// GPIO_SetupPinMux ()-设置 GPxMUX1/2和 GPyMUX1/2寄存器位
// GPIO_SetupPinOptions ()-设置 GPIO 的方向和配置
//这些函数可在 F2837xD_GPIO.c 文件中找到。
GPIO_SetupPinMux (139、GPIO_MUX_CPU1、6);
GPIO_SetupPinOptions (139、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (56、GPIO_MUX_CPU1、6);
GPIO_SetupPinOptions (56、GPIO_OUTPUT、GPIO_异 步);
//启用 PWM1、PWM6
CpuSysRegs.PCLKCR2.bit.EPWM1=1;
CpuSysRegs.PCLKCR2.bit.EPWM6=1;
//在这种情况下、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
//这些函数位于 F2837xD_ePWM.c 文件中
InitEPwm1Gpio();
InitEPwm6Gpio();
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIC_RX_INT =&scicRxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//为了确保精确的时序,请使用只写指令对整个进行写操作
//寄存器。 因此、如果中的任何配置位发生更改
// ConfigCpuTimer 和 InitCpuTimers (在 F2837xD_cputimervars.h 中)、如下所示
//设置也必须更新。
CpuTimer0Regs.TCR.ALL = 0x4001;
//启用全局中断和更高优先级的实时调试事件:
IER = M_INT8;//对于 ADCA0、EPWM1和 SCIC_RX
//为本示例所需的 SCI/UART 启用中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;// PIE 组8、INT1 SCI RX。请参阅第页 96
SCIC_echoback_init ();//初始化用于 echoback 的 SCI
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
while (1)
{
}
}
// SCIC_echoback_init -测试1、SCIC DLB、8位字、波特率0x000F、默认值、1停止位、 无奇偶校验
void SCIC_echoback_init ()
{
//注意:SCIC 外设的时钟被打开
//在 InitSysCtrl()函数中
ScicRegs.SCICCR.ALL = 0x0007;// 1停止位,无环回
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
ScicRegs.SCICTL1.ALL = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
ScicRegs.SCICTL2.all = 0x0003;
// ScicRegs.SCICTL2.bit.TXINTENA=1;
ScicRegs.SCICTL2.bit.RXBKINTENA=1;
9600波特时为//SCIC
//pllsysclk=100MHz、由 SYSCTRL 寄存器提供
//SYSCLK 为100MHz
//LSPCLK=100/4=25MHz。
//baud=LSPCLK/(9600 * 8)- 1.
//LSPCLK 默认使用/4分频器
ScicRegs.SCIHBAUD.ALL = 0x0001;
ScicRegs.SCILBAUD.ALL = 0x0045;
ScicRegs.SCIFFTX.ALL = 0xE040;/0xE040
ScicRegs.SCIFFRX.ALL = 0x0022;/0x2044;
ScicRegs.SCIFFCT.ALL = 0x0;
ScicRegs.SCICTL1.ALL = 0x0023;//从复位中撤回 SCI
ScicRegs.SCIFFRX.bit.RXFIFORESET = 1;
}
// SCIC_xmit -从 SCI 发送一个字符
void SCIC_xmit (int a)
{
while (ScicRegs.SCIFFTX.bit.TXFFST!= 0){}
ScicRegs.SCITXBUF.ALL =A;
}
// SCIC_msg -通过 SCIC 发送消息
void SCIC_msg (char * msg)
{
int i;
I = 0;
while (msg[i]!='\0')
{
SCIC_xmit (msg[i]);
i++;
}
}
// scicRxFifoIsr - SCIC 接收 FIFO ISR
中断空 scicRxFifoIsr (空)
{
while (scicRegs.SCIFFRX.bit.RXFFST = 0){}//等待空状态
ReceivedChar[j]= ScicRegs.SCIRXBUF.ALL;
J++;
ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
scicRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACK.All|=M_INT8;//发出 PIE ACK
}