linux裸机开发

Linux裸机开发与stm332开发有相同点却也有不同点

相同点:stm32跟linux开发外设都需要1.启动时钟2.配置相应外设
			  二者都可以通过直接给寄存器中写入相应的值来跑外设
不同点:stm32有非常丰富的库文件,以及一个全能的IDE(Keil)
			  linux没有对应的开发工具,也没有丰富的库文件,每个外设的开发都需要自己配	置寄存器开发

linux裸机驱动

点灯大师上线

为什么要学习Cotex-A汇编

1.用汇编初始化一些SOC外设
2.使用汇编初始化DDR,I.MX6U不需要
3.初始化SP指针,一般指向DDR,设置好C语言运行环境
自己写汇编启动文件点灯

I.MX6U初始化流程

• 1.使能时钟,CCGR0~CCGR6这七个寄存器控制着I.MX6U所有时钟,这里为了方便将其全设为1(0xFFFFFFFF)
• 2.复用IO口,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的bit3~0设置为0101=5,表示将GPIO1_IO03复用为GPIO
• 3.配置电器属性将寄存器(IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03)

第一个点灯程序(汇编)

• 启动文件编写


//开启时钟
ldr r0,=时钟寄存器地址           
ldr r1,0xFFFFFFFF        
str r1,[r0]    //同样格式循环七次,七个寄存器
//复用IO口为GPIO,给IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器低四位0101=5
ldr r0,=寄存器地址      
ldr r1,=0x5                   
str r1,[r0]
//配置电器属性(SW_MUX_GPIO1_IO03_BASE)寄存器
ldr r0,=寄存器地址                    
ldr r1,=配置模式                        
str r1,[r0]
//配置gpio方向GPIO1_GDIR
ldr r0,=寄存器地址             
ldr r1,=配置模式                  
str r1,[r0]
//输出高低电平(GPIO1_DR)
ldr r0,=寄存器地址                  
ldr r1,=0()/1()                   
str r1,[r0]

• 编译并下载程序
• 1.使用交叉编译器生成目标文件 arm-none-linux-gnueabihf-gcc -g -c led.s -o led.o
• 2.将多个目标文件连接到一起arm-none-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
• 3.将.elf文件转换成二进制执行文件.bin arm-none-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
• 3.下载到SD卡
• 使用正点原子的 imxdownload 工具(将其放在ubuntu点灯程序的文件夹里),并给予其可执行权限(chmod)
• 执行命令./imxdownload led.bin /dev/sdb(sdb是挂载的sd卡(使用ls /dev/sd*查询))
• bootload调到SD卡模式启动

调库(NXP公司SDK)

• 安装程序包(提取出fsl_common.h,fsl_iomuxc.h,NCIMX6Y2.h)做一定修改
• 自己创建一个cc.h(定义一些数据类型)
• 将clk,delay,led等驱动放入bsp
• 将main,start文件放入
• 创建Makefile
• 创建imx6ul.lds
• 使用imxdownload下载

你可能感兴趣的:(笔记,linux,单片机,stm32)