一、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卡目录