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
去掉注释就那么几句………………………………,看了好久,找了好久,写了好久。