(一)MSP432串口介绍
??MSP432P401R并没有专用的串口设备,要使用EUSC模块配置成UART模式,串口通信非常便捷易用,它在嵌入式设备中是最为常见的一种接口,在这里我们把MSP432的串口配置成8in1的模式,8位数据,1位停止位,没有流控选择,波特率为9600,发送方式是直接发送,接收方式是中断接收。 需要注意的是仅仅有EUSCA支持被配置成串口模式。
(二)配置串口
??首先打开TI的串口回环(call back)例程,然后参照其进行配置,之后进行测试即可:
(1)初始化串口
需要注意的是串口时钟选择了SMCLK,之前的例子中SMCLK已经被配置成12MHz,那么我们需要获取特定波特率的分频数等等,这里TI在man手册中给出了一个表: 这个表中给出详细的参数配置,找到12000000,然后发现需要配置成这样子: 那么需要配置的参数就是UCBRx,UCBRFx,BCBRSx,这里的三个数值分别对应配置信息的前三个,按照12MHz的SMCLK配置9600波特率8In1的串口如下:
const eUSCI_UART_ConfigV1 uartConfig =
{
EUSCI_A_UART_CLOCKSOURCE_SMCLK,
78,
2,
0,
EUSCI_A_UART_NO_PARITY,
EUSCI_A_UART_LSB_FIRST,
EUSCI_A_UART_ONE_STOP_BIT,
EUSCI_A_UART_MODE,
EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,
EUSCI_A_UART_8_BIT_LEN
};
void ANO_DT_Init(void)
{
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,
GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
UART_initModule(EUSCI_A2_BASE, &uartConfig);
UART_enableModule(EUSCI_A2_BASE);
UART_enableInterrupt(EUSCI_A2_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT);
Interrupt_enableInterrupt(INT_EUSCIA2);
}
(2)中断函数配置
void EUSCIA2_IRQHandler(void)
{
uint8 datA2 = 0;
datA2 = UART_receiveData(EUSCI_A2_BASE);;
ps2gamepad_decode(datA2,&PS2);
UART_clearInterruptFlag(EUSCI_A2_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT);
}
(3)测试函数
这里使用的是PS2手柄转串口进行测试接收发送,直接进行接收测试就行,接收没问题发送一般没问题:
void ps2gamepad_decode(uint8 dat,ps2datatypedef *p)
{
if(dat == 'A')
p->l_up = 1;
else if(dat == 'B')
p->l_down = 1;
else if(dat == 'C')
p->l_left = 1;
else if(dat == 'D')
p->l_right = 1;
}
由于PS2转串口模块的特殊发送流程,只好采用300ms清除一次所有标志来解决标志变化的问题,最终接收正常,使用432给手柄房振动信息,手柄可以正常振动,串口通信成功。
(三)规律小结
对于一个嵌入式处理器,最常用最简单的模块就是串口,在linux中也经常使用串口进行调试,对于调试串口,我们首先需要知道串口的时钟源,然后配置分频系数,配置功能寄存器就可以使用串口,如果使用了中断接收,还需要开启串口中断,开启总中断,然后在中断完成后需要清理标志位防止中断仅仅执行一次或者不执行,这些基本就是串口的开发流程。
|