ARM裸机开发-蜂鸣器与按键

利用imx6ull板学习裸机arm板开发(6.22-6.24) 一、代码编写编译环境:代码编写:在windows下载一个vs code编写源码,通过FiliZilla软件上传到ubantu,编译:在linux的ubantu终端编译。具体步骤: 1、在https://www.filezilla.cn/download下载FileZilla,FileZilla作为客户端, Ubuntu作为服务端。此外还需要在Ubuntu下安装SSH服务器: sudo apt-get install vsftpd ,并配置文件: sudo vi /etc/vsftpd.conf 阅读详情

目录

一.蜂鸣器

1.查看底板原理图

2.查找开发手册

1.先看复用功能

2.再看电气属性

3.查找GPIO功能

3.代码实现

1.先导入ARM固件库

2.调用库函数

3.源码解读

1.引脚复用及电气函数实现

2.GPIO功能实现

3.CCM功能实现

二.按键

1.查看底板原理图

2.查找开发手册

1.复用实现

2.电气属性

3.代码实现

三.清空bss段

1.创建imx6ull.lds文件

2.清空bss与common

3.项目创建规范

四.将GPIO功能封装

1.GPIO封装

2.LED 调用

3.BEEF 调用


继上篇使用汇编完成LED点灯功能后,本篇将使用C语言的固件库进行后续的开发

首先对外设功能实现可概括为以下三步

1.先看底板原理图找到对应外设及引脚;

2.再去开发手册里找对应引脚的复用以及电气实现;

3.在VScode对相应的GPIOx寄存器进行赋值。

一.蜂鸣器

1.查看底板原理图

显然给低电平蜂鸣器工作。

2.查找开发手册

由于引脚以默认功能命名,故BEEP对应引脚名即SNVS  TAMPER1,也即该引脚的默认功能,而由于蜂鸣器为GPIO功能,故该引脚一定可以复用为GPIO功能,则应去参考手册的复用功能的SNVS开头寻找

1.先看复用功能

由上图可知,MUX_MODE只有101一种值,故该引脚只有默认GPIO5_IO01的一个功能复用。

2.再看电气属性

由于蜂鸣器也是输出模式,与LED灯一样,对电气属性这些设置默认值,设为0x10B0,和LED灯一样即可(具体可参考上篇LED灯的电气属性)

3.查找GPIO功能

给GPIO5的bit1置0,BEEP对应引脚即为低电平工作

设置GDIR为输出模式

3.代码实现

1.先导入ARM固件库

2.调用库函数

void beep_init(void)
{
    // 配置引脚复用功能
    IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0); 

    // 配置引脚电气属性
    IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0);

    // 配置引脚方向:输出方向
    GPIO5->GDIR |= (1 << 1);
}
void beep_on(void)
{
    GPIO5->DR &= ~(1 << 1);
}

void beep_off(void)
{
    GPIO5->DR |= (1 << 1);
}

void beep_nor(void)
{
    GPIO5->DR ^= (1 << 1);
}

// 使能外设时钟
void enable_clocks(void)
{
    CCM->CCGR0 = 0xFFFFFFFF;
    CCM->CCGR1 = 0xFFFFFFFF;
    CCM->CCGR2 = 0xFFFFFFFF;
    CCM->CCGR3 = 0xFFFFFFFF;
    CCM->CCGR4 = 0xFFFFFFFF;
    CCM->CCGR5 = 0xFFFFFFFF;
    CCM->CCGR6 = 0xFFFFFFFF;
}

3.源码解读

1.引脚复用及电气函数实现

先是引脚的名字,再是引脚的具体复用功能,不同引脚具有不同的复用功能,如下图所示,上篇点亮LED灯对应的GPIO1_IO03引脚具有多个复用功能,而SNVS_TAMPER1则只有GPIO5_IO01的功能。

首先IOMUXC_SetPinMux函数传递两个参数,一个带参宏,一个int型数据,前者为定义一个宏传五个参数,如下

