i.MX6ULL(一) HelloWorld Led点灯
一 GPIO点灯,嵌入式的helloworld
1 何为GPIO?
GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO、UART、I2C等);该功能由CPU内外设提供,具体是什么功能由IOMUX单元(I/O复用选择器)控制。
GPIO(General Purpose Input/Output)是芯片内的外设功能模块 ,每个GPIO外设连接到了外部的I/O引脚上,和GPIO外设相连的I/O引脚(I/O引脚相较于GPIO更加远离CPU) 起着通用输入输出的功能,所以被称为 GPIO 引脚。
但是,I/O引脚不仅和GPIO外设相连,还可以和芯片内部其它外设相连,比如和UART、IIC、SPI等外设相连作为通信外设的接口引脚,和定时器相连作为PWM输出引脚,等等。
2 嵌入式设备访问通用规则
1 根据芯片电路手册了解设备硬件原理 及数据流走向
2 使能设备时钟相关寄存器
3 设置相关寄存器工作模式 、电器属性 (这里所谓的PAD就是指芯片内部晶圆的标号,而 GPIO只是某些PAD拥有的功能,但是PAD和GPIO的序号却不是一一对应的)
4 设置引脚数据方向 及高低电平
二 IMX6ull GPIO
1 IMX6ull GPIO介绍
IMX6ULL 的 IO 分为两类: SNVS 域的和通用的,IMX6ULL 的其它 IO 也是可以复用为 GPIO 功能
1 IMX有124个IO 。IO并非GPIO , GPIO只是IO的功能。IMX有5组GPIO。GPIO1组有32个IO,GPIO2有22个,GPIO3有29个,GPIO429个
GPIO5有12个。
2.跟STM32一样,IMX也需要开启GPIO时钟, 寄存器CCM_CCGR0~CCM_CCGR6控制着所有外设的时钟,不只有GPIO的时钟。
3 .ICR1,ICR2寄存器分别用于配置低16个GPIO和高16个GPIO的中断,为什么是16个?因为GPIO分为5组,每组最多32个GPIO .
每个GPIO占用2位, 2位用来设置这个GPIO到底是什么触发,上升沿触发,下降沿触发,高电平触发,低电平触发。
4.IMR寄存器32位,一位对应一个GPIO当对应位置1 , 这个GPIO就上下沿即双边沿触发中断,这个设置覆盖ICR1和ICR2.
2 GPIO操作流程
①、查寄存器手册,打开GPIO控制的时钟源 ,使能 GPIO 对应的时钟。
②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用
为 GPIO 功能。
③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,配置GPIO的电气特性 ,设置 IO 的上下拉、速度等等。
④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使
用中断、默认输出电平等。
1 查看原理图
首先根据 底板电路原理图 查看led位置对应芯片引脚 查找寄存器符号标记 LED0 /GPIO3
2 使能时钟 CCM
Clock Tree CLOCKS
IMX6ull时钟频率有多种 分频原因 使能GPIO对应的时钟才能让GPIO正常工作。查找 IMX6ull参考手册 (选最大的) 找到 GPIO_3 时钟寄存器,
并使能它。
时钟有4种模式,这里需要停止模式外,所有模式都保持工作,即11
寄存器地址为: 基地址 + 偏移
先查阅手册,找到GPIO的时钟隶属于哪一组;GPIO CLOCKS
Clock章节寻找对应的clock name:IPG_CLK_S 五组GPIO对应 CCGRX
GPIO1时钟控制寄存器为CCGR1
地址为 0x020C 406C
寄存器设置遵循不影响其它位通过位运算只修改操作位
3、配置GPIO复用
大部分功能强大的芯片,GPIO通常都不是作为普通的IO使用,一个GPIO有许多可选(复用)的功能,想要让GPIO作为普通IO使用,就需要配置对应的复用寄存器,选择为普通GPIO的功能。查看IX6MULL芯片的参考手册,找到对应的复用配置寄存器。
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0x20E0068
设置复用模式 寄存器后四位 = 0101 =5
4、配置GPIO的电气特性
设置 GPIO的基本属性,如方向(input/output)、状态(浮空、开漏、推挽、上下拉等)、速率(50Mbps,100Mpbs、200Mbps等)。
控制LED亮灭,需要控制电平,所以需要配置为输出模式,简单的灯亮灭对速率没有特别要求。状态希望默认是熄灭的状态,所以初始化的时候,可以配置为上拉,即默认输出高电平的状态,根据原理图分析可知LED0为高电平,LED熄灭。
对应寄存器
此寄存器对应的功能选项较多 根据实际需求配置
/* 3、配置GPIO1_IO03的IO属性 *bit 16:0 HYS关闭*bit [15:14]: 00 默认下拉*bit [13]: 0 kepper功能*bit [12]: 1 pull/keeper使能*bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度100Mhz*bit [5:3]: 110 R0/6驱动能力*bit [0]: 0 低转换率*/ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */ldr r1, =0X10B0str r1,[r0]
5 设置GPIO输出方向 GPIOX_DR
1 设置输出方向
/* 4、设置GPIO1_IO03为输出 */ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */ldr r1, =0X0000008 str r1,[r0]
2 设置引脚电平点灯
/* 5、打开LED0* 设置GPIO1_IO03输出低电平*/ldr r0, =0X0209C000 /*寄存器GPIO1_DR */ldr r1, =0 str r1,[r0]
三 编译及执行
1 汇编代码(一般c开发 汇编设置C语言执行环境)
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 左忠凯
版本 : V1.0
描述 : 裸机实验1 汇编点灯使用汇编来点亮开发板上的LED灯,学习和掌握如何用汇编语言来完成对I.MX6U处理器的GPIO初始化和控制。
其他 : 无
论坛 : www.wtmembed.com
日志 : 初版V1.0 2019/1/3 左忠凯创建
**************************************************************/.global _start /* 全局标号 *//** 描述: _start函数,程序从此函数开始执行此函数完成时钟使能、* GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。*/
_start:/* 例程代码 *//* 1、使能时钟 */ldr r0, =0X020C406C /* CCGR1 */str r1, [r0]/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */ldr r0, =0X020E0068 /* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */ldr r1, =0X5 /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */str r1,[r0]/* 3、配置GPIO1_IO03的IO属性 *bit 16:0 HYS关闭*bit [15:14]: 00 默认下拉*bit [13]: 0 kepper功能*bit [12]: 1 pull/keeper使能*bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度100Mhz*bit [5:3]: 110 R0/6驱动能力*bit [0]: 0 低转换率*/ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */ldr r1, =0X10B0str r1,[r0]/* 4、设置GPIO1_IO03为输出 */ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */ldr r1, =0X0000008 str r1,[r0]/* 5、打开LED0* 设置GPIO1_IO03输出低电平*/ldr r0, =0X0209C000 /*寄存器GPIO1_DR */ldr r1, =0 str r1,[r0]/** 描述: loop死循环*/
loop:b loop
2 编译
1 先逐步编译
1 arm-linux-gnueabihf-gcc -g -c led.s -o led.o
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些 调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文 件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。
2 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
烧写到 SD 卡中 bin文件 自动执行上电以后 I.MX6U 的内部 boot rom 程序会将 可执行文件拷贝到链接地址处 之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其 链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址 (这是正点原子内部设计)(当然我们可以连接到其它地方............? )
led.elf 文件也不是我们最终烧写到 SD 卡中的可执行文件,我们要烧写的.bin 文件,因此还 需要将 led.elf 文件转换为.bin 文件,这里我们就需要用到 arm-linux-gnueabihf-objcopy 这个工具 了。
3 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
“-O”选项指定以什么格式输出
2 简化编译 Makefile
led.bin:led.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:rm -rf *.o led.bin led.elf led.dis
通用模板
CC=arm-linux-gnueabihf-gcc
LD=arm-linux-gnueabihf-ld
OBJCOPY=arm-linux-gnueabihf-objcopy
OBJDUMP=arm-linux-gnueabihf-objdumpASSEMBLER=$(wildcard *.s)
SRC=$(wildcard *.c)
OBJ=$(patsubst %.s, %.o, $(ASSEMBLER)) $(patsubst %.c, %.o, $(SRC))
INCLUDE=.
CFLAG=-Wall -nostdlib
TARGET=led.binall: $(TARGET)$(TARGET): $(OBJ)$(LD) -Ttext 0x87800000 $^ -o led.elf$(OBJCOPY) -O binary -S led.elf $@$(OBJDUMP) -D -m arm led.elf > led.dis%.o : %.s$(CC) $(CFLAG) -c $< -o $@%.o : %.c$(CC) $(CFLAG) -c $< -o $@ -I$(INCLUDE).PHONY: cleanclean:rm -f $(OBJ)rm -f $(TARGET)rm -f led.elf led.dis
3 烧写
IMx6ull 内部 ROM 96K不对用户开放 ,但支持外置Flash 及 SD卡 启动 ,SD卡烧写位置NXP有详细规定烧写步骤
烧写工具 imxdownload
烧写命令
./imxdownload <bin file> <sdcard>
./imxdownload led.bin /dev/sdd (取决于sd卡挂载位置)
烧写完成以后会在当前工程目录下生成一个 load.imx 的文件
load.imx 这个文件就是软件 imxdownload 根据 NXP 官方启动方式介绍的内容,在 led.bin 文 件前面添加了一些数据头以后生成的。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而非 led.bin。
4 设置拨 码开关为 SD 卡启动,
接下来就是将 SD 卡插到开发板的 SD 卡槽中,然后设置拨 码开关为 SD 卡启动
i.MX6ULL(一) HelloWorld Led点灯相关推荐
- STM32F4的LED点灯
文章目录 前言 一.使用到的运算符 二.寄存器相关 1.寄存器地址 2.寄存器定义过程 三.GPIO端口位相关 四.GPIO端口的输出功能的配置步骤及其涉及到的寄存器 五.点灯 前言 单片机开发第一站 ...
- Xilinx ISE系列教程(2):LED点灯工程、仿真、bit下载和mcs固化
文章目录 @[toc] 1. 创建工程目录 2. 新建ISE工程 3. 新建verilog源文件 4. 新建testbench仿真文件 5. ISim功能仿真 6. 管脚分配和时钟约束 7. bit文 ...
- 嵌入式固件开发之二——直接操作STM32寄存器的LED点灯测试程序和仿真
2 直接操作STM32寄存器的LED点灯测试程序 2.1 创建并编译工程 双击桌面上的"Keil uVision5"图标,启动MDK. 点击"Project"- ...
- ATmega16开发板教程(1)——LED点灯
2.LED点灯 作为通用数字IO使用时,AVR单片机的IO具备读.写.修改功能.每个端口具有3个寄存器:DDRx.PORTx.PINx. DDRx:1-输出,0-输入.当配置为输入时,PORTx=1 ...
- 【基于zynq的卷积神经网络加速器设计】(一)熟悉vivado和fpga开发流程:使用Vivado硬件调试烧写hello-world led闪烁程序实现及vivado软件仿真
HIGHLIGHT: vivado设计流程: note: 分析与综合 和 约束输入 可以调换顺序 [基于zynq的卷积神经网络加速器设计](一)熟悉vivado和fpga开发流程:使用Vivado硬件 ...
- 史上最全的LED点灯程序,你都掌握了吗?
摘要:你点亮过多少板子的LED灯呢?有很多小伙伴留言说讲一下STM32.FPGA.Liunx他们之间有什么不同.不同点很多,口说无凭,今天就来点亮一下STM32.FPGA和Liunx板子的LED灯,大 ...
- 51单片机LED点灯实验(闪烁,点亮,流水灯)
led点亮 工作原理 如图,二极管阳极连接电阻,二极管阴极连接单片机引脚.D0对应P20,D1对应P21,,,,,,,都通过P2孔进行控制. 二极管: 电源正极连接到二极管阳极,负极连接到阴极,二极管 ...
- 09.13 LED点灯
gpio.h #ifndef __GPIO_H__ #define __GPIO_H__//1.RCC寄存器封装,用宏定义封装 #define RCC_AHB4_ENSETR (*(volatile ...
- S5P4418裸机开发(二):LED点灯
板子型号:友善之臂Smart4418 板子原理图:Smart-1608 S5P4418芯片手册:Pi2_SOC_DS_0.1.pdf 查看原理图: PDF中搜LED: 以LED1为例,连接引脚是W24 ...
最新文章
- 大数据将改变信息生命周期管理
- Java_01_环境变量的配置
- 计算机二级通app打不开,计算机二级通app
- C和指针之数组和函数部分总结
- Java串口通信详解(转)
- 五分钟读懂UML类图(转)
- php状态机,有限状态机FSM的原理与GO的实现
- iOS开发之在地图上绘制出你运行的轨迹
- 2012考研英语--前辈的高分复习经验
- 个人学习笔记:路由交换学习思路
- MySQL数据库面试题(2022最新版)
- 『GDAL』读写TIFF文件
- 基于opengl的2d机器人双人格斗游戏
- 十余种无限流量卡大对比,这一种的最实惠!
- python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
- pt1000和pt100_全面的8pt网格指南
- 导出excel此单元格中的数字为文本格式,或者其前面有撇号
- 毕业设计:基于java的小区物业信息管理系统的设计与实现(1)
- 数据事务及ACID特性、事务回滚
- 网易(weather)天气预报接口
热门文章
- Tr0ll3 vulnhub靶场 (scp)
- 安徽大学计算机考研试题,安徽大学计算机考研复试题
- JavaScript简单点击切换效果——轮播图
- Docker容器搭建 Nexus3 私服
- 采用TurboMail保证企业邮件系统的安全
- Deformable DETR环境配置和应用
- 19年复旦计算机专硕报录比,2019复旦大学计算机学硕考研招生人数及历年报录比...
- “五一”拼病假旅游丢工作,小心“拼假嗨一时,失业泪满襟”
- Python像素点图像处理
- 24届银行秋季招聘岗位