源码
GitHub:https://github.com/Kilento/4412NoOS
硬件原理图
我们使用图中的CON3作为实验对象,它对应的GPIO口是GPA1_0和GPA1_1,对应芯片的UART2
串口时钟
// 选择串口时钟源为SCLKMPLL
ldr r0, =(CLK_SRC_PERIL0)
ldr r1, =0x00666666
str r1, [r0]
...
// 设置为8分频
ldr r0, =(CLK_DIV_PERIL0)
ldr r1, =0x00777777
str r1, [r0]
...
串口初始化
void uart_init(void)
{
//GPA0CON = 0x22222222; // 设置 GPA0CON 为 UART0 和 UART1 模式
GPA1CON = 0x222222; // 设置 GPA1CON 为 UART2 和 UART3 模式
ULCON2 = 0x00000003; // 8bit数据域 1bit 停止位,无奇偶校验位
UCON2 = 0x5; // 设置收发均为 poll mode
UFCON2 = 0x111; // 设置 FIFO 及相应的触发级别
UMCON2 = 0x00000000; // 禁止 AFC,禁止Modem
/* 波特率设置为 115200 */
/* DIV_VAL = UBRDIVn + UFRACVALn/16
DIV_VAL = (SCLK_UART/(bps * 16)) - 1
Where, the divisor should be from 1 to (216 – 1).
By using UFRACVALn, you can generate the Baud rate more accurately.
For example, if the Baud rate is 115200 bps and SCLK_UART is 100 MHz, UBRDIVn and UFRACVALn are:
DIV_VAL = (100000000/(115200 * 16)) – 1 = 13.02 – 1 = 12.02
UBRDIVn = 12 (integer part of DIV_VAL)
UFRACVALn/16 = 0.02
Therefore, UFRACVALn = 0 */
UBRDIV2 = 53;
UFRACVAL2 = 4;
return;
}
串口收发函数
void uart_putc(char c)
{
while (!(UTRSTAT2 & (1 << 2)));
UTXH2 = c;
return;
}
char uart_getc(void)
{
char c = '\0';
while (!(UTRSTAT2 & (1 << 0)));
c = URXH2;
return c;
}
主函数
int uart_main(void)
{
char c = '\0';
uart_init();
while(1)
{
c = uart_getc();
uart_putc(c);
uart_putc('\r');
uart_putc('\n');
uart_putc(c);
uart_putc('\r');
uart_putc('\n');
}
return 0;
}
2022年06月14日
Kilento