一、处理器模式的设置

Cortex-A 处理器有6种运行模式,当前实验需要将模式设置为SVC超级管理员模式,从寄存器设置中可以看到CPSR的M【4:0】控制着处理器的运行模式。因此可以将CPSR【4:0】设置为10011即为SVC模式。

二、SP指针的设置

Sp可以指向内部RAM,也可以指向DDR,在此实验中我们将指向DDR。I.MX6U-ALPHA 开发板上的 DDR3 地 址 范 围 是0X80000000~0XA0000000(512MB),也有可能是256MB的,但是其 DDR3 起始地址是 0X80000000。由于 Cortex-A7 的堆栈是向下增长的,所以将 SP 指针设置为 0X80200000。因此 SVC 模式的栈大小 0X80200000-0X80000000=0X200000=2MB,2MB 的栈空间已经很大了。最后就是跳转到main函数。

三、start.S文件代码如下

.global _start_start:/*设置处理器进入SVC模式 */mrs r0, cpsr   /*读取cpsr到r0 */bic r0, r0, #0x1f  /*清除cpsr的bit4:0*/orr r0, r0, #0x13  /*使用SVC模式 */msr cpsr, r0       /*将r0写入到cpsr *//*设置SP指针 */ldr sp, =0x80200000b main             /*跳转到C语言main函数 */

四、C语言代码的编写

C代码主要由main.c和main.h两部分组成,main.h主要定义寄存器地址,代码如下:

#ifndef __MAIN_H
#define __MAIN_H/*定义要使用的寄存器*/
#define CCCM_CCGR0 *((volatile unsigned int*)0x020c4068)
#define CCCM_CCGR1 *((volatile unsigned int*)0x020c406c)
#define CCCM_CCGR2 *((volatile unsigned int*)0x020c4070)
#define CCCM_CCGR3 *((volatile unsigned int*)0x020c4074)
#define CCCM_CCGR4 *((volatile unsigned int*)0x020c4078)
#define CCCM_CCGR5 *((volatile unsigned int*)0x020c407c)
#define CCCM_CCGR6 *((volatile unsigned int*)0x020c4080)#define SW_MUX_GPIO1_IO03 *((volatile unsigned int*)0x020e0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int*)0x020e02f4)#define GPIO1_GDIR *((volatile unsigned int*)0x0209c004)
#define GPIO1_DR *((volatile unsigned int*)0x0209c000)
#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 // !__MAIN_H

接下来就是main.c文件的编写,该文件是正式实现LED灯的闪烁,其代码如下:

#include "main.h"/*使能外设时钟*/
void clk_enable(void)
{CCCM_CCGR0 = 0xffffffff;CCCM_CCGR1 = 0xffffffff;CCCM_CCGR2 = 0xffffffff;CCCM_CCGR3 = 0xffffffff;CCCM_CCGR4 = 0xffffffff;CCCM_CCGR5 = 0xffffffff;CCCM_CCGR6 = 0xffffffff;
}/*初始化LED*/
void led_init(void)
{SW_MUX_GPIO1_IO03 = 0x5;SW_PAD_GPIO1_IO03 = 0x10b0;/*GPIO初始化*/GPIO1_GDIR = 0x8; /*设置为输出*/GPIO1_DR = 0x0;   /*打开led灯*/
}void delayshort(volatile unsigned int n)
{while(n--){}
}/*延时,一次循环大概是1ms 在主频396Mhz*n:延时ms数*/
void delay(volatile unsigned int n)
{while(n--){delayshort(0x7ff);}
}/*打开led灯*/
void led_on(void)
{GPIO1_DR &= ~(1<<3); /*bit3清0*/
}/*关闭led灯*/
void led_off(void)
{GPIO1_DR |= (1<<3); /*bit3置1*/
}int main(void)
{clk_enable();led_init();/*初始化LED*//*设置LED闪烁*/while(1){led_on();delay(1000);led_off();delay(1000);}return 0;
}

五、编写Makefile

objs = main.o start.oledc.bin : $(objs)arm-linux-gnueabihf-ld -Timx6u.lds $^ -o ledc.elfarm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis%.o : %.carm-linux-gnueabihf-gcc -Wall -nostdlib -O2 -c -o $@ $<%.o : %.Sarm-linux-gnueabihf-gcc -Wall -nostdlib -O2 -c -o $@ $<clean:rm -rf *.o ledc.bin ledc,elf ledc.dis

链接脚本的编写,主要是将我们编译出来的代码块链接到指定的地址,一般编译的代码块包含 text、data、bss 和 rodata 这四个段。其代码如下:

SECTIONS{. = 0x87800000;.text :{start.o*(.text)}.rodate ALIGN(4) : {*(.rodate*)}.date ALIGN(4) : {*(.date)}__bss_start=.;.bss ALIGN(4) : {*(.bss) *(COMMON)}__bss_end=.;
}

完成以上工作后即可按照之前的步骤进行烧写验证。

