嵌入式系统课堂笔记3.3

1.GPIO:General-purpose input/output通用的输入输出端口。
1.1输入/输出引脚:就是GPIO,有对应的控制寄存器来设置这两种功能/上拉电阻/二极管/三极管。
如何与上拉电阻、三极管联系?
①输出引脚:图片解释:图1,NPN型三极管,小阀门流通、电阻、、
图2,PNP型三极管
②输入引脚:
在这里插入图片描述图片解释:加一个灯判断是否流通。

电路图:
点亮LED1的0段代码,烧进去就可以(.S汇编):

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************       .text
.global _start
_start:     LDR     R0,=0x56000050      @ R0设为GPFCON寄存器。此寄存器@ 用于选择端口B各引脚的功能:@ 是输出、是输入、还是其他MOV     R1,#0x00000100        STR     R1,[R0]             @ 设置GPF4为输出口,[8:7]=0b01
LDR     R0,=0x56000054      @ R0设为GPBDAT寄存器。此寄存器@ 用于读/写端口B各引脚的数据MOV     R1,#0x00000000      @ 此值改为0x00000010,@ 可让LED1熄灭STR     R1,[R0]             @ GPF4输出0,LED1点亮
MAIN_LOOP:B       MAIN_LOOP

代码解读:
Q1.位[8:7]=0b01是什么意思啊?
A1: 就是某个字或者字节的bit8和bit7,分别赋值0和1,0b表示二进制
Q 2.STR R1,[R0] 的含义?
A2:写内存指令,这条指令的意思是,将R1里面的值,复制到以R0里面的值作为地址的内存里面。执行完这条指令以后,GPF4就被配置成了输出引脚(芯片手册:输出为01)。
Q3.#0x00000100是什么意思?
A3: #0x开头表示十六进制
MOV R1,#0x00000100 表示要往控制器设置的数字值,因为二进制 01000 0000 转成 16进制数据 为:0x00000100。 (位是从0开始数的)

① 50是GPFCON寄存器,arm里从R0-R15都有,但不是都用,有些有特殊功能。R0-R7是通用的。 此处R0 是通用32位寄存器。LDR R0,…:把地址放到R0
②把数据#0x00000100 存到寄存器R0

同理设置GPFDAT寄存器的值, 给一个低电平,熄灭。

最后没有代码了,死循环。

解读电路图:
Q:输入输出是干什么用的?
A:CPU有好多接口,其中一个就是GPF,GPF有八个引脚(8pin),第五个引脚GPF4接出来一盏灯,上拉一个3.3V。输入输出接个灯就是提示你,接电灯亮。

MakeFile:

led_on.bin : led_on.Sarm-linux-gcc -g -c -o led_on.o led_on.Sarm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elfarm-linux-objcopy -O binary -S led_on_elf led_on.binarm-linux-objdump -D led_on_elf>led_on.dis
clean:rm -f   led_on.bin led_on_elf *.o

Makefile文件

led_on_c.bin : crt0.S  led_on_c.carm-linux-gcc -g -c -o crt0.o crt0.S          #编译 .S文件arm-linux-gcc -g -c -o led_on_c.o led_on_c.c      #编译.c 文件arm-linux-ld -Ttext 0x00000000 -g  crt0.o led_on_c.o -o led_on_c_elf     #链接生成可执行文件 elf,定位代码段入口地址为 0x00000000arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin         #elf文件转换成bin文件,方便烧写到开发板arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis       #通过elf文件  生成 反汇编代码
clean:rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

gcc是Linux下的C编译器。
.o是目标文件,.S是源文件。
-g调试 -c 编译 -o输出
.o是目标文件,.S是源文件
-ld是链接,-Ttext要控制在开发板上的位置时写, 0x0000000一定要有,烧到0段地址。用.o生成.elf二进制文件
-objcopy将.elf文件拷贝成.bin文件,方便看。
-objdump生成反汇编到.dis文件里去,是为了看编译器如何工作的。
最后clean

然后我们再看下反汇编文件:

