• ARM开发(四)新手小白如何阅读芯片手册,裸机驱动开发步骤以及纯汇编实现点灯,汇编结合c点灯,c实现点灯


    一.如何阅读芯片手册(datasheet)

            作为嵌入式学习者,如何去阅读芯片手册是重中之重。不管是什么芯片手册,在写的怎么天花乱坠,它的本质也就是使用说明书。

            可是问题来了,它Y的是本英语的说明书,但是英语不好的友友们不要过于焦虑,我们现在有了很好的翻译软件,而且只要我们多读多看,在未来的一个时间点厚积薄发,阅读芯片手册对你来说再也不是问题。

            下面我将以生动形象用一个三星的芯片手册结合如何进行简单驱动开发去带领大家一起读芯片手册,了解到它的功能强大之处。

    二.裸机驱动开发步骤

            1.当我们拿到一块板子,如果想要实现具体的功能,首先我们要想到的肯定是明白自己想要实现一个什么样的功能。(这里我就拿各位学生看到都烦的点灯来举例)

            2.既然明白了我们的目标是点灯,那么我们接下来要做的就是找到板子上的小灯泡(发光二极管)

            如图:

     然后我们看到了led【2-5】一共四个小灯泡

            找到小灯泡以及名字后也就正式开启了我们的点灯之路。

    裸机驱动开发

            (1)看电路图

                    --1.找到我要控制的设备(这里就拿小灯泡led2来举例)

                    打开我们的外设硬件说明书在搜索栏搜索led2

                    如图

                    

             从这张图我们了解到,这是一个npn三极管,基极连接着cpu的侧控制管脚CHG_COK,由cpu来进行模数转换控制高低电位,决定三极管的导通以及关断。这里我们忽略已经标好的GPX2_7。

            (2)看芯片手册

            搜索,电路图里对应的控制模块,然后如果有coreboard的话去那里找到对应的GPX2-7。

            看模块的overview了解该模块的大概功能。

            (3)看控制寄存器

            如果寄存器比较多我们该怎么办?

            看技术支持提供的例子程序,找到需要修改的寄存器(常常都只有几个)。

            部分厂商会提供配置软件,通过界面去配置功能,我们只需要使用配置好的寄存器的值就可以了。

    来到芯片手册,如图所示:

            

             (4)编程

            1.定义要控制的寄存器的宏(与手册里的寄存器地址对应起来)

            2.设备初始化(如设置GPIO的输出状态) tips:GPIO就是与cpu相连的引脚

            3.把功能分成最基本的小块,逐个实现,如:点亮灯——灭灯——加延时——闪烁——跑马灯

            

    以下代码是在这个cpu以及开发板上实现的:

    cpu:samsung Exynos

    开发板: FS4412

    三.纯汇编实现点灯

    1. @ GPX2CON 寄存器地址: 0x11000000 + 0x0c40
    2. .text
    3. ldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CON
    4. ldr r1, [r0]
    5. bic r1, #0xf0000000 @ 将 28~31号比特位清零
    6. orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能
    7. str r1, [r0]
    8. ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4
    9. ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容
    10. bic r1, #0xf0000
    11. orr r1, #0x10000
    12. str r1, [r0]
    13. while:
    14. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    15. ldr r3, [r2]
    16. orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯
    17. str r3, [r2]
    18. ldr r2, =0x114001e4 @ 将GPF3DAT
    19. ldr r3, [r2]
    20. orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯
    21. str r3, [r2]
    22. bl delay_1s
    23. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    24. ldr r3, [r2]
    25. bic r3, #0x80
    26. str r3, [r2]
    27. ldr r2, =0x114001e4 @ 将GPF3DAT
    28. ldr r3, [r2]
    29. bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯
    30. str r3, [r2]
    31. bl delay_1s
    32. b while
    33. delay_1s:
    34. ldr r10, =0x4ffffff
    35. loop:
    36. cmp r10, #0
    37. subgt r10, #1
    38. bgt loop
    39. mov pc, lr
    40. .end

    makefile

    1. CROSS=arm-linux-
    2. CC=gcc
    3. LD=ld
    4. OC=objcopy
    5. all:
    6. $(CROSS)$(CC) -c start.s
    7. $(CROSS)$(LD) start.o -Ttext 40008000 -o start.elf
    8. $(CROSS)$(OC) -O binary -S start.elf start.bin
    9. clean:
    10. rm *.o *.elf *.bin

    四. 汇编结合c点灯

    mian.c 实现延时

    1. > Created Time: 20220810日 星期三 154306
    2. ***********************************************************************/
    3. void delay()
    4. {
    5. int i, j;
    6. for(i = 0; i < 10000; i++)
    7. for(j = 0; j < 256; j++);
    8. }
    9. /*******************************end of file*****************************/
    1. @ GPX2CON 寄存器地址: 0x11000000 + 0x0c40
    2. .text
    3. ldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CON
    4. ldr r1, [r0]
    5. bic r1, #0xf0000000 @ 将 28~31号比特位清零
    6. orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能
    7. str r1, [r0]
    8. ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4
    9. ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容
    10. bic r1, #0xf0000
    11. orr r1, #0x10000
    12. str r1, [r0]
    13. while:
    14. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    15. ldr r3, [r2]
    16. orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯
    17. str r3, [r2]
    18. ldr r2, =0x114001e4 @ 将GPF3DAT
    19. ldr r3, [r2]
    20. orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯
    21. str r3, [r2]
    22. bl delay @ 调用main.c中的delay函数,进行延时
    23. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    24. ldr r3, [r2]
    25. bic r3, #0x80
    26. str r3, [r2]
    27. ldr r2, =0x114001e4 @ 将GPF3DAT
    28. ldr r3, [r2]
    29. bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯
    30. str r3, [r2]
    31. bl delay @ 调用main.c中的delay函数,进行延时
    32. b while
    33. .end

    makefile

    1. CROSS=arm-linux-
    2. CC=gcc
    3. LD=ld
    4. OC=objcopy
    5. all:
    6. $(CROSS)$(CC) -c start.s
    7. $(CROSS)$(CC) -c main.c
    8. $(CROSS)$(LD) start.o main.o -Ttext 40008000 -o start.elf
    9. $(CROSS)$(OC) -O binary -S start.elf start.bin
    10. clean:
    11. rm *.o *.elf *.bin

    五.c实现点灯,这种方法是我们用的最多的,也是最简便的

     main.c

    1. ***********************************************************************/
    2. void delay()
    3. {
    4. int i, j;
    5. for(i = 0; i < 10000; i++)
    6. for(j = 0; j < 256; j++);
    7. }
    8. #define GPX2CON *(volatile unsigned int *)0x11000c40
    9. #define GPX2DAT *(volatile unsigned int *)0x11000c44
    10. void led2_init()
    11. {
    12. // GPX2CON = GPX2CON & 0x0fffffff | (1 << 28)
    13. GPX2CON = GPX2CON & (~(0xf << 28)) | ( 0x1 << 28 );
    14. }
    15. void led2_on()
    16. {
    17. GPX2DAT = GPX2DAT | (1 << 7);
    18. }
    19. void led2_off()
    20. {
    21. GPX2DAT = GPX2DAT & (~(1 << 7));
    22. }
    23. int main()
    24. {
    25. led2_init();
    26. while(1){
    27. led2_on();
    28. delay();
    29. led2_off();
    30. delay();
    31. }
    32. }
    33. /*******************************end of file*****************************/
    1. .text
    2. b main
    3. .end

    makefile

    1. CROSS=arm-linux-
    2. CC=gcc
    3. LD=ld
    4. OC=objcopy
    5. all:
    6. $(CROSS)$(CC) -c start.s
    7. $(CROSS)$(CC) -c main.c
    8. $(CROSS)$(LD) start.o main.o -Ttext 40008000 -o start.elf
    9. $(CROSS)$(OC) -O binary -S start.elf start.bin
    10. clean:
    11. rm *.o *.elf *.bin

    六.纯汇编实现跑马灯

    1. @ GPX2CON 寄存器地址: 0x11000000 + 0x0c40
    2. .text
    3. ldr r0, =0x11000c40 @ 将GPX2CON寄存器地址搬移到 r0,那么r0 就代表 GPX2CON
    4. ldr r1, [r0]
    5. bic r1, #0xf0000000 @ 将 28~31号比特位清零
    6. orr r1, #0x10000000 @ 28号比特位置位1,其他比特位不动,设置GPX2_7输出功能
    7. str r1, [r0]
    8. ldr r0,=0x11000c20
    9. ldr r1,[r0]
    10. bic r1,#0xf
    11. orr r1,#0x1
    12. str r1,[r0]
    13. ldr r0, =0x114001e0 @ 将GPF3CON寄存器地址搬移到 r0 GPF3_4
    14. ldr r1, [r0] @ 将地址上的内容取 4字节,相当于取出GPF3CON寄存器的内容
    15. bic r1, #0xf0000
    16. orr r1, #0x10000
    17. str r1, [r0]
    18. ldr r0,=0x114001E0
    19. ldr r1,[r0]
    20. bic r1,#0xf00000
    21. orr r1,#0x100000
    22. str r1,[r0]
    23. while:
    24. @开灯led2
    25. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    26. ldr r3, [r2]
    27. orr r3, #0x80 @ 将GPX2DAT的7号位置 1,亮灯
    28. str r3, [r2]
    29. bl delay_1s
    30. @开灯led3
    31. ldr r2,=0x11000c24
    32. ldr r3,[r2]
    33. orr r3,#0x1
    34. str r3,[r2]
    35. bl delay_1s
    36. @开灯led4
    37. ldr r2, =0x114001e4 @ 将GPF3DAT
    38. ldr r3, [r2]
    39. orr r3, #0x10 @ 将GPF3DAT的4号位置 1,亮灯
    40. str r3, [r2]
    41. bl delay_1s
    42. @开灯led5
    43. ldr r2,=0x114001E4
    44. ldr r3,[r2]
    45. orr r3,#0x20
    46. str r3,[r2]
    47. bl delay_1s
    48. @关灯led2
    49. ldr r2, =0x11000c44 @ 将GPX2DAT寄存器的地址搬移到 r2
    50. ldr r3, [r2]
    51. bic r3, #0x80
    52. str r3, [r2]
    53. bl delay_1s
    54. @关灯led3
    55. ldr r2,=0x11000c24
    56. ldr r3,[r2]
    57. bic r3,#0x1
    58. str r3,[r2]
    59. bl delay_1s
    60. @关灯led4
    61. ldr r2, =0x114001e4 @ 将GPF3DAT
    62. ldr r3, [r2]
    63. bic r3, #0x10 @ 将GPF3DAT的4号位置 0,灭灯
    64. str r3, [r2]
    65. bl delay_1s
    66. @关灯led5
    67. ldr r2,=0x114001E4
    68. ldr r3,[r2]
    69. bic r3,#0x20
    70. str r3,[r2]
    71. bl delay_1s
    72. b while
    73. delay_1s:
    74. ldr r10, =0x4ffffff
    75. loop:
    76. cmp r10, #0
    77. subgt r10, #1
    78. bgt loop
    79. mov pc, lr
    80. .end

    makefile

    1. CROSS=arm-linux-
    2. CC=gcc
    3. LD=ld
    4. OC=objcopy
    5. all:
    6. $(CROSS)$(CC) -c start.s
    7. $(CROSS)$(LD) start.o -Ttext 40008000 -o start.elf
    8. $(CROSS)$(OC) -O binary -S start.elf start.bin
    9. clean:
    10. rm *.o *.elf *.bin

  • 相关阅读:
    Lab3 存储过程与触发器
    Windows程序相同程序实现运行互斥
    基于CCE Kubernetes网络与持久化存储实战
    iOS CVPixelBufferCreate 创建 CVPixelBufferRef 时屏幕拉伸或像素偏移(花屏)
    踩了个DNS解析的坑,但我还是没想通
    搭建Spark开发环境
    【数据库】聚集函数
    Node.js 入门教程 3 如何安装 Node.js
    HTML+CSS大作业:使用html设计一个简单好看的公司官网首页 浮动布局
    第五章-Python数据处理工具Pandas--1
  • 原文地址:https://blog.csdn.net/fuyuyf/article/details/126272737