ARM day5、day6 硬件编程

news2024/10/2 9:22:29

一、硬件

fs4412  sd卡  串口线  电源  

二、根据原理图点灯

1、确定需求:

        点灯(亮 or 灭)

2、查看原理图

        2.1 外设原理图 devboard 

                查找LED2->CHG_COK(核心板)

        2.2 核心板原理图 coreboard

                查找CHG_COK->XEINT23/KP_ROW7/ALV_DBG19/GPX2_7

        2.3 看芯片手册

                GPIO控制(第六章)->查找GPX2

        2.4 筛选寄存器(概述)

        整体的配置或控制寄存器、功能相关的寄存器、不知道干嘛的寄存器

不需要的: 

 pull-up/pull-down:上拉下拉-引脚不能悬空,上拉为高电平或下拉接地为低电平
drive strength control register:驱动强度控制-输出电流大小 -- 影响灯的亮度,不影响亮灭,所以不需要GPF3DRV
补充:下电模式寄存器:power down & power off,关机/睡眠,不影响灯的亮灭,所以不需要

需要的:

2.5 写代码

GPX2CON   0x11000c40     [31:28]          0x1 ---output

代码中,需要将[31:28]4位设置为0x1(先清零后置1)

C代码:GPX2CON = (GPX2CON & (~(0xf << 28))  )   |   ((0x1)<<28  ) 

汇编代码:

GPX2DAT      0x11000c44    [7]                0x0 --低电平   0x1-高电平

//输出模式(灯亮) -- 第七位置1(GPX2_7

C代码:GPX2DAT = GPX2DAT |  (0x1 << 7)

作业:流水灯

见下方代码

三、编译环境

Makefile:

  1 all:
  2     arm-none-linux-gnueabi-gcc -fno-builtin -nostdinc -c -o start.o start.s
  3     arm-none-linux-gnueabi-gcc -fno-builtin -nostdinc -c -o main.o main.c
  4     arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o led.elf
  5     arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
  6     arm-none-linux-gnueabi-objdump -D led.elf > led.dis
  7 clean:
  8     rm -rf *.bak *.o *.elf *.dis *.bin

map.lds:

  1 /*linux下的连接脚本模板*/
  2 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件是elf格式,32位ARM指令,小端*/
  3 OUTPUT_ARCH(arm)  /*指定输出可执行文件的平台(arm平台)*/
  4 ENTRY(_start)     /*指定连接之后第一条指令的地址为_start*/
  5 SECTIONS  /*指定连接之后的代码段(.text) 数据段(.data) .bss段如何摆放*/
  6 {
  7     . = 0x40008000; /*指定链接的起始地址 从0x40008000地址开始摆放*/
  8     . = ALIGN(4);   /*指令对齐(4字节对齐)*/
  9     .text      :    /*代码段开始*/
 10     {
 11         start.o(.text)  /*0x40008000地址放start.o对应的start.s的第一条指令*/
 12         *(.text)        /* *:其他的*.o文件系统自动安排位置*/
 13     }
 14     . = ALIGN(4);
 15     .data :         /*数据段开始*/
 16     { *(.data) }    /*数据段也让系统自动分配*/
 17     . = ALIGN(4);
 18     .bss :
 19      { *(.bss) }
 20 }

map.lds解释:

1、 *表示所有.o文件的text
             如果需要先后顺序 :  
                 test.o(.text)
                 *(.text)
2、每个.o组成由text+data+bss


3、. =0x0:    //要loadbb、go的地址