而根据函数定义,需要传递六个参数,故定义第一个参数宏为了方便传参,传一个宏等于传五个参数,如下图所示,六个参数分别代表引脚复用寄存器,引脚复用模式,选择输入寄存器,输入压摆率,电气属性配置寄存器地址,以及软件输入开启,对应SION位

IOMUXC_SetPinConfig函数则同理,用于设置电气属性,唯有第二个参数为要配置的电气属性的值,蜂鸣器与LED灯由于都是输出模式,故可采用相同的默认值,前文也已经提到。

2.GPIO功能实现

显然底层源码通过宏定义,指定了对应的GPIOx的基地址,将GPIOx的基地址强转为GPIO_Type *的指针,而GPIO_Type则为定义了GPIO里的8个寄存器的结构体,如此即可通过GPIOx指针访问对应结构体成员的寄存器进行赋值。

而__IO,__I,__O则被定义为volatile

//指针前加volatile,表示通过该指针访问的内存空间中的内容不会被优化
//volatile 避免编译器对该变量的任何操作进行优化
//部分SOC中写1清0,很奇怪,老师也不懂
//例如
int i = 0x01; //0x 0000 0001 
i = i;  //0x 0000 0001 = 0x 0000 0001,把自己写入,为1的bit则清0,即可将bit0清0 
//若不加volatile,编译器则会认为i = i为冗余指令,自动优化
3.CCM功能实现

其中,RESERVED数组用来占位,用于内存对齐

在单片机的“寄存器映射”(Register Map)中,物理地址并不是每一个字节都有对应的寄存器。寄存器之间往往会留有空隙(保留区域)。

C 语言的结构体在内存中是连续分配的。如果不用数组占位,编译器会认为 CSCDR3 后面紧接着就是 CDHIPR,这会导致结构体成员的地址偏移与硬件实际物理地址完全错位。

显然CCM_Type结构体同GPIO一样,内部定义了对应的寄存器,与参考手册的寄存器一一对应。

而通过对CCM_BASE赋值得到基地址,再强转为CCM_Type类型,定义为CCM,此时即可通过CCM指针访问寄存器的值。

二.按键

ON/OF按键为控制低功耗模式,中间为复位按键,而用户能真正操作的按键只有这个黄色的按键KEY0,也就是本次要实现的功能。

1.查看底板原理图

按键没有被按下时,KEY0与上拉电阻连接,为3.3V高电平,按键按下,接通GND,则置为低电平

显然默认为串口1功能,而 按键为GPIO功能,所以仍要在引脚复用章节查看手册。

2.查找开发手册

1.复用实现

显然只有0101为GPIO功能,即为key的实现

2.电气属性

key为输入模式,则对于电气属性的配置应有些改变。

HYS默认即可

PUS为设置电阻,而硬件图里有一个10k的上拉电阻,此处应选择11,22k的上拉电阻,与10k的电阻并联,总电阻值应小于10k,现在市面上的芯片内部设计对内部电阻有一定要求,4.7k--10k之间

PUE置1,控制引脚使用上拉

PKE打开PUE的开关,为1表示PUE上拉保持功能开,置1

后面的默认值即可,0xF0B0

3.代码实现

void key_init(void)
{
    // 引脚复用功能
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
    // 引脚电气属性
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF0B0);
    // 按键引脚初始化
    GPIO_Type_t t = 
    {
        .direction = gpio_input//输入功能,无需配置引脚电平
    };
    gpio_init(GPIO1, 18, &t);

}
int key_press(void)
{
    if (gpio_get_value(GPIO1, 18) == 0)
    {
        return 1;
    }
    else  
    {
        return 0;
    }
}

三.清空bss段

由于在链接时,只写了text段的地址,对于其他如data段,rodata段,commom段,bss段也应给编译器地址

.text段:存放的代码、指令-Ttext878000000
bss段:存放初始化为0的全局变量和静态变量
.common段:存放未初始化的全局变量
.data段:存放的已经初始化的全局变量和静态变量
.rodata段:存放的是只读常量

1.创建imx6ull.lds文件

lds代表链接脚本文件。

