ARM架构与编程 · 基于IMX6ULL

一、嵌入式系统硬件介绍

cpu +  RAM(内存) + FALSH  集成(flash存储设备) =  MCU/单片机

AP/ MPU

 进化之后可以外接内存和存储设备,跑复杂的操作系统,比如手机

ARM架构与编程 · 基于IMX6ULL_第1张图片

cpu一上电就会执行程序,程序存放在片内的ROM中,帮助运行SPI  flash启动程序,变量存放在RAM中

cpu发出的地址到哪里中间会经过一个内存控制器,将cpu的指令发给各种控制器,ROM、ROM  

ARM架构与编程 · 基于IMX6ULL_第2张图片

IMX6ULL 点灯

点亮LED

1、看原理图确定控制LED的引脚

2、看主芯片手册确定如何设置/控制引脚

3、写程序

ARM架构与编程 · 基于IMX6ULL_第3张图片

 控制芯片的引脚1还是0,来控制输出电压

1、将GPIO模块组使能

2、设置多路选择器IO_mux,设置gpio是连接到那个模块

3、设置GPIO口是输出还是输入

4、设置gpio输出高低电平

ARM架构与编程 · 基于IMX6ULL_第4张图片

 对引脚的操作不能影响到其他位,因为一个寄存器有很多位,每一个位都是一个引脚

直接设置寄存器 reg = 1,bit0 = 1、bit1 = 0、bit2 = 0,后面两个被强制设置为0

使用一个函数set_reg = 1,bit0 = 1、bit1 = 0、bit2 = 0 ,只有第一位起作用,其他为0的无效

gpio口清零是使用clr_reg  只有1有效

ARM架构与编程 · 基于IMX6ULL_第5张图片

 1、使能某一组GPIO

 2、选择引脚功能

3、

1、查看芯片看LED原理图,确定要操作的GPIO口

ARM架构与编程 · 基于IMX6ULL_第6张图片

2、使能

ARM架构与编程 · 基于IMX6ULL_第7张图片

 ARM架构与编程 · 基于IMX6ULL_第8张图片

ARM架构与编程 · 基于IMX6ULL_第9张图片

寄存器CCGR1里面的CG13控制GPIO1组是否使能

ARM架构与编程 · 基于IMX6ULL_第10张图片

3、设置为GPIO5_3为GPIO

ARM架构与编程 · 基于IMX6ULL_第11张图片

 GPIO模式

ARM架构与编程 · 基于IMX6ULL_第12张图片

也就是要使得这个寄存器最后三位变成101

4、设置为输出功能

 ARM架构与编程 · 基于IMX6ULL_第13张图片

ARM架构与编程 · 基于IMX6ULL_第14张图片

gpio5_3 设置为输出,就是在将改寄存器的引脚3设置为1(芯片引脚从0开始的)

绝对地址= 基地址 + 偏移地址

ARM架构与编程 · 基于IMX6ULL_第15张图片

5、设置电位为高还是低(低就是点亮,高是熄灭)

ARM架构与编程 · 基于IMX6ULL_第16张图片

o  表示高电位,1表示地电位

LED操作

怎么操作寄存器

定义一个指针,然后让指针指向寄存器,最后给指针赋值就是相当于给寄存器赋值

程序烧写
头部 + bin    也就是 imx文件

头部文件负责告诉ROM将程序读到哪里去

ARM架构与编程 · 基于IMX6ULL_第17张图片

运行流程

1、将代码烧写到板子上

2、头文件负责将告诉rom,要将emmc中的代码读到哪里去

3、运行汇编文件,start.s,设置sp,然后从下往上执行

4、运行main函数

程序


//延时函数
void delay(volatile int d)
{
	while(d--);
}

int main(void)
{
	 volatile unsigned int *pReg;//加上voliate避免编译器优化
	 
	/* 使能GPIO5: 默认使能 */

	/* 把GPIO5_3设置为GPIO功能 */
	pReg = (volatile unsigned int *)(0x02290000 + 0x14); //将右边强制类型转换为指针类型,初始化
	*pReg |= (0x5);//修改寄存器,设置为GPIO功能

	/* 把GPIO5_3设置为输出引脚 */
	pReg = (volatile unsigned int *)(0x020AC004);//孤僻o基地址是0x020AC000 ,偏移地址是4
	*pReg |= (1<<3);

	pReg = (volatile unsigned int *)(0x020AC000);//gpio5的基地址是(0x020AC000

	while (1)
	{
		/* 设置GPIO5_3输出1 */
		*pReg |= (1<<3);//寄存器第四位与1或
		delay(1000000);//延时

		/* 设置GPIO5_3输出0 */
		*pReg &= ~(1<<3);//寄存器第四位与0与
		delay(1000000);		
	}

	return 0;
}

