一、IMX6ULL啟動代碼
.global _start_start:ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, =_svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12 //irqmsr cpsr, r0ldr sp, =0x86000000 //起始地址80000000,ram大小為512mb(20000000) 80000000~A0000000-1mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F //systemmsr cpsr, r0 ldr sp, =0x84000000 //給irq分配的棧指針空間
二、點燈的步驟
????????????????1)初始化時鐘
? ? ? ? ? ? ? ? 2)設置引腳功能復用(GPIO)
? ? ? ? ? ? ? ? 3)引腳電氣屬性(功率、電阻)
? ? ? ? ? ? ? ? 4)設置外設引腳的輸入輸出方向
? ? ? ? ? ? ? ? 5)設置數據寄存器拉低/拉高電平
三、初始化系統時鐘
ARM內核為了低功耗,剛開始是全部關閉(通過cg門)
把這七個寄存器全部打開,值全部設置為默認值,初始化系統時鐘
四、功能復用
??
????????設置為gpio1
五、電氣屬性
????????默認值就行,因為是輸出
???
? ? ? 六、外設引腳GDRI
? ? ? ? ? ? ? ? 設置輸入輸出
七、數據寄存器DR
?八、點燈代碼
????????1.代碼結構
bsp為各種.c.h文件,im6ull為內核文件,obj是生成文件的保存路徑,project是主函數以及啟動文件
2.bsp
? ? ? ? 1)led.c
#include "led.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"void init_led(void)
{IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);GPIO1->GDIR |= (1 << 3);
}void led_on(void)
{GPIO1->DR &= ~(1 << 3);
}void led_off(void)
{GPIO1->DR |= (1 << 3);
}void led_nor(void)
{GPIO1->DR ^= (1 << 3);
}
? ? ? ? 2)led.h
#ifndef _LED_H_
#define _LED_H_extern void init_led(void);
extern void led_on(void);
extern void led_off(void);
extern void led_nor(void);#endif
3.project
? ? ? ? 1)main.c
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "led.h"void enable_clocks(void)
{CCM->CCGR0 = 0xFFFFFFFF;CCM->CCGR1 = 0xFFFFFFFF;CCM->CCGR2 = 0xFFFFFFFF;CCM->CCGR3 = 0xFFFFFFFF; CCM->CCGR4 = 0xFFFFFFFF;CCM->CCGR5 = 0xFFFFFFFF;CCM->CCGR6 = 0xFFFFFFFF;
}void delay(unsigned int n)
{while(n--);
}int main(void)
{enable_clocks();init_led();while(1){led_nor();delay(0xFFFFF);}return 0;
}
? ? ? ? 2)start.S
.global _start_start:ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, =_svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12 //irqmsr cpsr, r0ldr sp, =0x80600000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F //systemmsr cpsr, r0 ldr sp, =0x80400000bl _bss_clearb main_bss_clear:ldr r0, =__bss_startldr r2, =__bss_end
loop:mov r1, #0str r1, [r0]add r0, r0, #4cmp r0, r2blt loopbx lrfinished:b finished
4.Makefile
target = ledcross_compiler = arm-linux-gnueabihf-cc = $(cross_compiler)gcc
ld = $(cross_compiler)ld
objcopy = $(cross_compiler)objcopy
objdump = $(cross_compiler)objdumpincdirs = bsp imx6ull
srcdirs = bsp projectinclude = $(patsubst %, -I%, $(incdirs))cfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))
sfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S))cfilenodir = $(notdir $(cfiles))
sfilenodir = $(notdir $(sfiles))cobjs = $(patsubst %, obj/%, $(cfilenodir:.c=.o))
sobjs = $(patsubst %, obj/%, $(sfilenodir:.S=.o))objs = $(cobjs) $(sobjs)VPATH = $(srcdirs)$(target).bin : $(objs)$(ld) -Timx6ull.lds -o$(target).elf $^$(objcopy) -O binary -S -g $(target).elf $@$(objdump) -D $(target).elf > $(target).dis$(sobjs) : obj/%.o : %.S@mkdir -p obj$(cc) -Wall -nostdlib -c $(include) -o $@ $<$(cobjs) : obj/%.o : %.c@mkdir -p obj $(cc) -Wall -nostdlib -c $(include) -o $@ $<.PHONY : clean
clean:rm -rf $(objs) $(target).elf $(target).bin $(target).dis