SECTIONS
{
    . = 0x87800000; //. 表示当前地址计数器,将 0x87800000赋给当前地址
    .text :        //在当前地址存放text段
    {
        obj/start.o //start.o作为启动代码应该放在最前面
        *(.text)    //*表示将所有文件的text段放在此处
    }

    .rodata ALIGN(4) : {*(.rodata*)}    //ALIGN(4)表示按四字节对齐
//(.rodata*)表示包括所有rodata类型
    .data ALIGN(4) : {*(.data)}
    . = ALIGN(4);
    __bss_start = .;    //将当前地址作为起始地址
    .bss ALIGN(4) : {*(.bss) *(COMMON)}    //bss段与common段为未初始化的值,都需要清零
    __bss_end = .;     ////将当前地址作为结束地址
}
   
## 关于段名中的通配符说明
在链接脚本中,经常会看到类似`*(.rodata*)`这样的写法,这里包含两个`*`通配符,它们有不同的含义:

1. 第一个`*`:
   - 表示收集所有输入文件中的相关段
   - 如果不加这个`*`,就只会收集特定文件的段

2. 第二个`*`(如`rodata*`中的`*`):
- 实际编译时会产生多种rodata相关的段,例如:
     - `.rodata`:基本的只读数据段
     - `.rodata.str1.1`:长度为1字节对齐的字符串常量
     - `.rodata.str1.4`:长度为4字节对齐的字符串常量
     - `.rodata.cst8`:8字节常量(如double类型的常量)
     - `.rodata.cst4`:4字节常量(如float类型的常量)

如果只写`*(.rodata)`而不是`*(.rodata*)`:
- 只会收集严格命名为`.rodata`的段
- 其他相关的只读数据段(如`.rodata.str1.1`等)会被遗漏
- 这些被遗漏的数据可能导致程序无法正常工作
同时makefile的链接,-T0x8700 0000地址换为	-Timx6ull.lds
arm-linux-gnueabihf-ld -Timx6ull.lds $(objs) -o $(target).elf

2.清空bss与common

在启动代码的复位函数中应增加对bss段清零的操作

_reset_handler:
    // 设置irq模式
    mrs r0, cpsr
    bic r0, r0, #0x1F
    orr r0, r0, #0x12  
    msr cpsr, r0
    // 设置irq模式下的栈(32M)
    ldr sp, =0x86000000

    // 设置system模式
    mrs r0, cpsr
    bic r0, r0, #0x1F
    orr r0, r0, #0x1F
    msr cpsr, r0
    // 设置system模式下的栈
    ldr sp, =0x84000000
    // 清空bss与common段
    bl _bss_clear

    b main

_bss_clear:
    ldr r0, =__bss_start
    ldr r1, =__bss_end

loop:
    mov r2, #0
    str r2, [r0]
    add r0, r0, #4
    cmp r0, r1
    blt loop
    bx lr

3.项目创建规范

最后,工程创建最好有一定的规范,如下

四.将GPIO功能封装

通过对前面外设功能的实现,我们发现对于这种实现流程相似的功能可以封装函数,创建GPIO.c与GPIO.h实现,这样代码将具有更好的复用性。

1.GPIO封装

GPIO.h
// GPIO引脚方向枚举
enum GPIO_Direction
{
    gpio_input,
    gpio_output
};

// GPIO信息结构体
typedef struct 
{
    enum GPIO_Direction direction;       // 引脚方向
    int default_value;                   // 引脚默认电平
}GPIO_Type_t;
GPIO.c
// gpio初始化
void gpio_init(GPIO_Type *base, int pin, GPIO_Type_t *gpio)  //GPIOx(第几组), 几号引脚,定义的GPIO_Type结构体
{
    if (gpio->direction == gpio_output)
    {
        base->GDIR |= (1 << pin);
        if (gpio->default_value)
        {
            base->DR |= (1 << pin);
        }
        else    
        {
            base->DR &= ~(1 << pin);
        }
    }
    else if (gpio->direction == gpio_input)
    {
        base->GDIR &= ~(1 << pin);
    }
}

