大家帮忙看一下我的串口计算结果对不对,我感觉没问题,但是输出不正确。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
使用了这个工具的结果还是不行,我用的外部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 = 2MHz
UCBRx = 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);
}
}