i.max6ull裸机开发之汇编点灯篇(一)

1,类比

STM32的点灯操作是如何进行的???

1,看原理图,了解所要操作哪个组的哪个IO,高电平点亮还是低电平点亮
如果用库函数来操作流程:
2,配置时钟APB1/APB2/AHB1/AHB2 ???
3,设置IO复用???
4,配置电气属性,输出方式,速率等
5,gpio初始化/使能
6,输出高低电平

仿照STM32看看i.max有何不同


一,原理图

在这里插入图片描述

在这里插入图片描述

提取信息:

1.低电平点亮
2.GPIO1_3


二,时钟

CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能 手册698-707
查找GPIO1时钟使能对应CCGR1的CG13(bit 26-27) 手册701
在这里插入图片描述
在这里插入图片描述
找到GPIO1的时钟CCM_CCGR1 bit 27-26 CG13
在这里插入图片描述

提取信息:

CCM_CCGR1 bit 27-26


三,IO复用

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00-09控制io复用 手册1568-1577
查找IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 手册1571

在这里插入图片描述
可以看到用作io口 0101
在这里插入图片描述

提取信息

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 0101


四,电气属性

IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00-09 配置io电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等 手册1787-1805
查找IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00-03 手册1793

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里一共是由八个属性,第一次了解,篇幅有点长,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提取信息

SER ------------- bit0--------------------------压摆率(io电平跳变所需时间,0跳变慢,1跳变快)
DSE ------------- bit5-3-----------------------io驱动能力(八个选项000-111驱动能力依次增大)
SPEED---------- bit7-6-----------------------输出速率(50,100,100,200四个选项–》00,01,10,11)
ODE---------------bit11------------------------开路输出(0禁止,1使能)
PkE----------------bit12------------------------状态保持器/上下拉(仅输入有效)0,禁止 1使能
PUE---------------bit13------------------------设置保持器/上下拉(仅输入有效)0不使用1使用
PUS---------------bit14-15--------------------设置上下拉电阻大小(100k下,47k上,100k上,22k上—》00 01 10 11)
HYS---------------bit16-------------------------迟滞比较器(仅输入有效)输入波形整形 使能1
上述其它位保留

以上就是i.max6ull用作io的所有电气属性

这么多位如何好计算呢???

电气属性配置技巧

打开计算器使用 位切换键盘

这里最大可以计算六十四位的
我们这里16位的就够了
在这里插入图片描述
在配置完了电气属性之后,怎么不见有输出方向???
接下来就是输出方向了


五,配置io功能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提取信息

1.DR----------数据寄存器
2.GDIR------方向寄存器
3.PSR------GPIO状态寄存器
4.ICR1/ICR2-------中断控制寄存器
6.IMR--------中断屏蔽寄存器
7.ISR------中断状态寄存器
8.EDGE_SEL---------边沿选择寄存器

相关配置以上图作为参考

我快不行了,这也太多寄存器了吧,电气属性以及配置io功能就有16个寄存器。以前都是用库函数配置,终于知道不让新手记寄存器的原因了,容易心态崩。。。。。。


到此,终于告一段落,接下来写程序,一步一步来吧

====================== 分隔线 ===================

1.配置时钟


.global _start  /* 全局标号 */

/*
 * 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
	/* 例程代码 */
	/* 1、使能所有时钟 */
	ldr r0, =0X020C4068 	/* CCGR0 */
	ldr r1, =0XFFFFFFFF  
	str r1, [r0]		
	
	ldr r0, =0X020C406C  	/* CCGR1 */
	str r1, [r0]

	ldr r0, =0X020C4070  	/* CCGR2 */
	str r1, [r0]
	
	ldr r0, =0X020C4074  	/* CCGR3 */
	str r1, [r0]
	
	ldr r0, =0X020C4078  	/* CCGR4 */
	str r1, [r0]
	
	ldr r0, =0X020C407C  	/* CCGR5 */
	str r1, [r0]
	
	ldr r0, =0X020C4080  	/* CCGR6 */
	str r1, [r0]

正点原子

参考正点原子的时钟配置是打开了所有外设的时钟,实际上只需要设置CCGR1的bit 27-26
这里我把CCGR1的所有时钟打开吧

.global _start  /* 全局标号 */

_start:

ldr r0, =0X020C406C  	/* CCGR1 */
ldr r1, =0XFFFFFFFF  
str r1, [r0]

2.设置GPIO复用

/* 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.电气属性

/* 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, =0X10B0
    str r1,[r0]

4.配置io功能

这里的寄存器比较多,有八个,但是这里输出用到的不多,只有方向寄存器
在这里插入图片描述

/* 4、设置GPIO1_IO03为输出 */
    ldr r0, =0X0209C004	/*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008		
    str r1,[r0]

5.打开LED

	/* 5、打开LED0
	 * 设置GPIO1_IO03输出低电平
	 */
   ldr r0, =0X0209C000	/*寄存器GPIO1_DR */
   ldr r1, =0		
   str r1,[r0]

完整的汇编

.global _start  /* 全局标号 */

/*
 * 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
	/* 例程代码 */
	/* 1、使能 CCGR1时钟 */
	ldr r0, =0X020C406C  	/* CCGR1 */
	ldr r1, =0XFFFFFFFF  
	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, =0X10B0
    str 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 				

	

去掉注释就那么几句………………………………,看了好久,找了好久,写了好久。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值