大家帮忙看一下我的串口计算结果对不对,我感觉没问题,但是输出不正确。
灰小子:
msp430的串口波特率计算工具
http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html
Susan Yang:
谢谢楼上分享的工具
另外在用户指南(www.ti.com/…/slau208q.pdf)内也有 36.3.13 Typical Baud Rates and Errors
以及36.3.10 Setting a Baud Rate
For a given BRCLK clock source, the baud rate used determines the required division factor N:
N = fBRCLK/BaudrateBRCLK:时钟源,可以通过寄存器设定何为时钟源;
N:波特率产生的分频因子。
如果N等于或大于16,则可以通过设置选择过采样波特率生成模式UCOS16
user4959119:
回复 Susan Yang:
使用了这个工具的结果还是不行,我用的外部XIT 2M晶振,示波器测试时钟代码配置正确,串口输出频率在5.6K 左右,实在是找不到什么原因了。实际输出结果都是0x37。
void ucs_init(void) {/* Set VCore = 1 for 12MHz clock */PMM_setVCore(PMM_CORE_LEVEL_0);/* ACLK, MCLK, SMCLk set out to pins */GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P11, GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2);/* Port select XT1 选择晶振引脚 */GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P7, GPIO_PIN0 + GPIO_PIN1);/* 初始化XT1和XT2晶振频率 */UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY, UCS_XT2_CRYSTAL_FREQUENCY);/* 初始化 XT1. 初始化成功返回STATUS_SUCCESS */UCS_turnOnHFXT1WithTimeout(UCS_XT1_DRIVE_0, UCS_XT1_TIMEOUT);/* 选择XT1 作为 MCLK 时钟源 */UCS_initClockSignal(UCS_MCLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);/* 选择XT1 作为 SMCLK 时钟源 */UCS_initClockSignal(UCS_SMCLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);/* 选择XT1 作为 ACLK 时钟源 */UCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);/* 使能振荡器故障中断 */SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT); }void uart_init(void) {/* 选择串口收发引脚* P9.4,5 = USCI_A0 TXD/RXD*/GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P9, GPIO_PIN4 + GPIO_PIN5);/* Baudrate = 9600, clock freq = 2MHzUCBRx = 208, UCBRFx = 0, UCBRSx = 3, UCOS16 = 0*/USCI_A_UART_initParam param = {0};param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;param.clockPrescalar = 13;param.firstModReg = 0;param.secondModReg = 0;param.parity = USCI_A_UART_NO_PARITY;param.msborLsbFirst = USCI_A_UART_LSB_FIRST;param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;param.uartMode = USCI_A_UART_MODE;param.overSampling = 1;if(STATUS_FAIL == USCI_A_UART_init(USCI_A2_BASE, ¶m)){return;}/* 使能串口操作 */USCI_A_UART_enable(USCI_A2_BASE);/* 使能串口接收中断 */USCI_A_UART_clearInterrupt(USCI_A2_BASE, USCI_A_UART_RECEIVE_INTERRUPT);USCI_A_UART_enableInterrupt(USCI_A2_BASE, USCI_A_UART_RECEIVE_INTERRUPT); }void main(void) {/* 停止看门狗 */WDT_A_hold(WDT_A_BASE);ucs_init();uart_init();/* 使能全局中断 */__bis_SR_register(GIE);while(1){USCI_A_UART_transmitData(USCI_A2_BASE,55);}}
灰小子:
回复 user4959119:
建议先把ACLK、smclk和mclk通过io输出,用示波器确定下时钟信号是否正确。
user4959119:
回复 灰小子:
这个看了,都正确的, 你看看代码配置有问题吗大佬
user4959119:
回复 灰小子:
是自己眼花了,把55的当成0x55了,啊啊啊。