start.s:

  1     .global  delay1s
  2     .text
  3     .global _start
  4 _start:
  5         b       reset                        @0x00
  6         ldr     pc,_undefined_instruction  @0x04
  7         ldr     pc,_software_interrupt
  8         ldr     pc,_prefetch_abort
  9         ldr     pc,_data_abort
 10         ldr     pc,_not_used
 11         ldr     pc,_irq
 12         ldr     pc,_fiq
 13 
 14 _undefined_instruction: .word  _undefined_instruction
 15 _software_interrupt:    .word  _software_interrupt
 16 _prefetch_abort:        .word  _prefetch_abort
 17 _data_abort:            .word  _data_abort
 18 _not_used:              .word  _not_used
 19 _irq:                   .word  _irq
 20 _fiq:                   .word  _fiq
 21 
 22 
 23 reset:
 24     ldr r0,=0x40008000      @设置异常向量表的起始地址为0x40008000
 25     mcr p15,0,r0,c12,c0,0       @ Vector Base Address Register
 26 
 27 init_stack:
 28     ldr     r0,stacktop         /*get stack top pointer*/
 29 
 30     /********svc mode stack********/
 31         mov     sp,r0
 32         sub     r0,#128*4          /*512 byte  for irq mode of stack*/
 33     /****irq mode stack**/
 34         msr     cpsr,#0xd2
 35         mov     sp,r0
 36         sub     r0,#128*4          /*512 byte  for irq mode of stack*/
 37     /***fiq mode stack***/
 38         msr     cpsr,#0xd1
 39         mov     sp,r0
 40         sub     r0,#0
 41     /***abort mode stack***/
 42         msr     cpsr,#0xd7
 43         mov     sp,r0
 44         sub     r0,#0
 45     /***undefine mode stack***/
 46         msr     cpsr,#0xdb
 47         mov     sp,r0
 48         sub     r0,#0
 49    /*** sys mode and usr mode stack ***/
 50         msr     cpsr,#0x10
 51         mov     sp,r0             /*1024 byte  for user mode of stack*/
 52 
 53         b       main
 54 
 55 delay1s:
 56      ldr      r4,=0x1ffffff
 57 delay1s_loop:
 58      sub    r4,r4,#1
 59      cmp   r4,#0         
 60      bne    delay1s_loop
 61      mov   pc,lr
 62 
 63 
 64     .align  4
 65 
 66     /****  swi_interrupt handler  ****/
 67 
 68 
 69 stacktop:    .word      stack+4*512
 70 
 71 .data
 72 
 73 stack:
 74   .space  4*512
 75 .end

main.c:

  1 //led 2 3 4 5 
  2 //led2
  3 #define GPX2CON (*(volatile unsigned int *)0x11000c40)
  4 #define GPX2DAT (*(volatile unsigned int *)0x11000c44)
  5 //led3
  6 #define GPX1CON (*(volatile unsigned int *)0x11000c20)
  7 #define GPX1DAT (*(volatile unsigned int *)0x11000c24)
  8 //led4
  9 #define GPF3CON (*(volatile unsigned int *)0x114001E0)
 10 #define GPF3DAT (*(volatile unsigned int *)0x114001E4)
 11 //led 5
 12 
 13 
 14 
 15 void mydelay(int x) //延时
 16 {   
 17     int i;
 18     while(x --){    //1ms
 19         for(i = 1000; i>0; i--);
 20     }
 21 }
 22 
 23 void GPIO_init()
 24 {
 25    GPX2CON = (GPX2CON & (~(0xf << 28))) | ((0x1)<<28);
 26    GPX1CON = (GPX1CON & (~(0xf ))) | ((0x1));
 27    GPF3CON = (GPF3CON & (~(0xf << 16))) | ((0x1) << 16);
 28    GPF3CON = (GPF3CON & (~(0xf << 20))) | ((0x1) << 20);
 29 
 30 }
 31 
 32 void led2_on()   //开灯 7位置1
 33 {
 34    GPX2DAT = GPX2DAT | (0x1 << 7);
 35 }
 36 void led2_off()  //关灯 7位置0
 37 {
 38    GPX2DAT = GPX2DAT & ~(0x1 << 7);
 39 }
 40 void led3_on()   //开灯 0位置1
 41 {
 42    GPX1DAT = GPX1DAT | (0x1);
 43 }
 44 void led3_off()  //关灯 0位置0
 45 {
 46    GPX1DAT = GPX1DAT & ~(0x1);
 47 }
 48 void led4_on()   //开灯 4位置1
 49 {
 50    GPF3DAT = GPF3DAT | (0x1 << 4);
 51 }
 52 void led4_off()  //关灯 4位置0
 53 {
 54    GPF3DAT = GPF3DAT & ~(0x1 << 4);
 55 }
 56 void led5_on()   //开灯 5位置1
 57 {
 58    GPF3DAT = GPF3DAT | (0x1 << 5);
 59 }
 60 void led5_off()  //关灯 4位置0
 61 {
 62    GPF3DAT = GPF3DAT & ~(0x1 << 5);
 63 }
 64 
 65 int main()
 66 {
 67     GPIO_init();//初始化
 68     while(1)    //循环
 69     {
 70         led2_on();
 71         mydelay(500);
 72         led2_off();
 73         mydelay(500);
 74         led3_on();
 75         mydelay(500);
 76         led3_off();
 77         mydelay(500);
 78         led4_on();
 79         mydelay(500);
 80         led4_off();
 81         mydelay(500);
 82         led5_on();
 83         mydelay(500);
 84         led5_off();
 85     }
 86     return 0;
 87 }