// gpio写
void gpio_set_value(GPIO_Type *base, int pin, int value)
{
    if (value)
    {
        base->DR |= (1 << pin);
    }
    else 
    {
        base->DR &= ~(1 << pin);  
    }
}

// gpio读 1高电平 0低电平
int gpio_get_value(GPIO_Type *base, int pin)
{
    return (base->DR & (1 << pin)) != 0;
}

2.LED 调用

3.BEEF 调用

Exynos4412裸机开发综合练习 下面是一个案例需求: 1、编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警; 2、其具体要求如下;  a) 程序下载20s后,进入电压采集状态(使用RTC ALARM功能完成), 要求1s采集1次电路板电压值;(采用RTC TIME TICK完成) b) 每次电压采集完成后,通过COM2将采集到的电压值发送到PC,在PC端可 阅读详情

相关推荐

三角洲自动购买工具 —— 基于 OCR 的价格识别与自动点击

通过的方式,我们可以轻松实现自动化的“价格监控 + 自动点击”工具。它的优势在于通用性—— 只要能截屏识别价格,就能用于任何程序,不依赖特定 API。未来可以扩展的功能:自动保存配置到文件。支持多价格区域检测。增加快捷键启停功能。

qq_62975494的博客 2418

ARM嵌入式裸机开发:LED、蜂鸣器、按键GPIO驱动实战

嵌入式裸机开发是深入理解硬件底层的必经之路,其核心在于直接操作寄存器,实现对GPIO的精准控制。与依赖操作系统的PC程序不同,裸机C语言通过物理地址读写芯片寄存器,能使每一行代码与硬件的实际动作一一对应,这其中volatile关键字更是避免优化陷阱的关键。围绕LED流水灯、蜂鸣器发声与按键检测这三类典型GPIO应用,文章从原理图分析、寄存器映射到模块化编程层层展开,展示了位运算、宏封装、状态机等基础技巧在实际工程中的应用。掌握这套驱动方法,不仅能点亮一颗LED,更能为后续学习定时器、中断等复杂外设建立可迁移

weixin_29163797的博客 198

别再被坑了!手把手教你从官网下载免费正版Notepad++(附最新网盘链接)

本文详细指导如何从Notepad++官网安全下载正版软件,避免山寨版本带来的安全风险。通过识别官网特征、推荐官方下载渠道、揭露山寨网站骗局及验证正版功能,帮助用户高效获取纯净的Notepad++代码编辑器,并分享实用插件和配置优化技巧。

weixin_42527654的博客 562

ARM嵌入式C语言裸机开发:LED、蜂鸣器与按键的寄存器操作实战

GPIO是嵌入式开发中连接处理器与外设的核心接口,几乎所有传感器、执行器都依赖其电平输入输出能力。寄存器操作的本质是对特定内存地址读写,通过位运算和volatile关键字即可精确控制引脚状态。理解时钟使能、模式配置、上下拉与消抖原理,是进行底层驱动开发的必备基础。在LED点亮、蜂鸣器驱动与按键检测等典型场景中,C语言直接操作寄存器不依赖HAL库,既保证了代码的可移植性,也能帮助开发者真正理解硬件工作机制。本文以ARM嵌入式裸机开发为背景,系统讲解GPIO寄存器配置方法与常用外设的驱动实现,并给出常见问题排查

weixin_29168393的博客 247

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 534

【人工智能时代】- 一键部署本地AI大模型

Ollama是一个开源项目,致力于简化大型语言模型(LLM)的本地部署过程。它允许用户在自己的硬件上运行和测试最新的语言模型,无需依赖云服务。Ollama提供了一个类似于OpenAI的API接口,使得开发者可以轻松地在自己的应用程序中集成大型语言模型。此外,Ollama WebUI为用户提供了一个友好的界面,用于管理和与模型进行交互。

xiaoli8748的专栏 2383

(四)arm裸机开发--- KEY按键输入,控制蜂鸣器