ARM架构

cpu眼中的地址与控制器眼中的地址是不同的

ARM架构与编程 · 基于IMX6ULL_第18张图片

cpu内部有16个寄存器,R0~R12是通用寄存器,其他三个是有特殊作用的

ARM架构与编程 · 基于IMX6ULL_第19张图片

除这外,还有程序状态寄存器PSR

ARM架构与编程 · 基于IMX6ULL_第20张图片

指令集

 

第一个程序深度解析

进制

3个二进制位(三个bit)表示一个八进制位

四个二进制位(四个bit)表示一个16进制位

进制转换

八进制转二进制,就是一位八进制使用3位二进制表示

16进制转二进制,就是一位16进制使用四位二进制表示

开头标识

0b 二进制

0开头表示8进制

0x开头表示16进制

汇编_反汇编_机器码

ARM架构与编程 · 基于IMX6ULL_第21张图片

使用按键控制LED

原理图 

ARM架构与编程 · 基于IMX6ULL_第22张图片


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

int main(void)
{
    //当发现按键开关按下就开打
	 volatile unsigned int *pRegLed;//通过gpio5——3控制灯开关
	 volatile unsigned int *pRegKey;//通过gpio4-14感知按键开关的状态
	 
	/* 使能GPIO5: 默认使能 */
	/* 使能GPIO4, CCM_CCGR3, b[13:12]=0b11 */
	pRegKey = (volatile unsigned int *)(0x020C4074);//
	*pRegKey |= (3<<12);

	/* 把GPIO5_3设置为GPIO功能 */
	pRegLed = (volatile unsigned int *)(0x02290000 + 0x14);
	*pRegLed |= (0x5);

	/* 把GPIO4_14设置为GPIO功能
	 * IOMUXC_SW_MUX_CTL_PAD_NAND_CE1_B   地址:20E_0000h base + 1B0h offset = 0x020E01B0
	 */
	pRegKey = (volatile unsigned int *)(0x020E01B0);
	*pRegLed &= ~(0xf);
	*pRegLed |= (0x5);

	/* 把GPIO5_3设置为输出引脚 */
	pRegLed = (volatile unsigned int *)(0x020AC004);
	*pRegLed |= (1<<3);

	/* 把GPIO4_14设置为输入引脚 ,因为我们需要读取它的值,要是写的话就是输出引脚
	 * GPIO4_GDIR地址:0x020A8004 
	 */
	pRegKey = (volatile unsigned int *)(0x020A8004);
	*pRegLed &= ~(1<<14);//清零

	/* GPIO5_DR */
	pRegLed = (volatile unsigned int *)(0x020AC000);

	/* GPIO4_DR */
	pRegKey = (volatile unsigned int *)(0x020A8000);

	while (1)
	{
		/* 读取GPIO4_14引脚 */
		if ((*pRegKey & (1<<14)) == 0) /* 被按下 */
		{
			/* 设置GPIO5_3输出0 灯亮*/
			*pRegLed &= ~(1<<3);
		}
		else
		{		
			/* 设置GPIO5_3输出1 灯灭 */
			*pRegLed |= (1<<3);
		}
	}

	return 0;
}

串口UATR编程


1、UATR硬件介绍

作用

1、打印调试信息

2、外接模块

ARM架构与编程 · 基于IMX6ULL_第23张图片

 波特率定义了一位数据传输的时间

ARM架构与编程 · 基于IMX6ULL_第24张图片

1、数据开始传输的标志是电位为低 

2、arm将数据一位一位传输,pc机会根据之前设定的波特率确定什么时候传了一位数据,然后读取这个数据

2、UATR操作

3、UATR编程

kile_gcc_Makefile

代码重新定位

异常与中断

    

你可能感兴趣的:(linux驱动开发,物联网)