模仿 STM32 寄存器定义

 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电气属性,包括设置压摆率,速度,驱动能力,开漏,上拉

  1. SRE       压摆率  
  2. DSE       驱动能力
  3. SPEED     驱动速度
  4. ODE       开路输出
  5. PKE       上拉保持使能
  6. PUS       状态保持器
  7. 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闪烁

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值