当前位置: 首页 > news >正文

基于IMX6ULLmini的linux裸机开发系列八:按键处理实验

目录

GIC相关寄存器

GPIO中断相关寄存器

中断服务函数表

中断向量表偏移位置

make有报错

解决方法:error: 'for' loop initial declarations are only allowed in C99 mode_‘for’ loop initial declarations are only allowed i_Young_2717的博客-CSDN博客


GIC相关寄存器

  • 分发器

    • 中断数量:GICD_TYPER

    • 中断清除: GICD_ ICENABLERn

    • 中断使能:GICD_ISACTIVERn

    • 中断优先级设置:GICD_IPRIORITYR

    详见GIC官方手册

    4.3 Distributor register descriptions

  • cpu接口单元

    • 中断优先级数量:GICC_PMR

    • 抢占优先级和子优先级设置: GICC_BPR

    • 保存中断ID:GICC_IAR

    • 通知cpu中断完成:GICC_EOIR

    详见GIC官方手册

    4.4 CPU interface register descriptions

GPIO中断相关寄存器

  • gpio中断触发类型:高/低电平、上升/下降沿

    • GPIO5_ICR1(0~15)

    • GPIO5_ICR2(16~31)

  • gpio中断屏蔽

    • GPIO5_IMR

  • gpio中断状态寄存器

    • GPIO5_ISR

  • gpio双边缘触发

    • GPIO5_EDGE_SEL

    详见芯片数据手册

  • 28.5 GPIO Memory Map/Register Definition

中断服务函数表

记录每个IRQ中断的回调函数

  • 函数指针

  • 函数参数

中断向量表偏移位置

C语言读写cp15协处理器

__ASM ( code : 输出操作数列表 : 输入操作数列表 );

  • code

    • 具体操作指令(字符串表示)

    • #是把宏参数变为一个字符串

    • ##是把两个参数连接在一起

    __STRINGIFY(p##coproc) ", ->"p15"

  • 操作数

    通过%加数字引用,比如%0 引用第一个操作数,%1 引用第二个操作数

    r:将变量放入通用寄存器

button.c

#include  "button.h"#include "interrupt.h"/*按键初始化函数*/void button_init(void){/**********************************第一部分***********************************//*时钟初始化*/CCM->CCGR1 = 0xffffffff;/*设置 key引脚的复用功能以及PAD属性*/IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);     IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0); /*设置GPIO5_01为输入模式*/GPIO5->GDIR &= ~(1<<1);  /**********************************第二部分**************************************//*使能GPIO5_1中断*/GPIO5->IMR |= (1<<1);/*禁止GPIO5_1中断双边沿触发*/GPIO5->EDGE_SEL  =  0;/*设置GPIO5_1上升沿触发*/GPIO5->ICR1 |= (2<<2);/*添加中断服务函数到  "中断向量表"*/system_register_irqhandler(GPIO5_Combined_0_15_IRQn, (system_irq_handler_t)GPIO5_1_IRQHandler, NULL);/*开启GIC中断相应中断*/GIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);}void GPIO5_1_IRQHandler(void){/*按键引脚中断服务函数*/if((GPIO5->DR)&(1<<1)){if(button_status > 0){button_status = 0;}else{button_status = 1;}}/*清除Gpio5_1中断标志位*/GPIO5->ISR |= (1 << 1);  }

make有报错

gec@ubuntu:~/bare_mental/part_5$ make 
mkdir -p build
arm-none-eabi-gcc -c sources/project/main.c -o build/main.o   -Iinclude  -Isources/button  -Isources/common  -Isources/irq  -Isources/led 
arm-none-eabi-gcc -c sources/common/common.c -o build/common.o   -Iinclude  -Isources/button  -Isources/common  -Isources/irq  -Isources/led 
arm-none-eabi-gcc -c sources/irq/interrupt.c -o build/interrupt.o   -Iinclude  -Isources/button  -Isources/common  -Isources/irq  -Isources/led 
sources/irq/interrupt.c: In function 'irq_init':
sources/irq/interrupt.c:18:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
     for(int i = 0; i < NUMBER_OF_INT_VECTORS; i++)
     ^
sources/irq/interrupt.c:18:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
Makefile:42: recipe for target 'build/interrupt.o' failed

解决方法:error: 'for' loop initial declarations are only allowed in C99 mode_‘for’ loop initial declarations are only allowed i_Young_2717的博客-CSDN博客

使用gcc编译代码是报出

error: 'for' loop initial declarations are only allowed in C99 mode

note: use option -std=c99 or -std=gnu99 to compile your code

错误,这是因为在gcc中直接在for循环中初始化了增量:
    for(int i=0; i<len; i++) {
    }
这语法在gcc中是错误的,必须先先定义i变量:
int i;
for(i=0;i<len;i++){
 
}

这是因为gcc基于c89标准,换成C99标准就可以在for循环内定义i变量了:

gcc src.c -std=c99 -o src

也就是

就可以了

http://www.lryc.cn/news/135971.html

相关文章:

  • 数据结构好题总结
  • Java串口开发
  • Python nohup 启动python脚本,后台没有日志
  • 完美解决微信小程序使用复选框van-checkbox无法选中
  • IDEA报错:类文件具有错误的版本 61.0,应为52.0
  • Linux 挂载局域网内共享目录
  • FFmpeg解码32k大分辨率出现如下错误:Picture size 32768x32768 is invalid
  • EasyExcel+POI制作带有有效性校验及下拉联动的Excel模板
  • Unity怎么制作魔法火焰特效?Unity制作魔法火焰特效方法
  • 双基证券:房地产基本面仍处下行通道 政策有望促进走稳
  • 31、springboot 配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口
  • 会计如何使用ChatGPT提高工作效率
  • 【TypeScript】类型推论和类型别名
  • 字节码调教的入口 —— JVM 的寄生插件 javaagent 那些事
  • Blender卡通着色入门
  • 性能调优篇 一、Jvm监控及诊断工具-命令行篇
  • Docker部署MongoDB 5.0.5
  • Day18-2-地狱回调-Promise-async-await技术
  • echarts范围限制下性能问题
  • wazuh环境配置以及案例复现
  • 解决el-select回显异常 显示option选项的value 而不是显示label
  • 【【STM32-SPI通信协议】】
  • 板卡常用前端 数据表操作
  • 基于AVR128单片机世界电子时钟的设计
  • Electron学习2 使用Electron-vue和Vuetify UI库
  • Java“牵手”根据商品分类ID获取速卖通商品分类详情页面数据获取方法,速卖通API实现批量商品数据抓取示例
  • QT 使用图表
  • SSRF 服务器端请求伪造
  • shell 05(shell索引数组变量)
  • 爬虫异常处理:异常捕获与容错机制设计