主题中讨论的其他器件:MSP430F5529
您好!
我正在尝试设置一个简单的 UART 程序、将发送到 C2000的数据存储到阵列中。 我之前发布了一个类似的问题、但我发现我的答案是这样的! 我修改了我的代码并清除了一些内容。
以下是一些功能 要求:
-9600波特
-当一个消息被接收时 CPU 中断(RXBUF 有一个字节)
-消息不频繁
-消息将由1-2个字组成、例如"Route 1"、"Go"或"Top"。
- C2000将连接到 HC06、它将通过蓝牙接收来自应用程序的数据。 这已经在 MSP430F5529 @ 9600波特下进行了测试和确认
我已经完成了两个示例项目、但我在这个应用中遇到了一些问题。
我让 HC06的 TX 进入引脚3、如果我理解正确、J1.3在跳线短接 JP6和 JP7时也是 GPIO28、这是对的吗?
这里是我的 SCI 代码(我知道没有包含什么、也不包含什么、这是因为它是一个更大的项目的一部分、其中包含计时器、ePWM、ECAP 等):
_interrupt void sciaRxFifoIsr (void);
volatile unsigned char RXParseData[256]={};//存储 RXBUF 中接收到的数据的数组
void main (void)
{
//-- CPU 初始化
InitSysCtrl();//初始化 CPU (文件:sysctrl.c)
InitPieCtrl();//初始化并启用 PIE (文件:PIECTRL.c)
InitWatchdog();//初始化看门狗计时器(文件:watchdog.c)
//-- SCI ----设置
EALLOW;
/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 GPIO28启用上拉(SCIRXDA)
/*将所选引脚的限定条件设置为仅异步*/
默认情况下、//输入与 SYSCLKOUT 同步。
//这将为所选引脚选择异步(无限定条件)。
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//异步输入 GPIO28 (SCIRXDA)
/*使用 GPIO 寄存器配置 SCI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SCI 功能引脚。
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//为 SCIRXDA 操作配置 GPIO28
EDIS;
//结束 SCI 设置
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//FIFO 设置
SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all =0x0001;//启用 RX、内部 SCICLK、
//禁用 TX、RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x00C2;// 9600 baud ->在常见波特率中找到、BRR = 0xC2或194 (十进制)
SciaRegs.SCIFFRX.All=0x0022;
SciaRegs.SCIFFCT.All=0x00;
SciaRegs.SCICTL1.all =0x0021;//从复位中撤回 SCI
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
//启用此示例所需的中断
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;
//--启用全局中断
asm (" CLRC INTM、DBGM");//启用全局中断和实时调试
}
_interrupt void sciaRxFifoIsr (void)
{
uint16 i = 0;
for (i=0;i<2;i++)
{
RXParseData[i]=SciaRegs.SCIRXBUF.all;//读取数据
}
while (i!= NULL)
{
RXParseData[i]=SciaRegs.SCIRXBUF.all;//读取数据 --- >第一个字符的 ASCII 代码与接收的内容不匹配。 例如 "停止"中的"S"最终为0x87
i++;//----------------- >我一直在递增
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK
}
正如最后一个注释、当我更改波特率时、我注意到 RXBUF 中有不同的值。 我相信我的运行速度是90MHz (也许我不是这样、这是问题吗? 如何确认?)。 我在 MSP430上完成了这项工作、因此蓝牙模块很好!
谢谢!