ARM day5、day6 硬件编程

一、硬件

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.s3     arm-none-linux-gnueabi-gcc -fno-builtin -nostdinc -c -o main.o main.c4     arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o led.elf5     arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin6     arm-none-linux-gnueabi-objdump -D led.elf > led.dis7 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  delay1s2     .text3     .global _start4 _start:5         b       reset                        @0x006         ldr     pc,_undefined_instruction  @0x047         ldr     pc,_software_interrupt8         ldr     pc,_prefetch_abort9         ldr     pc,_data_abort10         ldr     pc,_not_used11         ldr     pc,_irq12         ldr     pc,_fiq13 14 _undefined_instruction: .word  _undefined_instruction15 _software_interrupt:    .word  _software_interrupt16 _prefetch_abort:        .word  _prefetch_abort17 _data_abort:            .word  _data_abort18 _not_used:              .word  _not_used19 _irq:                   .word  _irq20 _fiq:                   .word  _fiq21 22 23 reset:24     ldr r0,=0x40008000      @设置异常向量表的起始地址为0x4000800025     mcr p15,0,r0,c12,c0,0       @ Vector Base Address Register26 27 init_stack:28     ldr     r0,stacktop         /*get stack top pointer*/29 30     /********svc mode stack********/31         mov     sp,r032         sub     r0,#128*4          /*512 byte  for irq mode of stack*/33     /****irq mode stack**/34         msr     cpsr,#0xd235         mov     sp,r036         sub     r0,#128*4          /*512 byte  for irq mode of stack*/37     /***fiq mode stack***/38         msr     cpsr,#0xd139         mov     sp,r040         sub     r0,#041     /***abort mode stack***/42         msr     cpsr,#0xd743         mov     sp,r044         sub     r0,#045     /***undefine mode stack***/46         msr     cpsr,#0xdb47         mov     sp,r048         sub     r0,#049    /*** sys mode and usr mode stack ***/50         msr     cpsr,#0x1051         mov     sp,r0             /*1024 byte  for user mode of stack*/52 53         b       main54 55 delay1s:56      ldr      r4,=0x1ffffff57 delay1s_loop:58      sub    r4,r4,#159      cmp   r4,#0         60      bne    delay1s_loop61      mov   pc,lr62 63 64     .align  465 66     /****  swi_interrupt handler  ****/67 68 69 stacktop:    .word      stack+4*51270 71 .data72 73 stack:74   .space  4*51275 .end

main.c:

  1 //led 2 3 4 5 2 //led23 #define GPX2CON (*(volatile unsigned int *)0x11000c40)4 #define GPX2DAT (*(volatile unsigned int *)0x11000c44)5 //led36 #define GPX1CON (*(volatile unsigned int *)0x11000c20)7 #define GPX1DAT (*(volatile unsigned int *)0x11000c24)8 //led49 #define GPF3CON (*(volatile unsigned int *)0x114001E0)10 #define GPF3DAT (*(volatile unsigned int *)0x114001E4)11 //led 512 13 14 15 void mydelay(int x) //延时16 {   17     int i;18     while(x --){    //1ms19         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位置133 {34    GPX2DAT = GPX2DAT | (0x1 << 7);35 }36 void led2_off()  //关灯 7位置037 {38    GPX2DAT = GPX2DAT & ~(0x1 << 7);39 }40 void led3_on()   //开灯 0位置141 {42    GPX1DAT = GPX1DAT | (0x1);43 }44 void led3_off()  //关灯 0位置045 {46    GPX1DAT = GPX1DAT & ~(0x1);47 }48 void led4_on()   //开灯 4位置149 {50    GPF3DAT = GPF3DAT | (0x1 << 4);51 }52 void led4_off()  //关灯 4位置053 {54    GPF3DAT = GPF3DAT & ~(0x1 << 4);55 }56 void led5_on()   //开灯 5位置157 {58    GPF3DAT = GPF3DAT | (0x1 << 5);59 }60 void led5_off()  //关灯 4位置061 {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.hqwc.cn/news/415029.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】《AI中文版》V3 第 1 章 概述

