串口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:设置为0000SW_MUX_CTL_PAD_UART1_RX_DATA;地址:20E_0088h;设置的位:0-3:设置为0000imx6ull中对uart的特殊要求寄存器:UART1_RX_DATA_SELECT_INPUT;地址:20E_0624h;设置的位:bit0-1:设置为11设置波特率寄存器:UARTx_UBIR和UARTx_UBMR;地址:202_00A4和202_00A8;设置数据格式寄存器:UART1_UCR2;地址:202_0084imx6ull芯片要求必须设置寄存器: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)objdumpled.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.imxdd if=/dev/zero of=1k.bin bs=1024 count=1cat 1k.bin led.imx > led.imgclean:rm -f led.dis led.bin led.elf led.imx led.img *.o
串口uart编程——基于imx6ull相关推荐
- ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)
文章目录 1.硬件知识 URAT硬件介绍 1.1.串口的硬件介绍 1.2.串口的参数 1.3.串口电平 1.4 串口内部结构 2. IMX6ULL UART操作 2.1. 串口编程步骤 2.1.1. ...
- 【Linux应用】串口UART编程
1.前言 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,应用十分广泛.UART工作原理是将数据 ...
- Esp8266 进阶之路25【高级篇】深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- Linux应用基础——串口应用编程
串口应用编程 串口介绍 扩展-- TTY体系 TTY简介 TTY系统框架 代码部分 基本配置部分 GPS模块的应用 GPS模块数据格式 GPS代码 基于平台:IMX6ULL PRO开发板 串口介绍 串 ...
- Linux串口应用编程
目录 Demo 串口应用编程介绍 终端Terminal 串口应用编程(配置.读取.写入) struct termios 结构体配置 输入模式: c_iflag 输出模式: c_oflag 控制模式: ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程
文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...
- windows 串口中断编程_万变不离其宗之单片机串口共性问题
关注.星标嵌入式客栈,精彩及时送达 [导读] 单片机开发串口是应用最为广泛的通信接口,也是最为简单的通信接口之一,但是其中的一些要点你是否明了呢?来看看本人对串口的一些总结,当然这个总结并不能面面俱到 ...
- VC串口通信编程-2
VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...
- C#中串口通信编程 收藏
C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
最新文章
- 【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!
- np.vstack()和np.hstack()
- 【TP3.2】模板 select选项采坑
- Cloudera Manager安装之利用parcels方式(在线或离线)安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(五)...
- TCP/IP详解--学习笔记(12)-TCP的超时与重传
- tableau实战系列(四十六)-如何用Tableau实现动态报表?​某咖啡店的销售数据报表(看板)​
- 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版
- SQL Server-服务器迁移之后login登录问题
- 安装 samba 记录
- ffffffffffffffffff
- Spring Boot 中实现定时任务的常用方式@Scheduled
- 电信光猫/烽火HG6543c1光猫超级密码获取改桥接模式( 中国电信浙江公司定制天翼网关3.0)
- AtCoder Beginner Contest 156 D Bouquet 失之交臂 容斥原理+二项式定理+乘法逆元+快速幂+模后负数 多余担心
- jdbc mysql 5.05_JDBC 连接 MySQL 时碰到的小坑
- 小程序学习历程(二):注册小程序测试号
- 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...
- 有没有能够在待办事项完成后标记任务已完成的每日计划APP?
- 1. Python基础之数据类型与注释
- 微信不会把关注取消事件推送给服务器,微信公众平台开发关注及取消关注事件的方法...
- 新安一高2021高考成绩查询,百师联盟2021届高三联考全国1、2卷分数线出炉