IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口uart编程——基于imx6ull -> 正文阅读

[嵌入式]串口uart编程——基于imx6ull

1.main.c

#include "uart.h"

void delay(volatile int d)
{
	while(d--);
}

int main(void)
{
	char c;
	
	uart_init();
	

	while(1)
	{
		c = getchar();
		putchar(c);
		putchar(c+1);
	}

	return 0;
}

2.uart.c

/*
	设置uart的总时钟寄存器:CCM_CSCDR1;地址:20C_4024h;设置的位bit0-5:000000;bit6:0(80m)

	给uart1提供时钟寄存器:CCM_CCGR5;地址:20C_407Ch;设置的位:24-25:设置为11

	配置引脚功能寄存器:SW_MUX_CTL_PAD_UART1_TX_DATA;地址:20E_0084h;设置的位:0-3:设置为0000
						SW_MUX_CTL_PAD_UART1_RX_DATA;地址:20E_0088h;设置的位:0-3:设置为0000

	imx6ull中对uart的特殊要求寄存器:UART1_RX_DATA_SELECT_INPUT;地址:20E_0624h;设置的位:bit0-1:设置为11

	设置波特率寄存器:UARTx_UBIR和UARTx_UBMR;地址:202_00A4和202_00A8;

	设置数据格式寄存器:UART1_UCR2;地址:202_0084

	imx6ull芯片要求必须设置寄存器:UART1_UCR3;地址:202_0088;设置的位:bit2必须是1(很奇怪,既然必须是1,那为什么不直接定死)

	使能uart1寄存器:UARTx_UCR1;地址:201_8080;设置的位:bit0:设置为1	
*/

#include "uart.h"

/*根据IMX6ULL芯片手册<<55.15 UART Memory Map/Register Definition>>的3608页,定义UART的结构体,*/
typedef struct {
  volatile unsigned int  URXD;               /**< UART Receiver Register, offset: 0x0 	           串口接收寄存器,偏移地址0x0     */
  		   unsigned char RESERVED_0[60];		
  volatile unsigned int  UTXD;               /**< UART Transmitter Register, offset: 0x40          串口发送寄存器,偏移地址0x40*/
  		   unsigned char RESERVED_1[60];		
  volatile unsigned int  UCR1;               /**< UART Control Register 1, offset: 0x80 	       串口控制寄存器1,偏移地址0x80*/
  volatile unsigned int  UCR2;               /**< UART Control Register 2, offset: 0x84 	       串口控制寄存器2,偏移地址0x84*/
  volatile unsigned int  UCR3;               /**< UART Control Register 3, offset: 0x88            串口控制寄存器3,偏移地址0x88*/
  volatile unsigned int  UCR4;               /**< UART Control Register 4, offset: 0x8C            串口控制寄存器4,偏移地址0x8C*/
  volatile unsigned int  UFCR;               /**< UART FIFO Control Register, offset: 0x90         串口FIFO控制寄存器,偏移地址0x90*/
  volatile unsigned int  USR1;               /**< UART Status Register 1, offset: 0x94             串口状态寄存器1,偏移地址0x94*/
volatile unsigned int  USR2;               /**< UART Status Register 2, offset: 0x98             串口状态寄存器2,偏移地址0x98*/
  volatile unsigned int  UESC;               /**< UART Escape Character Register, offset: 0x9C     串口转义字符寄存器,偏移地址0x9C*/
  volatile unsigned int  UTIM;               /**< UART Escape Timer Register, offset: 0xA0         串口转义定时器寄存器 偏移地址0xA0*/
  volatile unsigned int  UBIR;               /**< UART BRM Incremental Register, offset: 0xA4      串口二进制倍率增加寄存器 偏移地址0xA4*/
  volatile unsigned int  UBMR;               /**< UART BRM Modulator Register, offset: 0xA8 	   串口二进制倍率调节寄存器 偏移地址0xA8*/
  volatile unsigned int  UBRC;               /**< UART Baud Rate Count Register, offset: 0xAC      串口波特率计数寄存器 偏移地址0xAC*/
  volatile unsigned int  ONEMS;              /**< UART One Millisecond Register, offset: 0xB0      串口一毫秒寄存器 偏移地址0xB0*/
  volatile unsigned int  UTS;                /**< UART Test Register, offset: 0xB4                 串口测试寄存器 偏移地址0xB4*/		
  volatile unsigned int  UMCR;               /**< UART RS-485 Mode Control Register, offset: 0xB8  串口485模式控制寄存器 偏移地址0xB8*/
} UART_Type;


