【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

这篇具有很好参考价值的文章主要介绍了【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

一、概述

这篇文章主要介绍在 海思SS528 开发板,去操作某个 GPIO 寄存器输出高、低电平,来熄灭或点亮 LED 灯。

首先,了解一下ARM裸机编程,也就是在一块没有移植操作系统的ARM开发板去编程,相当于把它当成单片机去使用,很多与硬件相关的操作都需要直接读写该硬件的寄存器。

然后,了解一下点亮 LED 灯需要查阅哪些资料 :

  • 海思SS528芯片手册《22AP30 H.265编解码处理器用户指南.pdf》
  • 海思SS528芯片管脚寄存器文档 22AP30_PINOUT_CN.xlsx
  • 你的开发板原理图,需要找到 LED 灯对应的管脚。

然后,了解一下在ARM裸板点亮 LED 灯的几个步骤:

  • 看原理图,找到要点亮的 LED 灯的 GPIO 管脚,并弄清楚点亮该 LED 需要高电平还是低电平;
  • 使能 GPIO 管脚功能;
  • 配置 GPIO 管脚为输出;
  • 设置 GPIO 管脚输出高电平或低电平,熄灭或点亮 LED 灯。

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

二、看原理图,找LED灯的GPIO管脚

从我板子的原理图中找到接在 LINK_LED1 管脚的一个 LED 灯,从原理图可以看出 LED 灯另一端是接在 3V3 的电源的,所以我们操作连接 LED 灯的 GPIO 管脚为 低电平 就可以点亮这个LED灯。如图所示:
【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯
注意: 要根据你自己开发板的原理图来,我这里是低电平,你的不一定是高电平。

找到 LED 灯后,只看到它接在 LINK_LED1 管脚,需要在原理图中,继续查找 LINK_LED1 是接在哪个GPIO的,通过查找,发现 LINK_LED1 是接在 GPIO20_6 的管脚。
【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

小结:完成上面步骤,可以确定,GPIO20_6 管脚输出低电平就可以点亮 LED 灯,GPIO20_6 管脚输出高电平就可以熄灭 LED 灯。

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

三、使能 GPIO 管脚功能

使能 GPIO 管脚功能,需要查阅文档 22AP30_PINOUT_CN.xlsx (文档路径:SS528ReleaseDoc\hardware\chip),打开文档后,在下面选择表格管脚控制寄存器,按Ctrl+F搜索GPIO20_6,找到我们要配置的管脚寄存器,如下图:

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

根据表格信息知道,将寄存器地址为0x17c701d0寄存器的值设置为0x0,就可以使能GPIO功能IO6挡位8关闭上拉关闭下拉。用C语言来设置这个寄存器,可以粗略地用下面代码表示:

#define GPIO20_6_FUNC	(*((volatile unsigned int *)0x17c701d0))
GPIO20_6_FUNC = 0x0;

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

四、配置 GPIO 管脚为输出

GPIO 管脚要配置为输出,需要设置GPIO对应的方向寄存器GPIO_DIR,该寄存器是采用 基地址+偏移地址 的方式来获得的。
通过查阅芯片手册《22AP30 H.265编解码处理器用户指南.pdf》(文档路径:SS528ReleaseDoc\hardware\chip),得知 GPIO_20 的基地址为:0x110a_4000
【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

GPIO_DIR的偏移地址为400,将第6为设置为1,就可以设置 GPIO20_6 为输出功能;
【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

上面分析可以粗略地用C语言来表示:

#define GPIO20_6_DIR (*((volatile unsigned int *)0x110a4400))  // 基地址0x110a4000 + 偏移地址0x400
GPIO20_6_DIR = 0x40;

【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

五、设置 GPIO 管脚输出高、低电平

GPIO管脚要输出高电平或低电平,需要配置GPIO_DATA寄存器,GPIO_DATA寄存器也是采用 基地址+偏移地址 的方式来获得的。从上一小节知道,GPIO_20 的基地址为:0x110a_4000;再查芯片手册选择偏移地址为 0x3FC;同时也可以知道,GPIO_DATA的第6位是GPIO20_6的输出值,1为高电平、0为低电平。
【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯
上面分析可以粗略地用C语言来表示:

#define GPIO20_6_DATA	(*((volatile unsigned int *)0x110a43fc)) // 基地址0x110a4000 + 偏移地址0x3fc
GPIO20_6_DATA = 0x40;  //高电平
GPIO20_6_DATA = 0x0;  //低电平

示例代码:
// led.h
#ifndef __LED_H__
#define __LED_H__

#define GPIO20_6_FUNC	(*((volatile unsigned int *)0x17c701d0))
#define GPIO20_6_DIR	(*((volatile unsigned int *)0x110a4400)) // 基地址0x110a4000 + 偏移地址0x400
#define GPIO20_6_DATA	(*((volatile unsigned int *)0x110a43fc)) // 基地址0x110a4000 + 偏移地址0x3fc
//将常量直接转换成指针,然后再对指针取值

