1、汇编部分实验程序编写
1)配置该芯片为特权模式,初始化bss,设置sp指针
.global _start
.global _bss_start
_bss_start:
.word __bss_start
.global _bss_endt
_bss_endt:
.word __bss_end
_start:
/*设置为特权模式*/
mrs r0, cpsr
bic r0, r0, #0x1f/*取 cpsr 到 r0*/
orr r0, r0, #0x13/*设置为特权模式 或运算 r0 = r0 | 0x13*/
msr cpsr , r0 /*取 r0 写入 cpsr*/
/* 清除bss段 */
ldr r0, _bss_start
ldr r1, _bss_start
mov r2, #0
bss_loop:
stmia r0! , {r2} //r2 写 入 r0 stmia 地址自增
cmp r0 , r1 /* 比较 R0 和 R1 里面的值 */
ble bss_loop /* 如果 r0 地址 小于 r1 , 继续清除 bss */
ldr sp, =0x80200000/*设置 sp指针*/
b main
2)IMX6UL相关寄存器定义
一、使能时钟,CCGR0~CCGR6这7个寄存器
控制着6ULL所有的外设时钟的使能
二、IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO0的
bit3~0设置为0101=5,这样就设置为io复用
三、将寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
设置GPIO1_IO03电气属性,包括设置压摆率,速度,驱动能力,开漏,上拉
- SRE 压摆率
- DSE 驱动能力
- SPEED 驱动速度
- ODE 开路输出
- PKE 上拉保持使能
- PUS 状态保持器
- HYS 使能迟滞比较器
3、IMX6UL-----------外设寄存器组的基地址
#define CCM_BASE (0X020C4000)
#define CCM_ANALOG_BASE (0X020C8000)
#define IOMUX_SW_MUX_BASE (0X020E0014)
#define IOMUX_SW_PAD_BASE (0X020E0204)
#define GPIO1_BASE (0x0209C000)
#define GPIO2_BASE (0x020A0000)
#define GPIO3_BASE (0x020A4000)
#define GPIO4_BASE (0x020A8000)
#define GPIO5_BASE (0x020AC000)
3、IMX6UL---------寄存器外设指针
#define CCM ((CCM_Type *)CCM_BASE)
#define CCM_ANALOG ((CCM_ANALOG_Type *)CCM_ANALOG_BASE)
#define IOMUX_SW_MUX ((IOMUX_SW_MUX_Type *)IOMUX_SW_MUX_BASE)
#define IOMUX_SW_PAD ((IOMUX_SW_PAD_Type *)IOMUX_SW_PAD_BASE)
#define GPIO1 ((GPIO_Type *)GPIO1_BASE)
#define GPIO2 ((GPIO_Type *)GPIO2_BASE)
#define GPIO3 ((GPIO_Type *)GPIO3_BASE)
#define GPIO4 ((GPIO_Type *)GPIO4_BASE)
#define GPIO5 ((GPIO_Type *)GPIO5_BASE)
4、编写主函数------------main.c
1、初始化时钟
void clk_init(){
CCM->CCGR0 = 0xffffffff;
CCM->CCGR1 = 0xffffffff;
CCM->CCGR2 = 0xffffffff;
CCM->CCGR3 = 0xffffffff;
CCM->CCGR4 = 0xffffffff;
CCM->CCGR5 = 0xffffffff;
CCM->CCGR6 = 0xffffffff;
}
2、初始化IO口
//io初始化
// SRE 压摆率
// DSE 驱动能力
// SPEED 驱动速度
// ODE 开路输出
// PKE 上拉保持使能
// PUS 状态保持器
// HYS 使能迟滞比较器
void led_init(){
IOMUX_SW_MUX->GPIO1_IO03 = 0x5;
IOMUX_SW_PAD->GPIO1_IO03 = 0x10B0;
//设置输出模式
GPIO1->GDIR = 0X0000008;
//默认高电平输出
GPIO1->DR = 0x1;
}
3、设置封装输出/输入
//输入输出封装
void led_open(){
GPIO1->DR &= ~(1<<3);
}
void led_close(){
GPIO1->DR |= (1<<3);
}
4、主函数
int main(){
clk_init();
led_init();
while(1){
led_open();
delay(1000);
led_close();
delay(1000);
}
return 0;
}
3)链接脚本
SECTIONS {
. = 0X87800000;
.text :
{
start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : { *(.data) }
__bss_start=.;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end=.;
}
4)编写Makefile
objs := start.o main.o
ld := arm-linux-gnueabihf-ld
gcc := arm-linux-gnueabihf-gcc
objcopy := arm-linux-gnueabihf-objcopy
objdump := arm-linux-gnueabihf-objdump
ledc.bin:$(objs)
$(ld) -Timx6u.lds -o ledc.elf $^
$(objcopy) -O binary -S ledc.elf $@
$(objdump) -D -m arm ledc.elf > ledc.dis
%.o:%.c
$(gcc) -Wall -nostdlib -c -O2 -o $@ $<
%.o:%.S
$(gcc) -Wall -nostdlib -c -O2 -o $@ $<
clean:
rm -rf *.o ledc.elf ledc.bin ledc.dis
5)下载到SD卡
1、运行-------------imxdownload 执行文件
2、下载成功----------下载速率不能太大----------66kb左右
3、IMAX6ULL----------开发板拨码开关---------1,7拨上面
4、重启按键
5、结果LED闪烁