配置 UART,从 USART 控制 B 寄存器开始。
该寄存器的位 6 和 7 用于启用/禁用 UART 的发射器和接收器。我们将启用这些位,以便启用发射器和接收器。此外,位 [2:1] 将接收器设置为不同的可用模式。我们将这些位保留为 0 以将接收器设置为正常模式。
该寄存器位的复位保持其默认状态,即 diabled。
USART0.CTRLB = (1<<7)|(1<<6); // RX & TX enable, Normal mode, SOF disabled
下一个寄存器是 USART 控制 C 寄存器。
这里我们设置常用的UART配置,它由8个数据位和1个停止位组成,没有奇偶校验。UART 模式设置为异步模式。
寄存器的最终值为 0x03。
USART0.CTRLC = 0x03; // Asynch mode, no parity, 1 stop bit, 8 data bits
下一个寄存器是波特寄存器。这是一个 16 位寄存器,该寄存器中的值决定了 UART 的波特率。下图显示了计算所需波特率的波特寄存器值的公式.
我们的时钟配置为使用20MHz内部振荡器,预分频器为4。这会将时钟降低到 5MHz。CPU 和外设 (CLK_PER) 使用相同的时钟。如下图所示。
对于5MHz的外设时钟和115200的所需波特率,波特寄存器值计算如下所示。
参数 S 是每位的样本数,对于异步正常模式,它的值为 16。
我们不能在 16 位寄存器中输入十进制值,因此我们将输入值 174。
我们将使用 STATUS 寄存器来监控数据传输是否已完成。
此寄存器 (TXCIF) 的位 6 在 TXDATA 寄存器中的数据移出时设置。在配置过程中,我们将通过将 1 写入其中来清除此位。
USART0.STATUS |= 1<<6; // clear TXCIF flag
现在我们将配置 UART 的引脚。引脚 PB2 是 UART TX 引脚,必须设置为输出,而引脚 PB3 是 UART RX 引脚,必须设置为输入。
PORTB.DIR = 0x04; //0b00000100 -> PB2->OUT, PB3->IN
这样就完成了 UART 配置。以下是包含上述寄存器配置的最终代码。
void uartInit (void)
{
USART0.CTRLB = (1<<7)|(1<<6); // RX & TX enable, Normal mode, SOF disabled
USART0.CTRLC = 0x03; // Asynch mode, no parity, 1 stop bit, 8 data bits
USART0.BAUD = 174;
USART0.STATUS |= 1<<6; // clear TXCIF flag
PORTB.DIR = 0x04; // PB2->OUT, PB3->IN
}
|