编译:

打开超级终端  名字随便输  只需配置波特兰和硬件为115200和无 

1.打开板子的开关,三秒内按回车

2.loadb 40008000    //地址见编译环境

3.发送文件 -- 打开windows下的.bin二进制文件

4.go 40008000

四、其他注意事项

1、人通过代码操作内存,CPU通过取指译码执行来访问内存
2、另一块内存中通过地址映射并访问设备控制器中的寄存器(寄存器是物理设备,里面是一些写死的规则),CPU通过该内存来访问设备控制器中的寄存器
3、板子=CPU+设备控制器
4、设备控制器通过IO引脚来控制高低电平,从而控制设备
5、SD卡算外存设备,相当于提前在SD卡中烧写了一个小型的系统,用于启动引导
6、寄存器的八种模式:
user用户:唯一非特权、正常程序运行的工作模式
sys系统:和用户模式一起属于非异常模式,用于操作系统(特权),和用户模式类似,但可以切换到其他模式
irq中断:用于中断请求处理,只有在IRQ异常响应才进入该模式
fiq快中断:用于快速中断请求处理,只有在FIQ异常响应模式才进入该模式
svc管理:供操作系统使用的一种保护模式,操作系统大部分代码都在内核,运行模式为SVC。应用层的到了系统运行,都是在svc模式
abort中止:用于虚拟内存
undefined未定义:软件仿真
moniter:cotex内核,不常用
7、寄存器:通用寄存器r0-r15(包括sp pc 等特殊寄存器,不包括CPSR、SPSR等程序状态寄存器)    
8、汇编存在的意义:为C程序的运行做准备
9、异常触发过程:异常-触发异常-切换对应异常模式-异常向量表-异常处理函数
10、中断触发过程:当系统产生中断,就到irq中断模式处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis分布式锁存在的问题以及解决方式

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

ROS---传感器集成

ROS—传感器集成 对于ROS机器人&#xff0c;如果想让其启动&#xff0c;我们需要逐一启动底盘控制与激光雷达&#xff0c;操作有点冗余。并且如果只是简单启动这些节点&#xff0c;那么在在 rviz 中显示时&#xff0c;会发现出现了TF转换异常&#xff0c;比如参考坐标系设置为o…

如何设置Windows 11的WSL系统用作备用桌面环境

如何设置Windows 11的WSL系统用作开发环境&#xff08;含Astrill设置&#xff09; 如何设置Windows 11的WSL系统用作备用桌面环境 引子&#xff1a; 2023年末&#xff0c;公司突然遭遇网络攻击&#xff0c;调整了防火墙设置&#xff0c;连接VPN用来飞X软件&#xff0c;与原来…

JAVA基础----String类型的简单介绍

文章目录 1. String类的重要性2. 常用方法2.1 字符串构造2.2 String对象的比较2.3 字符串查找2.4 转化2.5 字符串替换2.6 字符串拆分2.7 字符串截取2.8 其他操作方法2.9 字符串的不可变性2.10 字符串修改2.11 借助StringBuffer 和 StringBuilder 观察String进行修改的效率 3. S…

实时语音多实例实现设计方案(服务端)

1.端上接入协议 如何自行开发代码访问阿里语音服务_智能语音交互(ISI)-阿里云帮助中心 2.接口修改结果逻辑及端上调用步骤 阿里client server交互流程图&#xff1a; 阿里语音接收识别结果&#xff1a; begin_time time 含义 客户端循环发送语音数据&#xff0c;持续接收…

vue学习,使用provide/inject通信

提示&#xff1a;组件的provide&#xff0c;可以被其内所有层级的组件&#xff0c;通过inject引用 文章目录 前言一、通信组件二、效果三、参考文档总结 前言 需求&#xff1a;使用provide/inject通信 一、通信组件 1、AA.vue <template><div class"test"…

【开发实践】前端jQuery+gif图片实现载入界面

