iTop-4412 裸机程序(十四)- 串口程序Demo分析

6 篇文章 0 订阅
4 篇文章 0 订阅


源码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值