Linux开发板C语言实现LED闪烁相关推荐

  1. 学习笔记(01):巫妖王51单片机开发板配套视频课程-LED闪烁和流水灯效果

    立即学习:https://edu.csdn.net/course/play/6735/133119?utm_source=blogtoedu 2020-5-14 keil LED 闪烁,流水灯

  2. STM32开发笔记82: 使用C++语言控制LED闪烁

    单片机型号:STM32L053R8T6 本文介绍应用C++语言控制LED闪烁的方法. 先看电路图,单片机PB12引脚控制LED的亮灭,当PB12引脚给出低电平LED亮,当PB12引脚给出高电平LED灭 ...

  3. 基于正点原子Linux开发板(ALIENTEK I.MX6U ALPHA V2.2)的个人自学记录

    基于正点原子Linux开发板(ALIENTEK I.MX6U ALPHA V2.2)的个人自学记录 硬件环境 正点原子Linux开发板(ALIENTEK I.MX6U ALPHA V2.2) 底板+核 ...

  4. linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)

    大家好,我是兔子. 是一个嵌入式软硬件工程师. 正在从单片机开发转岗Linux开发. 这次教大家如何在Linux开发板上运行可执行文件. 简单起见,不涉及到硬件.直接和教程2一样,能在PC虚拟机上运行 ...

  5. 移植中文TTS(ekho)到ARM linux开发板

    移植ekho到arm linux,实现将中文转换为.wav格式的语音文件. 移植开源库libsndfile到arm linux开发板 1. 下载压缩源码包libsndfile-1.0.28.tar.g ...

  6. 使用QT程序控制Linux开发板上的继电器(一)

    `使用QT程序控制Linux开发板上的继电器(一)` 测试平台介绍 测试系统接线 编写PlatformIO驱动程序 修改设备树 烧录设备树 Platform字符设备驱动设备框架 完善驱动框架 编写测试 ...

  7. 【f1c200s/f1c100s】mangopi自制linux开发板驱动适配进度(PCB、代码开源)

    [f1c200s/f1c100s]mangopi自制linux开发板驱动适配进度(PCB.代码开源) 目前进度 过程记录博客 目前进度 目前自制的mangopi设备驱动适配已完成部分包含: 基于扫描的 ...

  8. 意法半导体STM32MP157A MPU加持,米尔科技首款ST Linux开发板MYD-YA157C评测

    ST公司去年推出了MPU系列芯片,MPU系列不同于以往产品,它既包含有ARM公司Cortex M 单片机核心,也包含有ARM公司Cortex A 应用处理器核心,以期将STM32单片机产品优势扩展到更 ...

  9. 【嵌入式Linux应用】初步移植MQTT到Ubuntu和Linux开发板

    1. 概述 ​ 本篇主要是记录将MQTT移植安装到百问网STM32MP157开发板上,并且是跑一下MQTT的一个例程来验证,要完成本次移植安装,必须要保证电脑和开发板都能上网.. 2. 软件平台 ​ ...

最新文章

  1. Python逻辑运算符 and ,or not 的理解
  2. TCP-Z V2.6.2 Build 20090409 (半开连接数监控与破解)
  3. Python学习教程(Python学习路线):Python3之递归函数简单示例
  4. 【GAN优化】详解GAN中的一致优化问题
  5. zabbix 2.2自动安装脚本
  6. 腾讯地图 添加事件和移除事件
  7. Spring Boot文档阅读笔记-使用Spring Data JPA连接多源数据库(MySQL和Oracle)
  8. 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数
  9. 微课|中学生可以这样学Python(3.2节):双分支选择结构
  10. android编辑配置文件,如何在android studio中修改配置文件
  11. 给属性赋值_赋值方法:虚拟变量 Dummy Coding
  12. MyBatis学习(一):简单的运行
  13. BZOJ - 2783 树
  14. 关于openstack部分计算节点无法实现热迁移问题描述
  15. 屏幕镜像显示无法连接服务器,苹果屏幕镜像连接失败原因
  16. 吴晓慧讲述:“随手记安全吗”网贷平台“出清”利好行业发展
  17. larval模板引擎
  18. 解绑数字身份,解锁新玩法与构建方式(下)
  19. 【Hive】left semi join(exists、in)和 left join 区别
  20. 爱国html源码,鼠标点击网页爱国富强民主特效(附代码)

热门文章

  1. Db2应用状态为uow waiting,但快照显示却在不停地Fetch
  2. html实现弹窗,html实现弹窗的实例
  3. java 设置日期的格式_java设置日期格式
  4. mcrypt java_使用openssl解密mcrypt
  5. Golang 实现 RTP
  6. 《音视频直播------总体概述》
  7. windows未服务器未响应,windows不服务器未响应
  8. 汕大计算机科学与技术学院,我的选择:汕头大学
  9. 4、电场的概念及点电荷电场强度的计算
  10. 如何快速生成icns格式的Mac图标