一、需求分析 载入界面&#xff08;Loading screen&#xff09;是指在计算机程序或电子游戏中&#xff0c;当用户启动应用程序或切换到新的场景时&#xff0c;显示在屏幕上的过渡界面。它的主要作用是向用户传达程序正在加载或准备就绪的信息&#xff0c;以及提供一种视觉上的反…

腾讯云2核2G4M云服务器值得买吗?

随着云计算技术的不断发展和普及&#xff0c;越来越多的企业和个人开始意识到云服务器的优势&#xff0c;并选择将其业务迁移至云端。作为国内领先的云计算服务提供商&#xff0c;腾讯云一直致力于为用户提供高品质的云服务器服务。其中&#xff0c;腾讯云2核2G4M云服务器备受关…

Docker 安装 MySQ

Docker 安装 MySQL MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能&#xff0c;MySQL 已成为 Web 应用程序的数据库优先选择。 1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a;https://hub.docker.com/_/mysql?tabtags 。 可以通过 Sort b…

SpringBoot教程(十二) | SpringBoot集成JPA

SpringBoot教程(十二) | SpringBoot集成JPA 1. JPA简介 概念&#xff1a; JPA顾名思义就是Java Persistence API的意思&#xff0c;是JDK 5.0注解或XML描述对象&#xff0d;关系表的映射关系&#xff0c;并将运行期的实体对象持久化到数据库中。 优势&#xff1a; 标准化 …

Postman使用方法指南,最全面的教程

Postman使用教程 一、Postman介绍 ​ Postman是一个英语单词&#xff0c;名词&#xff0c;作名词时意为“邮递员&#xff1b;邮差”。 ​ Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获…

【PS】PS设计图欣赏、学习、借鉴

【PS】PS设计图欣赏、学习、借鉴 bilibili萌新PS学习计划&#xff1a;PS教程全套零基础教学视频&#xff08;全套81节全新版本&#xff09;

Flink1.17 基础知识

Flink1.17 基础知识 来源&#xff1a;B站尚硅谷 目录 Flink1.17 基础知识Flink 概述Flink 是什么Flink特点Flink vs SparkStreamingFlink的应用场景Flink分层API Flink快速上手创建项目WordCount代码编写批处理流处理 Flink部署集群角色部署模式会话模式&#xff08;Session …

conda install命令无法安装pytorch

由于网络问题&#xff0c;直接采用conda install命令可能无法直接下载对应的cuda包。 方法一&#xff1a;采用pip命令替代 步骤1&#xff1a;切换pip的源为国内源&#xff1a; 若只是临时切换&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-p…

分子动力学模拟—LAMMPS 模拟(固体和液体)数据后处理软件(六)

记录一下检索到一篇分子动力学模拟数据后处理的软件。 感谢论文的原作者&#xff01; 主要功能&#xff1a; Structure Analysis Ackland Jones Analysis CentroSymmetry Parameter Common Neighbor Analysis Common Neighbor Parameter Atomic Structure Entropy Stein…

9个在线图像压缩工具,可让您直接压缩 JPG、PNG 和 GIF 文件。

在这篇文章中&#xff0c;我们收集了九个出色的在线图像优化工具&#xff0c;可让您直接从网络浏览器压缩 JPG、PNG 和 GIF 文件。 除了分享有关每个工具的信息之外&#xff0c;我们还将分享测试 JPG 和 PNG 图像的真实测试数据&#xff0c;以便您了解每个工具可以节省的文件大…

C# 实现单线程异步互斥锁

文章目录 前言一、异步互斥锁的作用是什么&#xff1f;示例一、创建和销毁 二、如何实现&#xff1f;1、标识&#xff08;1&#xff09;标识是否锁住&#xff08;2&#xff09;加锁&#xff08;3&#xff09;解锁 2、异步通知&#xff08;1&#xff09;创建对象&#xff08;2&a…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了&#xff0c;从零开始创建SpringBoot工程&#xff0c;且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架&#xff0c;最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程&#xff1f; 使用Sp…

YOLOv8全网首发:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和YOLOv8结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DCN…

X Winner受邀出席泰国政府加密峰会,上演未来独角兽的独角戏

​在近日&#xff0c;游戏化流动性&#xff08;Gamified Liquidity&#xff09;的基础设施 X WINNER &#xff0c;受邀出席了由泰国政府举办的“Blockchain to Government Conference ”大会。据了解&#xff0c;该会议是泰国政府布局 Web3 产业的一个重要标志&#xff0c;同时…