参考链接&#xff1a; 开源内容&#xff1a;https://github.com/siyuxin/AI-3rd-edition-notes 英文版 V2&#xff1a; https://terrorgum.com/tfox/books/artificialintelligenceinthe21stcentury.pdf 没找到 V3 笔记 作为计算机科学的一个分支&#xff0c;人工智能主要研究…

android 13.0 Hotseat 添加allapp button功能实现

1.概述 在13.0产品的rom定制化开发中,在laucher3定制化开发中,在hotseat功能中有需求要求添加allapp按钮 点击按钮进入所有app页面,就是在hotseat的几个功能按钮中间放一个allapp功能键,实现点击进入app列表页 效果图如图: 2.Hotseat 添加allapp button相关代码 packages/…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

基于Harris角点的多视角图像全景拼接算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Harris角点检测 4.2 图像配准 4.3 图像变换和拼接 4.4 全景图像优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 function [ImageB…

如何在C#中读取USB转串口参数并显示在ComboBox

如何在C#中读取USB转串口参数并显示在ComboBox 在很多应用程序中&#xff0c;尤其是那些需要与外部硬件通信的程序中&#xff0c;自动检测和读取串口参数是一个非常有用的功能。在本文中&#xff0c;我们将讨论如何在C#中实现这一功能&#xff0c;重点是如何自动识别通过USB转换…

MetaGPT-打卡-day2,MetaGPT框架组件学习

文章目录 Agent组件实现一个单动作的Agent实现一个多动作的Agent技术文档生成助手其他尝试 今天是第二天的打卡~昨天是关于一些概念的大杂烩&#xff0c;今天的话&#xff0c;就来到了Hello World环节。 从单个Agnet到多个Agent&#xff0c;再到组合更复杂的工作流来解决问题。…

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用&#xff0c;使用并不平凡&#xff0c;该数据库曾做过一次服务器间的迁移。 用户描述&#xff0c;所有oracle客户端查询该视图都报tns错误&#xff0c;一般ora-12154会发生在连接数据库时&#xff0c;因为tns配…

Python爬虫时被封IP,该怎么解决?四大动态IP平台测评

在使用 Python 进行爬虫时&#xff0c;很有可能因为一些异常行为被封 IP&#xff0c;这主要是因为一些爬虫时产生的异常行为导致的。 在曾经的一次数据爬取的时候&#xff0c;我尝试去爬取Google地图上面的商家联系方式和地址信息做营销&#xff0c;可是很不幸&#xff0c;还只…

C语言之编译和链接

目录 一、引言 二、编译和链接 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.3 汇编 2.4 链接 一、引言 #include <stdio.h> int main() {printf("hello, world\n");return 0; } 像这样&#xff0c;只由ASCII字符构成的文件被称为文本文件&…

基于 Hologres+Flink 的曹操出行实时数仓建设

本文整理自曹操出行实时计算负责人林震基于 HologresFlink 的曹操出行实时数仓建设的分享&#xff0c;内容主要分为以下六部分&#xff1a; 曹操出行业务背景介绍曹操出行业务痛点分析HologresFlink 构建企业级实时数仓曹操出行实时数仓实践曹操出行业务成果分析未来展望 一、曹…

vue3中新增时form对象无法赋值问题

有时候对象的值死活赋不上值&#xff0c;这时候可以看下赋值的对象变量名是否和页面组件中的ref相同&#xff0c; 更改后正常赋值

【spark】SparkSQL

目录 SparkSQL01.快速入门什么是SparkSQL为什么学习SparkSQLSparkSQL的特点SparkSQL发展历史-前身Shark框架SparkSQL发展历史 02.SparkSQL概述SparkSQL和Hive的异同SparkSQL的数据抽象DataFrame概述SparkSession对象 03.DataFrame入门和操作DataFrame的组成DataFrame的代码构建…