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相关推荐

  1. ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)

    文章目录 1.硬件知识 URAT硬件介绍 1.1.串口的硬件介绍 1.2.串口的参数 1.3.串口电平 1.4 串口内部结构 2. IMX6ULL UART操作 2.1. 串口编程步骤 2.1.1. ...

  2. 【Linux应用】串口UART编程

    1.前言 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,应用十分广泛.UART工作原理是将数据 ...

  3. Esp8266 进阶之路25【高级篇】深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  4. Linux应用基础——串口应用编程

    串口应用编程 串口介绍 扩展-- TTY体系 TTY简介 TTY系统框架 代码部分 基本配置部分 GPS模块的应用 GPS模块数据格式 GPS代码 基于平台:IMX6ULL PRO开发板 串口介绍 串 ...

  5. Linux串口应用编程

    目录 Demo 串口应用编程介绍 终端Terminal 串口应用编程(配置.读取.写入) struct termios 结构体配置 输入模式: c_iflag 输出模式: c_oflag 控制模式: ...

  6. 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程

    文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...

  7. windows 串口中断编程_万变不离其宗之单片机串口共性问题

    关注.星标嵌入式客栈,精彩及时送达 [导读] 单片机开发串口是应用最为广泛的通信接口,也是最为简单的通信接口之一,但是其中的一些要点你是否明了呢?来看看本人对串口的一些总结,当然这个总结并不能面面俱到 ...

  8. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  9. C#中串口通信编程 收藏

    C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...

  10. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

最新文章

  1. 【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!
  2. np.vstack()和np.hstack()
  3. 【TP3.2】模板 select选项采坑
  4. Cloudera Manager安装之利用parcels方式(在线或离线)安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(五)...
  5. TCP/IP详解--学习笔记(12)-TCP的超时与重传
  6. tableau实战系列(四十六)-如何用Tableau实现动态报表?​某咖啡店的销售数据报表(看板)​
  7. 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版
  8. SQL Server-服务器迁移之后login登录问题
  9. 安装 samba 记录
  10. ffffffffffffffffff
  11. Spring Boot 中实现定时任务的常用方式@Scheduled
  12. 电信光猫/烽火HG6543c1光猫超级密码获取改桥接模式( 中国电信浙江公司定制天翼网关3.0)
  13. AtCoder Beginner Contest 156 D Bouquet 失之交臂 容斥原理+二项式定理+乘法逆元+快速幂+模后负数 多余担心
  14. jdbc mysql 5.05_JDBC 连接 MySQL 时碰到的小坑
  15. 小程序学习历程(二):注册小程序测试号
  16. 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...
  17. 有没有能够在待办事项完成后标记任务已完成的每日计划APP?
  18. 1. Python基础之数据类型与注释
  19. 微信不会把关注取消事件推送给服务器,微信公众平台开发关注及取消关注事件的方法...
  20. 新安一高2021高考成绩查询,百师联盟2021届高三联考全国1、2卷分数线出炉

热门文章

  1. Sublime好看的字体
  2. 企业为什么需要一套固定资产管理系统
  3. 电子商务概论【0351】
  4. handlersocket mysql_[原创]MongoDB、HandlerSocket和MySQL性能测试及其结果分析
  5. Ubuntu 的ADSL设置(转)
  6. vue和echarts实现地图航线
  7. 如何给linux添加新硬盘(转)
  8. asp解决“另一个SqlParameterCollection中已包含SqlParameter”的方法
  9. 数字证书国产化的趋势
  10. 扫盲篇:数字签名、数字证书、域名劫持、域名欺骗