led_on_elf:     file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0:	e59f0014 	ldr	r0, [pc, #20]	; 1c <.text+0x1c>   //50给r0。PC指向当前正在取指的那条值,动态地址。#是十进制。#20表示十进制数20,[pc,#20]表示将pc的值加上20。然后,arm采用流水线的形式执行指令。当CPU在执行A地址的指令时,地址A+4的指令会被译码,而地址A+8的指令会被加载,pc=当前执行指令的地址+8。
[pc,#20]就是8+20=28=1c4:	e3a01c01 	mov	r1, #256	; 0x1008:	e5801000 	str	r1, [r0]c:	e59f000c 	ldr	r0, [pc, #12]	; 20 <.text+0x20>10:	e3a01000 	mov	r1, #0	; 0x014:	e5801000 	str	r1, [r0]//以上是二进制文件
00000018 <MAIN_LOOP>:18:	eafffffe 	b	18 <MAIN_LOOP>1c:	56000050 	undefined       //指令太长20:	56000054 	undefined
Disassembly of section .debug_aranges:00000000 <.debug_aranges>:0:	0000001c 	andeq	r0, r0, ip, lsl r04:	00000002 	andeq	r0, r0, r28:	00040000 	andeq	r0, r4, r0...14:	00000024 	andeq	r0, r0, r4, lsr #32...
Disassembly of section .debug_info:00000000 <.debug_info>:0:	00000041 	andeq	r0, r0, r1, asr #324:	00000002 	andeq	r0, r0, r28:	01040000 	tsteq	r4, r0...14:	00000024 	andeq	r0, r0, r4, lsr #3218:	5f64656c 	swipl	0x0064656c1c:	532e6e6f 	teqpl	lr, #1776	; 0x6f020:	6e6d2f00 	cdpvs	15, 6, cr2, cr13, cr0, {0}24:	67682f74 	undefined28:	6c2f7366 	stcvs	3, cr7, [pc], #-4082c:	2f736465 	swics	0x0073646530:	5f64656c 	swipl	0x0064656c34:	47006e6f 	strmi	r6, [r0, -pc, ror #28]38:	4120554e 	teqmi	r0, lr, asr #103c:	2e322053 	mrccs	0, 1, r2, cr2, cr3, {2}40:	01003531 	tsteq	r0, r1, lsr r544:	Address 0x44 is out of bounds.Disassembly of section .debug_abbrev:00000000 <.debug_abbrev>:0:	10001101 	andne	r1, r0, r1, lsl #24:	12011106 	andne	r1, r1, #-2147483647	; 0x800000018:	1b080301 	blne	200c14 <__bss_end__+0x1f8bf0>c:	13082508 	tstne	r8, #33554432	; 0x200000010:	00000005 	andeq	r0, r0, r5
Disassembly of section .debug_line:00000000 <.debug_line>:0:	00000035 	andeq	r0, r0, r5, lsr r04:	001c0002 	andeqs	r0, ip, r28:	01020000 	tsteq	r2, r0c:	000a0efb 	streqd	r0, [sl], -fp10:	01010101 	tsteq	r1, r1, lsl #214:	01000000 	tsteq	r0, r018:	64656c00 	strvsbt	r6, [r5], #-30721c:	2e6e6f5f 	mcrcs	15, 3, r6, cr14, cr15, {2}20:	00000053 	andeq	r0, r0, r3, asr r024:	05000000 	streq	r0, [r0]28:	00000002 	andeq	r0, r0, r22c:	2c2e1700 	stccs	7, cr1, [lr]30:	2d2d2d2d 	stccs	13, cr2, [sp, #-180]!34:	01000602 	tsteq	r0, r2, lsl #1238:	Address 0x38 is out of bounds.

可以参考博客:https://blog.csdn.net/PZ0605/article/details/53229277写得蛮好

总结从电路图出发:你要点亮哪盏灯,就去对应的地方找到它,接到CPU的哪个口上(例如GPF4),哪个口的哪个针上(87位)。

1.2与、或、非门
在这里插入图片描述1.3中断引脚
在这里插入图片描述GPF有INT,然后中断判断等。
9pin 只接三根线

2.协议类引脚(双方要满足时序要求)
UART:异步(在不在我都给你发)串口
在这里插入图片描述
串口座:电平转换

I^2C
看手册
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部