嵌入式系统课堂笔记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
看手册

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