前面章节我们只介绍了GPIO的输出功能,这一节我们介绍输入功能,通过KEY按键的输入控制蜂鸣器响。 目录一.硬件原理图二.配置GPIO三.编写代码总结 一.硬件原理图 可以看到只有key0贴片了,管脚为UART1_CTS。当没有按下时,管脚状态为高,按下时,管脚状态为低。 二.配置GPIO 下面的数据都是通过芯片手册查到的。 1.配置时钟。为了方便起见,我们将所有的时钟全部打开。 2.配置复用功能,IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B寄存器设置为0x5,即标准IO GPIO

Engineering Lion的博客 1053

HTML满屏跳动的爱心(完整代码)

HTML语言实现满屏跳动爱心的完整代码。

AIGC 12万+

【嵌入式】——arm裸机开发 step by step 之 按键控制 LED 和 蜂鸣器

一、arm-9 TQ2440  key.h 1 #ifndef __KEY_H__ 2 #define __KEY_H__ 3 4 #define GPFCON (*(volatile unsigned long *)0x56000050) 5 #define GPFDAT (*(volatile unsigned long *)0x56000054) 6 7...

weixin_33881140的博客 736

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9653

39、FIPA ACL:多代理系统中的标准化通信

本文详细介绍了FIPA ACL(Agent Communication Language)的基本概念、言语行为理论基础以及其在多代理系统(MAS)中的应用。文章涵盖了FIPA ACL的消息格式、信息交流流程、实现与优化方法,并通过智能调度系统的实例展示了其实际应用效果。此外,还探讨了FIPA ACL面临的挑战及未来发展方向,如通信延迟优化、本体简化、安全性增强等。

k8s6orchestrator的博客 381

视频教程-ARM裸机程序开发入门-嵌入式

ARM裸机程序开发入门 嵌入式工程师、嵌入式讲师、10多年嵌入式开发实战经验...

weixin_29043193的博客 186

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ARM嵌入式入门:LED闪烁、蜂鸣器报警与按键中断的工程化实现

嵌入式开发的核心不只是点灯,而是如何用工程化思维组织GPIO、中断与状态机。以Cortex-M3内核MCU为例,通过LED闪烁、蜂鸣器报警和按键中断三个基础外设的联动,讲解从时钟配置、GPIO复用到EXTI外部中断的完整流程。文章深入SysTick延时机制与中断服务函数的规范写法,强调中断中只置标志位、主循环处理逻辑的裸机架构思想。这种“按键事件→状态迁移→外设响应”的模型广泛应用于智能硬件、工业控制与物联网终端。掌握GPIO初始化、外部中断映射、软件防抖与基于时间戳的调度方法,就能轻松构建可复用的嵌入式工

weixin_29161785的博客 104

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ARM裸机程序开发入门-沈寒-专题视频课程

本课程主要讲解ARM汇编语言在硬件上的编程应用,相关硬件的原理图分析,LED、蜂鸣器、按键、光感设备的裸机开发。

91创客学堂 285

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ARM嵌入式开发代码实践——LED灯闪烁+蜂鸣器报警+按键控制(DSP版)

本文介绍了一个基于i.MX6ULL处理器的嵌入式裸机开发项目,实现了LED灯、蜂鸣器和按键控制功能。项目采用模块化设计,包含LED驱动、蜂鸣器驱动、按键检测等核心模块,通过GPIO接口实现硬件控制。系统上电后初始化外设时钟和硬件接口,在主循环中检测按键状态并控制LED和蜂鸣器状态翻转。文章详细阐述了项目架构、代码实现、硬件连接及编译烧录流程,重点讲解了GPIO配置、启动文件、链接脚本等关键技术要点,为嵌入式裸机开发提供了实践参考。

2301_78295956的博客 790

嵌入式开发,裸机开发,中断,按键控制蜂鸣器。

嵌入式,按键,中断,蜂鸣器,按键抖动,ARM

weixin_43920383的博客 1407

ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

1、按键输入简介 2、硬件原理图分析 3、实验程序的编写 3.1、bsp_gpio.h 3.2、bsp_gpio.c 3.3、gpio_key.h 3.4、gpio_key.c 3.5、main.c 4、编译下载验证 4.1、连接脚本的编写 4.2、Makefile的编写 4.3、编译下载