#endif //__LED_H__
// led.c
#include "led.h"
void delay(unsigned int n);
void led_main(void)
{
    //1.配置 GPIO20_6 管脚为 GPIO 功能
    GPIO20_6_FUNC = 0x0;//(GPIO20_6_FUNC & 0xFFFF0FFF) | 0x00001000;
	
    //2.配置 GPIO20_6 输出
    GPIO20_6_DIR = 0x40;
	
    //3.操作GPIO20_6_DATA bit为1
    while(1)
    {
        GPIO20_6_DATA = 0x40;
        delay(0x100000);
        GPIO20_6_DATA = 0x0;
        delay(0x100000);
    }
}
void delay(unsigned int n)
{
    while(n)
    {
        n--;
    }
}
# Makefile
led:led.o
	aarch64-mix210-linux-ld -nostartfiles -nostdlib -Ttext=0x42000000 -e led_main -o led led.o
	aarch64-mix210-linux-objcopy -O binary led led.bin

led.o:led.c
	aarch64-mix210-linux-gcc -nostdlib -c -o led.o led.c

clean:
	rm -vf led.o led led.bin


【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁文章来源地址https://www.toymoban.com/news/detail-499295.html

到了这里,关于【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【海思SS528 | MPP】音频例程 sample_audio.c 源码阅读笔记

    上篇文章 【海思SS528】MPP媒体处理软件V5.0 | 音频模块 - 学习笔记 学习了海思MPP媒体处理平台的一小部分音频知识,这篇文章继续学习与音频相关的例程,这样可以更好理解《MPP 媒体处理软件 V5.0 开发参考.pdf》中的音频模块知识。 本篇文章涉及到的SDK文件及路径说明: 《

    2024年02月12日
    浏览(52)
  • STM32的GPIO操作(寄存器&HAL)

    (注:此为乐某学习记录,若有出错的地方欢迎各位指出!) 本人使用的开发板的芯片是STM32H743XIH6,所以外设也是根据此芯片来介绍。 在使用HAL库配置的时候,需要安装STM32CubeMX。此软件可在ST官网下载,剩下的安装步骤比较简单,不会单独出篇进行讲解。 STM32CubeMX下载网址

    2024年02月04日
    浏览(43)
  • STM32 寄存器操作 GPIO 与下降沿中断

    寄存器本质就是一个开关,当我们把芯片寄存器配置指定的状态时即可使用芯片的硬件能力。 寄存器映射表则是开关的地址说明。对于我们希望点亮 GPIO_B 的一个灯来说,需要关注以下的两个寄存器:   对于我们实现希望点亮一个灯的需求来说,不仅需要配置配置 GPIO_B 的时

    2024年02月20日
    浏览(45)
  • 荔枝派zero驱动开发04:GPIO操作(寄存器方式)

    参考:https://wiki.sipeed.com/soft/Lichee/zh/Zero-Doc/Drive/GPIO_mmap.html 上一篇:荔枝派zero驱动开发03:设备树基础 下一篇:荔枝派zero驱动开发05:GPIO操作(使用GPIO子系统) :ioremap/iounmap,copy_from_user/copy_to_user,readl/writel 设备树修改: 本文不涉及设备树操作,但由于默认设备树

    2024年01月20日
    浏览(40)
  • ARM编程模型-寄存器组

    Cortex A系列ARM处理器共有40个32位寄存器,其中33个为通用寄存器,7个为状态寄存器。usr模式和sys模式共用同一组寄存器。 通用寄存器包括R0~R15,可以分为3类: 未分组寄存器R0~R7 分组寄存器R8~R14、R13(SP) 、R14(LR) 程序计数器PC(R15)、R8_fiq-R12_fir为快中断独有 在不同模式下,名称相同的

    2024年02月10日
    浏览(41)
  • 【汇编语言】栈区与SS:SP寄存器

    汇编语言 - 栈 栈是一块特殊的内存空间,本文涉及的CPU为8086CPU,所有与内存地址有关的数字皆为16进制 栈的运行规律 - 先进后出,后进先出 以下为入栈的过程: 以下是出栈的过程: 以上就是栈的运行机制,栈的入栈叫做push,出栈叫做pop 在8086CPU中,栈是一块特殊的内存空

    2023年04月08日
    浏览(50)
  • 【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。 串口在嵌入式中用途非常的广泛,主要的用途有: 打印调试信息; 外接各种模块:GPS、蓝牙; 串口因为结构

    2024年02月05日
    浏览(35)
  • [ARM 汇编]高级部分—系统控制协处理器—3.2.3 控制寄存器的读写操作

    在这一部分,我们将学习如何使用ARM汇编指令在系统控制协处理器(CP15)的控制寄存器上执行读写操作。我们将通过实例来讲解如何使用MCR(Move to Coprocessor Register)和MRC(Move from Coprocessor Register)指令进行读写操作。 MCR指令 MCR指令用于将ARM内核寄存器的值写入协处理器寄存

    2024年02月11日
    浏览(44)
  • 【裸机开发】GPT 定时器(一) —— GPT的功能、寄存器解析

    后续需要使用 GPT 计数器实现中断以及延时,这里我们需要先了解一下GPT的功能以及相关寄存器。 目录 一、GPT 定时器的功能 1、计数器 2、输入捕获 3、输出比较(GPT的两种工作模式) 二、寄存器解析 1、GPTx_CR 2、GPTx_PR 3、GPTx_SR 4、GPTx_IR 5、GPTx_OCRn 6、GPTx_ICRn 7、GPTx_CNT gpt 定时

    2024年02月12日
    浏览(38)
  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包