I.MX6U开发板:LED C语言驱动实验

一、c语言运行环境构建

1、设置处理器模式

设置6ULL处于SVC模式下。设置CPSR寄存器的bit4 - 0为10011(0x13)。读写状态寄存器,需要用到MRS和MSR指令。MRS将CPSR寄存器数据读出到通用寄存器里,MSR指令将通用寄存器的值写入CPSR寄存器里面去。

2、设置SP指针

Sp可以指向内部RAM,也可以指向DDR,我们将其指向DDR。Sp设置到哪里?512MB的范围0x80000000 - 0x9FFFFFFF。栈大小,0x200000 = 2MB。处理器栈增长模式,对于A7而言是向下增长的。

3、跳转到c语言

使用b指令,跳转到c语言函数,比如main函数

二、软件编写

1、汇编文件

.global _start

_start:
        /*设置处理器进入SVC模式 */
        mrs r0, cpsr    /*读取cpsr到r0 */
        bic r0, r0, #0x1f       /*清除cpsr的bit4到0 */
        orr r0, r0, #0x13       /* 修改SVC模式数据*/
        msr cpsr, r0    /* 设置为SVC模式*/

        /*设置SP指针 */
        ldr sp, =0x80200000
        b home  /*跳转到c语言main */

2、h文件

#ifndef __MAIN_H
#define __MAIN_H

 /*定义要使用的寄存器*/
#define CCM_CCGR0                       *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1                       *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2                       *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3                       *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4                       *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5                       *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6                       *((volatile unsigned int *)0X020C4080)

/*IOMUX相关寄存器地址*/
#define SW_MUX_GPIO_IO03    *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO_IO03     *((volatile unsigned int *)0X020E02F4)

/*设置GPIO1相关寄存器地址*/
#define GPIO1_DR                           *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR                       *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR                         *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1                        *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2                        *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR                          *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR                           *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL            *((volatile unsigned int *)0X0209C01C)

#endif 

3、c文件

#include "sys.h"


/*使能外设时钟*/
void clk_enable(void)
{
        CCM_CCGR0 = 0XFFFFFFFF;
        CCM_CCGR1 = 0XFFFFFFFF;
        CCM_CCGR2 = 0XFFFFFFFF;
        CCM_CCGR3 = 0XFFFFFFFF;
        CCM_CCGR4 = 0XFFFFFFFF;
        CCM_CCGR5 = 0XFFFFFFFF;
        CCM_CCGR6 = 0XFFFFFFFF;
}
/*初始化LED*/
void led_init(void)
{
        SW_MUX_GPIO_IO03 = 0X5;         /*复用为GPIO1—IO03*/
        SW_PAD_GPIO_IO03 = 0X10B0;  /*设置电气属性*/

        GPIO1_GDIR = 0X8;                            /*设置为输出*/
        GPIO1_DR = 0X0;                                 /*打开LED灯*/
}
void delay_short(int n)
{
        while (n--);
}
void delay_ms(int n)
{
        while (n--)
        {
                delay_short(0x7ff);
        }
}
void home()
{
        clk_enable();
        led_init();
        while(1)
        {
                GPIO1_DR &= ~(1<<3);
                delay_ms(500);
                GPIO1_DR |= (1<<3);
                delay_ms(500);
        }
}

代码效果为LED闪烁

易错点:
1、注意虚拟机的usb2.0与usb3.0设置
2、创建文件创建不要创建在vscode工作区内(不然编译出错)
3、在、dev/sd*这个文件目录下,找sd卡目录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值