void uart_init(void)
{
	volatile unsigned int *IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA ;
	volatile unsigned int *IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA	;
	volatile unsigned int *IOMUXC_UART1_RX_DATA_SELECT_INPUT ;
	volatile unsigned int *CCM_CSCDR1;
	volatile unsigned int *CCM_CCGR5;

	UART_Type *uart1 = (UART_Type *)0x02020000;

	IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA		= (volatile unsigned int *)(0x20E0084);
	IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA		= (volatile unsigned int *)(0x20E0088);
	IOMUXC_UART1_RX_DATA_SELECT_INPUT		= (volatile unsigned int *)(0x20E0624);
	CCM_CSCDR1 = (volatile unsigned int *)(0x020C4024);
	CCM_CCGR5 = (volatile unsigned int *)(0x020C407C);

	/* 设置uart的总时钟 
		UART_CLK_PODF = 80MHZ
	*/
	*CCM_CSCDR1 &= ~((1<<6) | (0x3f));

	/* 给uart1提供时钟 
		uart1_clk_enable
	*/
	*CCM_CCGR5 |= (3<<24);

	/* 配置引脚功能寄存器 */
	*IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA &= ~0xf;
	*IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA &= ~0xf;

	/* imx6ull中对uart的特殊要求 */
	*IOMUXC_UART1_RX_DATA_SELECT_INPUT |= 3; 

	/* 设置波特率
		115200 = 80M/(16 * (UBMR+1)/(UBIR+1))
		为了方便运算,干脆让UBIR = 15,消掉16
		所以115200 = 80M/(UBMR+1)
		UBMR = 80000000 / 115200 = 694 -1 = 693
?		真正的baudrate = 80000000 / 694 = 115274  ?为啥不是80m的单位不转化为bit	
		先设置UBIR,在设置UBMR
	*/
	uart1->UFCR |= (5<<7); 
	uart1->UBIR = 15;
	uart1->UBMR = 693;

	/* 设置数据格式 */
	uart1->UCR2 |= (1<<14) | (0<<8) | (0<<6) | (1<<5) | (1<<2) | (1<<1);

	/* imx6ull芯片规定的必须设置的 */
	uart1->UCR3 |= (1<<2);

	/* 使能uart1 */
	uart1->UCR1 |= (1<<0);
}

int getchar(void)
{
	UART_Type *uart1 = (UART_Type *)0x02020000;

	while((uart1->USR2 & (1<<0)) == 0);

	return uart1->URXD;
}

char putchar(char c)
{
	UART_Type *uart1 = (UART_Type *)0x02020000;
	
	while((uart1->USR2 & (1<<3)) == 0);
	
	uart1->UTXD = c;

	return c;
}

3.uart.h

/* 有些文件可能会多次包含这个.h文件,包含一次就声明一次,为了避免多次声明 */
#ifndef _UART_H
#define _UART_H
void uart_init(void);
int getchar(void);
char putchar(char c);
#endif

3.Makefile

PREFIX=arm-linux-gnueabihf-
CC=$(PREFIX)gcc
LD=$(PREFIX)ld
AR=$(PREFIX)ar
OBJCOPY=$(PREFIX)objcopy
OBJDUMP=$(PREFIX)objdump

led.img : start.S uart.c main.c
	$(CC) -nostdlib -g -c -o start.o start.S
	$(CC) -nostdlib -g -c -o uart.o uart.c	
	$(CC) -nostdlib -g -c -o main.o main.c	
	
	$(LD) -T imx6ull.lds -g start.o uart.o main.o -o led.elf 
	
	$(OBJCOPY) -O binary -S led.elf  led.bin
	$(OBJDUMP) -D -m arm  led.elf  > led.dis	
	mkimage -n ./tools/imximage.cfg.cfgtmp -T imximage -e 0x80100000 -d led.bin led.imx
	dd if=/dev/zero of=1k.bin bs=1024 count=1
	cat 1k.bin led.imx > led.img

clean:
	rm -f led.dis  led.bin led.elf led.imx led.img *.o
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:23:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码