最近由于在做去年送药小车国赛题,需要使用到MSP430和OPENMV之间的通信,故着手看看MSP430的串口模式。
第一步:IO口配置
我使用的这款芯片是MSP430F5529,他的TX端设置在P3.3,RX端设置在P3.4,故首先第一步开启两个IO口的输入。
//P3.3 = USCI_A0 TXD
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P3,
GPIO_PIN3|GPIO_PIN4
);
第二步:串口配置
USCI_A_UART_initParam param1 = {0};
param1.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
param1.clockPrescalar = 78;
param1.firstModReg = 2;
param1.secondModReg = 0;//配置波特率
param1.parity = USCI_A_UART_NO_PARITY;//无校验位
param1.msborLsbFirst = USCI_A_UART_LSB_FIRST;//有无停止位
param1.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;//1位停止位
param1.uartMode = USCI_A_UART_MODE;//串口模式
param1.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//暂时不懂
if (STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, ¶m1)){
return;
}
//Enable UART module for operation
USCI_A_UART_enable(USCI_A0_BASE);//使能串口UART A0
USCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);//清除中断标志位
USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT );//打开串口接受中断
// Enable global interrupt
__bis_SR_register(GIE);
//For debugger
__no_operation();
一定要记得打开全局中断!!
关于波特率的配置,这里可以查具体的手册。所采用的时钟不同,寄存器所设置的值也不同。这里我采用的是12MHZ的MCLK,因此,我是根据这个频率下对波特率进行配置的。具体可参考下图
对应于用户指南的1040页。
第三步:中断服务函数
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
Rx_buf = USCI_A_UART_receiveData(USCI_A0_BASE);
Openmv_Receive_Data(Rx_buf);
}
第四步:调用函数,开始收发
uint8_t USCI_A_UART_receiveData (uint16_t baseAddress)
void USCI_A_UART_transmitData (uint16_t baseAddress, uint8_t transmitData)
暂时只用到这个地步,后续有其他该方面应用再继续补充…
补充使用过程中的一点,后续由于把主频升到16MHZ,导致出现一个问题,就是不论发送什么,接受的都是0.
后续通过查阅资料,发现问题原因在于波特率的设置问题。在前文我们提到过,设置波特率根据数据手册寄存器版本36.3.3,大概953页左右的图进行设置,今天发现,这个表存在两个版本。见下图。
这里不同在于UCOS寄存器的值不同。继续查阅数据手册可以发现存在这样一句话,
:
即,在低频模式下,我们设置的UCOS为0,因而参看上面的图一,而UCOS为1是,选择过采样模式。
之间文章中对于串口配置有一个选项当时给的注释是不太懂
param1.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//暂时不懂
这里才用的就是过采样生成。现在疑团解开了!
后续还有更深的理解会继续更新…