zhuguanlin121的博客 597

Tiny6410裸机程序led灯控制、跑马灯、蜂鸣器等的实现原理、过程、代码

一、开发板实验实现功能:1、K1-K4按下分别点亮Led1-Led42、k5按下,Led1-Led4全亮3、K6按下,Led1-Led4全灭4、K7按下,实现Led1-Led4循环点亮(跑马灯)5、K8按下,实现Buzzer1响起,K8松开,Buzzer1停止二、过程...

追梦小猿的博客 2254

从51到ARM裸机开发实验(005)LPC2138 GPIO实验

实现这样一种场景:四个按键作为开关、四个LED作为响应,每个开关控制一盏灯,按一次开灯,再按一次关灯。再接入一个蜂鸣和另外两个按键作为音量加和音量减,音量加每按一次蜂鸣器音量增加5%,音量减每按一次音量减少5%。这次将MCU替换成LPC2138芯片,LPC2138是飞利浦公司推出的基于ARM7TDMI-S内核的微控制器,属ARMv4架构。与STM32同属ARM系列,其编程方式也与STM32类似。

ThinkCockpit的博客 2324

I.MX6uLL裸机开发:按键输入LED蜂鸣器实验

将寄存器IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1 bit[3:0]设置为101复用成GPIO5_IO01。按键初始化将寄存器IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B位bit[3:0]设置为0101即复用位GPIO1_IO18。设置蜂鸣器电气属性,将寄存器IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER1的bit[16:0]设置为0x10B0。需要按键输入,所以bit[5:3]需要设置为000,剩余位倒不是很重要。

ls20010901的博客 1939

Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入)

Linux之ARM(MX6U)裸机按键输入实验(GPIO读取)1、按键输入简介2、硬件原理图分析3、实验程序的编写3.1、bsp_gpio.h3.2、bsp_gpio.c3.3、gpio_key.h3.4、gpio_key.c3.5、main.c4、编译下载验证4.1、连接脚本的编写4.2、Makefile的编写4.3、编译下载 前面几篇文章试验都是讲解如何使用 I.MX6U 的 GPIO 输出控制功能, I.MX6U 的 IO 不仅能作为输出,而且也可以作为输入。 I.MX6U-ALPHA 开发板上有一个

一只青木呀 1909

Linux-ARM裸机(五)-蜂鸣器与按键输入

本篇介绍了SOC控制蜂鸣器的驱动和控制按键输入驱动的编写,以及模块化gpio驱动,便于其余工程直接调用。

嵌入式入坑,专注点灯。 580

【ARM自学笔记】按键蜂鸣器(裸机)

描述 按键控制蜂鸣器开关。裸机。 原理分析 读取按键的IO值,根据IO值去控制有源蜂鸣器。 电路分析 按键原理图如下: 且KEY0是接到USART1_CTS这个IO上。 接上拉电阻,没有按下时为高电平;按下时为低电平。 代码 GPIO相关驱动 #include "bsp_gpio.h" /* * GPIO初始化。 */ void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config) { if(config->direc

qq_45628620的博客 745

Linux之ARM(MX6U)裸机之按键输入实验(GPIO的输入、输出)

Linux之ARM(MX6U)裸机之按键输入实验(GPIO的输入、输出)1.按键输入简介2. 硬件原理分析3.实验程序编写3.1编写bsp_gpio.h3.2编写bsp_gpio.c3.3编写bsp_key.h3.4编写bsp_key.c3.5修改main.c4. 编译下载验证4.1编写 Makefile4.2链接脚本编写4.3 编译下载 前面几章试验都是讲解如何使用 I.MX6U 的 GPIO 输出控制功能,I.MX6U 的 IO 不仅能作 为输出,而且也可以作为输入。I.MX6U-ALPHA 开发板上

weixin_47932709的博客 981
上一篇: ARM裸机开发-点亮LED灯
下一篇: ARM裸机开发-中断
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值