GPIO接口及点亮第一个LED灯

一、GIPIO介绍

General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。

1.GPIO的优点
  • 低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。
  • 集成IIC从机接口:GPIO内置IIC从机接口,即使在待机模式下也能够全速工作。
  • 小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN!
  • 低成本:您不用为没有使用的功能买单。
  • 快速上市:不需要编写额外的代码、文档,不需要任何维护工作。
  • 可预先确定响应时间:缩短或确定外部事件与中断之间的响应时间。
2.GPIO的寄存器
    • GPxCON 寄存器
      用于配置引脚功能。 PORT A 与 PORT B~PORT H/J 在功能选择上有所不同,GPACON 中每一位对应一根引脚,共 23 个引脚。当某位被设为 0 时候,相应引脚为 输出引脚。此时我们可以在GPADAT 中相应的写入 1或者 0 来让此引脚输出高电平或者低电平;当某位被设为1时,相应引脚为地址线或用于地址控制,此时GPADATA无用。
      一般而言 GPACON 通常被设为 1 ,以便访问外部器件。
      PORT B~PORT H/J在寄存器操作方面完全相同,GPxCON 中每两位控制一根引脚,
      • 00 输入
      • 01 输出
      • 10 特殊功能
      • 11 保留不用
    • GPxDAT 寄存器
      GPxDAT用于读写引脚,当引脚被设为输入时候,读此寄存器可知道相应引脚的电平状态高还是低,当引脚被设为输出时候,写此寄存器的位,可令引脚输出高电平还是低电平。
    • GPxUP寄存器
      GPxUP寄存器某位为1时,相应管脚没有内部上拉电阻;为 0 时候 相应管脚有内部上拉电阻。
      上拉电阻作用在于,当GPIO 引脚处于第三种状态时候,既不是输出高电平,也不是输出低电平。而是呈现高阻态,相当于没有接芯片。它的电平状态由上下拉电阻决定。
二、控制LED实例
1.查看硬件原理图

2.查看数据手册
  • 在三星公司提供的DataSheet手册中找到介绍GPIO的章节

3.确定关键定义
    • GPJ0CON寄存器
      寄存器地址:0xE0200240
      要控制的位数:[15:12]
      要设置的二进制数据:0b0001
    • GPJ0PUD寄存器
      寄存器地址:0xE0200248
      要控制的位数:[7:6]
      要设置的二进制数据:0b00
    • GPJ0DAT寄存器
      寄存器地址:0xE0200244
      要控制的位数:[3]
      要设置的二进制数据:0b1
4.编写程序
start:
    @;配置GPJ0CON寄存器 Address=0xE0200240 [15:12]=0b0001
    ldr r0,=0xE0200240
    ldr r1,=0x1000
    str r1,[r0]

    @;配置GPJ0PUD寄存器 Address=0xE0200248 [7:6]=0b00
    ldr r0,=0xE0200248
    ldr r1,=0x0
    str r1,[r0]

    @;配置GPJ0DAT寄存器 Address=0xE0200244 [3]=1
    ldr r0,=0xE0200244
    ldr r1,=0x4
    str r1,[r0]
5.实例测试

生成目标文件
arm-linux-gcc -c led.S

生成可执行文件
arm-linux-gcc -Ttext 0x34000000 -nostartfiles -nostdlib led.o -o led

生成独立执行的二进制
arm-linux-objcopy -O binary led led.bin

使用tftp命令下载
tftp 0x34000000 led.bin

使用go命令执行
go 0x34000000

 

6.简单的流水灯实现

.global _start
_start:
    ldr r0, =0x11111111
    ldr r1, =0xE0200240
    str r0, [r1]
    
    ldr r0, =0x11111111
    ldr r1, =0xE02000A0
    str r0, [r1]
 
flash:    
    ldr r0, =(1<<1)
    ldr r1, =0xE02000A4
    str r0, [r1]

    ldr r0, =~(1<<3)
    ldr r1, =0xE0200244
    str r0, [r1]
    bl delay
    
    ldr r0, =~(1<<4)
    ldr r1, =0xE0200244
    str r0, [r1]    
    bl delay
    
    ldr r0, =~(1<<5)
    ldr r1, =0xE0200244
    str r0, [r1]
    bl delay
    
    ldr r0, =~(1<<1)
    ldr r1, =0xE02000A4
    str r0, [r1]
    bl delay
    
    b flash
    
    
delay:
    ldr r2, =100000000
    ldr r3, =0x0
delay_loop:
    sub r2, r2, #1
    cmp r2, r3
    bne delay_loop
                    
    mov pc, lr    

 

转载于:https://www.cnblogs.com/xiehuan-blog/p/9704240.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于STM32F103C8T6创建并点亮第一个LED,你需要进行以下步骤: 1. 配置开发环境:首先,你需要安装Keil MDK软件,并确保你的STM32F103C8T6开发板已正确连接到计算机上。 2. 创建新工程:在Keil MDK软件中,选择“File” -> “New Project”来创建一个新的工程。选择适合你的开发板的芯片型号(STM32F103C8T6),并选择一个合适的存储路径。 3. 配置工程设置:在创建工程后,你需要配置一些工程设置。例如,选择合适的编译器、调试器和目标设备等。 4. 编写代码:在Keil MDK软件中,打开新建的工程,并在源文件夹中创建一个新的C文件。在该文件中编写代码来点亮LED。 下面是一个简单的示例代码,用于点亮第一个LED(连接到GPIO Port C的Pin 13): ```c #include "stm32f10x.h" int main(void) { // 使能GPIOC时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 配置GPIOC Pin 13为推挽输出模式 GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); GPIOC->CRH |= GPIO_CRH_MODE13; while (1) { // 点亮LED GPIOC->BSRR = GPIO_BSRR_BS13; // 延时一段时间 for (int i = 0; i < 1000000; i++); // 熄灭LED GPIOC->BSRR = GPIO_BSRR_BR13; // 延时一段时间 for (int i = 0; i < 1000000; i++); } } ``` 5. 编译和下载:在Keil MDK软件中,点击“Build”按钮来编译你的代码。如果编译成功,就可以将生成的可执行文件下载到STM32F103C8T6开发板上进行调试和运行。 以上是基于STM32F103C8T6创建并点亮第一个LED的基本步骤。如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值