一、GPIO介绍

    GPIO(General-purpose input/output),通用型之输入输出的简称,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出。

    1、优点(集成在CPU内部)

        低功耗

        小封装

        成本低

        操控简单

    2、GPIO的寄存器

        GPIOxCON 控制寄存器,用于配置GPIO管脚的功能,每两个二进制位控制一个GPIO管脚,一个寄存器可以最多控制16管脚。

            00 输入

            01 输出

            10 特殊功能

            11 保留

        GPIOxDAT 数据寄存器,它的用法取决于控制寄存器

            GPIOxCON 输入

                此时外部设备会对该管脚输入高低电流,从GPIOxDAT寄存器中读取数据(1高,0低)可以知道外部设备的状态,如:可以获取到按键是按下还是弹起。

            GPIOxCON 输出

                此时向GPIOxDAT寄存器写入,如果写入的是0,该管脚输入低电流,如果写入的是1,该管脚输出高电流,根据外部设备的原理图决定。

        GPIOxUP 上/下拉电阻寄存器

            用于控制电阻上拉、下拉。

            如果电阻上拉,GPIO管脚处于高阻状态,相当于没有接芯片。

            

二、点亮LED

    1、查看电路原理图,找到对应的GPIO管脚:GPJ0 

    2、打开CPU数据手册,找到对应地址:

        GPJ0CON 0xE0200240:

            在不修改其它二进制位的前提下,把12~23设置为以下值

            [12~15] 0001 

            [16~19] 0001

            [20~23] 0001

        GPJ0PUD 0xE0200248

            在不修改其它二进制位的前提下,把6~11设置为以下值

            [6~11] 000000

        GPJ0DAT 0xE0200244

            根据电路图得知,GPIO管脚处于低电流时,左边的高电流才会经过LED流向GPIO,LED才会亮。

            在不修改其它二进制位的前提下,把3~5设置为以下值

            [3~5] 000

            

   练习1:点亮最后一个LED灯

   练习2:开启峰鸣器

        1、查看原理图 PWMTOUT2 ,根据核心板原理图得知 GPD0_2

        2、阅读CPU数据手册:

            GPD0CON 0xE020_00A0 [8~11]:0001

            GPD0DAT 0xE020_00A4 [6~7]:00

            GPD0UP 0xE020_00A8 [2]:1

        

三、ARM汇编与C代码混编

    在裸机下使用C语言编程需要确定各内存段的位置,堆内存、栈内存在BL0中已经设置过了,因此还需要确定代码段、数据段、静态数据段,可以通过链接脚本来指定各内存段的位置及排列。

    1、什么是链接地址

        链接地址批的是希望程序执行时所在的地址,编译时通过-Ttext指定。

    2、什么是运行地址

        是程序在运行时,实际所处的位置。

        如果运行地址和链接地址不匹配,代码在进行绝对跳转时就会出现错乱。

    3、链接脚本中究竟要做什么

        链接脚本是用来指挥链接器工作的,它是一个规则文件。

        链接器会根据链接脚本中的规则来排列目标文件的代码段,谁排在第一个,谁的第一个函数就是入口函数。

        链接脚本关键内存是:段名+地址

    4、链接脚本的内容

        SECTIONS{} 它是整个链接脚本的全部

        .代表当前地址

        =表示赋值

 

SECTIONS
        {
            . = 0xd0020010;
            
            .text : {
                start.o
                *(.text)
            }
 
            .data : {
                *(.data)
            }
 
            .bss : {
                *(.bss)
            }
        }

    5、链接脚本的使用