int uart0_set_divisors(uint8_t uartNum, uint32_t uClk, uint32_t baudrate)
时间: 2023-12-01 16:40:49 浏览: 162
这个函数的作用是设置UART0串口的波特率,其中参数uartNum表示要设置的串口号,uClk表示串口时钟频率,baudrate表示要设置的波特率。函数会根据这些参数计算出相应的分频值,并将其写入UART0的寄存器中,从而实现设置波特率的功能。
具体实现过程如下:
1. 首先根据uartNum参数确定要设置的串口号,然后根据该串口号获取相应的寄存器地址。
2. 根据uClk和baudrate计算出分频值divisor,公式为:divisor = uClk / (baudrate * 16) - 1。
3. 将分频值写入UART0的寄存器中,具体写入哪个寄存器取决于串口号。
4. 最后返回设置的波特率值。
下面是该函数的C语言代码实现:
```
int uart0_set_divisors(uint8_t uartNum, uint32_t uClk, uint32_t baudrate)
{
uint32_t divisor;
uint32_t regAddr;
// 根据uartNum获取相应的寄存器地址
switch (uartNum) {
case 0:
regAddr = UART0_BASE + UART_LCRH_OFFSET;
break;
case 1:
regAddr = UART1_BASE + UART_LCRH_OFFSET;
break;
case 2:
regAddr = UART2_BASE + UART_LCRH_OFFSET;
break;
case 3:
regAddr = UART3_BASE + UART_LCRH_OFFSET;
break;
default:
return -1;
}
// 计算分频值
divisor = uClk / (baudrate * 16) - 1;
// 将分频值写入寄存器
*(volatile uint32_t *)regAddr &= ~(0xFF << 0);
*(volatile uint32_t *)regAddr |= (divisor << 0);
// 返回设置的波特率值
return (uClk / ((divisor + 1) * 16));
}
```
阅读全文