一 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输出引脚,等等。

嵌入式设备访问通用规则

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

  1. STM32F4的LED点灯

    文章目录 前言 一.使用到的运算符 二.寄存器相关 1.寄存器地址 2.寄存器定义过程 三.GPIO端口位相关 四.GPIO端口的输出功能的配置步骤及其涉及到的寄存器 五.点灯 前言 单片机开发第一站 ...

  2. Xilinx ISE系列教程(2):LED点灯工程、仿真、bit下载和mcs固化

    文章目录 @[toc] 1. 创建工程目录 2. 新建ISE工程 3. 新建verilog源文件 4. 新建testbench仿真文件 5. ISim功能仿真 6. 管脚分配和时钟约束 7. bit文 ...

  3. 嵌入式固件开发之二——直接操作STM32寄存器的LED点灯测试程序和仿真

    2 直接操作STM32寄存器的LED点灯测试程序 2.1 创建并编译工程 双击桌面上的"Keil uVision5"图标,启动MDK. 点击"Project"- ...

  4. ATmega16开发板教程(1)——LED点灯

    ​2.LED点灯 作为通用数字IO使用时,AVR单片机的IO具备读.写.修改功能.每个端口具有3个寄存器:DDRx.PORTx.PINx. DDRx:1-输出,0-输入.当配置为输入时,PORTx=1 ...

  5. 【基于zynq的卷积神经网络加速器设计】(一)熟悉vivado和fpga开发流程:使用Vivado硬件调试烧写hello-world led闪烁程序实现及vivado软件仿真

    HIGHLIGHT: vivado设计流程: note: 分析与综合 和 约束输入 可以调换顺序 [基于zynq的卷积神经网络加速器设计](一)熟悉vivado和fpga开发流程:使用Vivado硬件 ...

  6. 史上最全的LED点灯程序,你都掌握了吗?

    摘要:你点亮过多少板子的LED灯呢?有很多小伙伴留言说讲一下STM32.FPGA.Liunx他们之间有什么不同.不同点很多,口说无凭,今天就来点亮一下STM32.FPGA和Liunx板子的LED灯,大 ...

  7. 51单片机LED点灯实验(闪烁,点亮,流水灯)

    led点亮 工作原理 如图,二极管阳极连接电阻,二极管阴极连接单片机引脚.D0对应P20,D1对应P21,,,,,,,都通过P2孔进行控制. 二极管: 电源正极连接到二极管阳极,负极连接到阴极,二极管 ...

  8. 09.13 LED点灯

    gpio.h #ifndef __GPIO_H__ #define __GPIO_H__//1.RCC寄存器封装,用宏定义封装 #define RCC_AHB4_ENSETR (*(volatile ...

  9. S5P4418裸机开发(二):LED点灯

    板子型号:友善之臂Smart4418 板子原理图:Smart-1608 S5P4418芯片手册:Pi2_SOC_DS_0.1.pdf 查看原理图: PDF中搜LED: 以LED1为例,连接引脚是W24 ...

最新文章

  1. 大数据将改变信息生命周期管理
  2. Java_01_环境变量的配置
  3. 计算机二级通app打不开,计算机二级通app
  4. C和指针之数组和函数部分总结
  5. Java串口通信详解(转)
  6. 五分钟读懂UML类图(转)
  7. php状态机,有限状态机FSM的原理与GO的实现
  8. iOS开发之在地图上绘制出你运行的轨迹
  9. 2012考研英语--前辈的高分复习经验
  10. 个人学习笔记:路由交换学习思路
  11. MySQL数据库面试题(2022最新版)
  12. 『GDAL』读写TIFF文件
  13. 基于opengl的2d机器人双人格斗游戏
  14. 十余种无限流量卡大对比,这一种的最实惠!
  15. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
  16. pt1000和pt100_全面的8pt网格指南
  17. 导出excel此单元格中的数字为文本格式,或者其前面有撇号
  18. 毕业设计:基于java的小区物业信息管理系统的设计与实现(1)
  19. 数据事务及ACID特性、事务回滚
  20. 网易(weather)天气预报接口

热门文章

  1. Tr0ll3 vulnhub靶场 (scp)
  2. 安徽大学计算机考研试题,安徽大学计算机考研复试题
  3. JavaScript简单点击切换效果——轮播图
  4. Docker容器搭建 Nexus3 私服
  5. 采用TurboMail保证企业邮件系统的安全
  6. Deformable DETR环境配置和应用
  7. 19年复旦计算机专硕报录比,2019复旦大学计算机学硕考研招生人数及历年报录比...
  8. “五一”拼病假旅游丢工作,小心“拼假嗨一时,失业泪满襟”
  9. Python像素点图像处理
  10. 24届银行秋季招聘岗位