ADI Blackfin DSP处理器-BF533的开发详解16:KEY按键的实现(含源代码)

news2024/11/20 7:17:28

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

实现原理

ADSP-EDU-BF53x 开发板上的按键连接到了 CPLD,通过 CPLD 将按键信号与 EBIU 总线和中断管脚 PF0 连接,并将中断数据地址映射在 CPLD 的当有按键按下后,会触发 PF0 中断信号,同时可以通过 EBIU 总线访问中断功能映射到 CPLD 寄存器中的 INTERRUPT_DAT 寄存器,通过访问该寄存器,可以获取键盘的中断源数据,通过读取CPLD 的 KEYBOARD_DAT 寄存器,可以获取当前触发中断的按键的键值。

其寄存器映射如下:
DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能

在这里插入图片描述

PF0_SET:PF0 模拟 IIC 总线 SCL 接口或 PF0 中断功能使能
1:关闭 I2C_SCL 输入信号, 使能 PF0 中断信号
0:使能 I2C_SCL 输入信号,关闭 PF0 中断信号
使用中断时,将 PF0_SET 位设置为1。

KEYBOARD_DAT 寄存器(读唯一):
KEYBOARD_DAT 寄存器地址:0x20380000
KEYBOARD_DAT 寄存器是按键数据寄存器,通过该寄存器可以读取当前按键键值,通过键值判断当前哪个按键按下。

KEYBOARD_DAT 寄存器位:

在这里插入图片描述

INTERRUPT_DAT 寄存器(读唯一):
INTERRUPT_DAT 寄存器地址:0x20360000
INTERRUPT_DAT 寄存器是板卡上所有中断资源的中断源数据寄存器,可以通过该寄存器数据判断出当前中断是哪一个设备产生的。

INTERRUPT_DAT 寄存器位功能:

在这里插入图片描述

当中断未触发时,读取的 Bit 位值为 1,当中断触发时,读取的 Bit 位值为 0,根据 Bit 位数据,获取中断设备。SD_INF 为 SD 卡插入查询位,该 bit 位不会触发中断,只能通过读取该寄存器来查询 SD 卡是否插入。

硬件连接示意图

在这里插入图片描述

代码实现功能

代码实现了查询法和中断法两种读取按键键值的方式,并将读到键值与按键对应,打印出按键信息。

查询法:
需要将 key.c 文件中的宏开关“#define KEY_INT_ENABLE”注释掉,运行代码后,程序会不停地扫描按键,等待按键触发,按下按键后,则读取键值并打印出按键信息。

中断法:
需要将 key.c 文件中的宏开关“#define KEY_INT_ENABLE”打开,运行代码后,程序会等待中断触发,中断触发后,判断是否为按键中断,如果为按键中断,则读取键值并打印出按键信息,否则退出中断等待下次中断触发。

测试步骤

  1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
  2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
  3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
  4. 加载 VisualDSP++ 5.0 工程文件 BF53x_KEY.dpj,编译并全速运行。
  5. 按下按键。

测试结果

代码会打印出触发按键的信息。

在这里插入图片描述

程序源码

#include <cdefBF533.h>
#include <sys\exception.h>
#include “cpld.h”
//#define KEY_INT_ENABLE

EX_INTERRUPT_HANDLER(FlagA_ISR);

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Init_Flags(void)
{
*pFIO_INEN = 0x0001;
*pFIO_DIR = 0x0000;
*pFIO_EDGE = 0x0001;
*pFIO_POLAR = 0x0001;
*pFIO_MASKA_D = 0x0001;
}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xffff5fff;

register_handler(ik_ivg12, FlagA_ISR);		
*pSIC_IMASK = 0x00080000;

}

EX_INTERRUPT_HANDLER(FlagA_ISR)
{
unsigned char interrupt=0;
unsigned char keydata;
if(~*pINTERRUPT_DAT & KEY_INT)
{
keydata = ~*pKEYBOARD_DAT; //读键值
switch(keydata)
{
case LUK: printf(“The key is left->up\n\r”); break;
case LLK: printf(“The key is left->left\n\r”); break;
case LDK: printf(“The key is left->down\n\r”); break;
case LRK: printf(“The key is left->right\n\r”); break;
case RUK: printf(“The key is right->up\n\r”); break;
case RLK: printf(“The key is right->left\n\r”); break;
case RDK: printf(“The key is right->down\n\r”); break;
case RRK: printf(“The key is right->right\n\r”); break;
default:
}
}

*pFIO_FLAG_C = 0x0001;	

}
void main(void)
{
Set_PLL(16,4);
Init_EBIU();
printf(“Please press the Keyboard!\n”);

#ifdef KEY_INT_ENABLE

Init_Interrupts();
ExtIO_Interrupt_Enable();
Interrupt_Enable();			
Init_Flags();

#else
unsigned char keydata;
while(1)
{
keydata = ~*pKEYBOARD_DAT; //读键值
if(keydata & LUK)
printf(“The key is left->up\n\r”);
if(keydata & LLK)
printf(“The key is left->left\n\r”);
if(keydata & LDK)
printf(“The key is left->down\n\r”);
if(keydata & LRK)
printf(“The key is left->right\n\r”);
if(keydata & RUK)
printf(“The key is right->up\n\r”);
if(keydata & RLK)
printf(“The key is right->left\n\r”);
if(keydata & RDK)
printf(“The key is right->down\n\r”);
if(keydata & RRK)
printf(“The key is right->right\n\r”);
}
#endif

 while(1);	  

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python做曲线拟合(一元多项式拟合及任意函数拟合)

目录 1. 一元多项式拟合 使用方法 np.polyfit&#xff08;x, y, deg&#xff09; 2. 任意函数拟合 使用 curve_fit() 方法 实例&#xff1a; &#xff08;1&#xff09;初始化 x 和 y 数据集 &#xff08;2&#xff09;建立自定义函数 &#xff08;3&#xff09;使用自…

数字滤波算法 在数字信号处理应用中使用微控制器

提示&#xff1a;数字滤波算法 在数字信号处理应用中使用微控制器 文章目录1.介绍1.1. 关键点2. 数字FIR滤波器2.1. 数字滤波器算法2.1.1. IIR滤波器算法2.1.2. FIR滤波器算法2.2. C8051F12x和C8051F36x的FIR算法实现2.2.1. 实施优化2.2.2. FIR滤波器示例2.3. 运行FIR演示2.3.1…

ML.NET 奇异谱分析(SSA Singular spectrum analysis)预测实践

一、奇异谱分析(Singular Spectrum Analysis, SSA) 简介 奇异谱分析(Singular Spectrum Analysis, SSA)是一种处理非线性时间序列数据的方法&#xff0c;通过对所要研究的时间序列的轨迹矩阵进行分解、重构等操作&#xff0c;提取出时间序列中的不同成分序列(长期趋势&#xff…

Linux命令_ps 进程管理

简介 ps通过读取 /proc 中的虚拟文件来工作&#xff0c;不需要 setuid kmem 或有任何特权来运行。 CPU使用率目前表示为进程整个生命周期中运行所花费时间的百分比。这是不理想的&#xff0c;它不符合ps在其他方面所符合的标准。CPU使用率加起来不太可能达到100%。 SIZE和RSS字…

ORB-SLAM2 ---- ORBmatcher::SearchForInitialization函数

目录 1.函数作用 2.执行流程 3.函数参数解析 4.code 5.函数解析 5.1 旋转直方图的构建与作用 5.2 遍历帧1中的特征点在帧2中找出候选匹配特征点 5.3 第一层筛选 -- 阈值、最优/次优比例、重复匹配 5.4 第二层筛选 -- 旋转直方图 5.5 final 将最后通过筛选的匹…

web前端课程设计——动漫网页2个网页HTML+CSS web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【图】深度优先遍历 广度优先遍历

文章目录一、广度优先遍历二、深度优先遍历深度优先遍历和广度优先遍历是遍历图的两种常见方式&#xff0c;接下来就通过这两种方式来实现一下图具体遍历的过程 当我位于游乐园的景区 A 时&#xff0c;为了玩遍所有的景区我们有两种玩的方式&#xff1a; 方式一&#xff1a; …

HDLbits——移位寄存器

移位寄存器 1 4 位移位寄存器 module top_module(input clk,input areset, // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always (posedge clk or posedge areset) beginif (areset)q<4h0;else if(load)q<data;els…

linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本

前言&#xff1a; shell脚本的功能十分强大&#xff0c;这一点毋庸置疑的。那么&#xff0c;平常的工作中总是免不了和脚本打交道&#xff0c;也免不了要自己编写一些脚本。 每个人都希望自己编写的脚本强壮&#xff0c;简单&#xff0c;易用&#xff0c;功能多&#xff0c;并…

CDH中某一结点任务异常,节点服务重启失败报错:No space left on device

文章目录Error Message - 报错信息Analysis Process - 分析思路Solution - 解决方案Error Message - 报错信息 今天发现cdh集群的某一个节点任务爆红了&#xff0c;因为是测试的服务器&#xff0c;一般我都会尝试直接重启&#xff0c;但是该节点服务关闭后&#xff0c;竟然都无…

Spring Web

目录 概述 SpringMVC的组件 DispatcherServlet HandlerMapping HandlerAdapter SpringWeb的运行流程 Controller类的编写 RestController注解 RequestMapping注解 SpringWeb搭建 获取请求参数 解决POST请求中文乱码问题 Ajax返回JSON数据 跨域问题的解决 拦截器 …

LabVIEW与SQL Server 2919 Express通讯

LabVIEW与SQL Server 2919 Express通讯 ​LabVIEW与数据库通讯&#xff0c;可以使用数据库连接工具包。一般小型数据库用Access就可以了。但是对于长时间&#xff0c;需要存储空间较大的场合&#xff0c;Access一般不超过2G。这样就需要更换其他数据了。 SQL Server不同版本存…

MDC Service 基于 ESP32 推出树莓派 4 形态的 EsPiFF

当您的应用在树莓派 4 上运行不够稳定或耗电量过大时&#xff0c;您可以考虑使用 EsPiFF。这是一款由 MDC-Service 基于乐鑫 ESP32 构建的开发板。EsPiFF 配备有线和无线以太网、SD 卡插槽和 RP2040 协处理器。如果您尚未找到适合您项目的树莓派&#xff0c;不妨尝试一下这款低…

使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙

本篇文章&#xff0c;我们聊聊如何使用 Docker 快速运行中文 Stable Diffusion 模型&#xff1a;太乙。 写在前面 上个月的时候&#xff0c;有朋友和我推荐了一个 “Stable Diffusion” 模型&#xff0c;来自深圳大湾区数字经济研究院(IDEA)的封神榜大模型中的 “太乙” 。 最…

web期末大作业 使用HTML+CSS制作蓝色版爱宠之家带留言板(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Metal每日分享,4x4颜色矩阵滤镜效果

本案例的目的是理解如何用Metal实现图像4x4颜色矩阵效果滤镜,通过4x4矩阵对RGBA像素处理; Demo HarbethDemo地址实操代码 // 绿色通道加倍 let filter = C7ColorMatrix4x4(matrix: Matrix4x4.Color.greenDouble)// 方案1: ImageView.image = try? BoxxIO(element: originIm…

【Python开发】Flask中的单点登录解决方案

Flask中的单点登录解决方案1.SSO 和 CAS 单点登录&#xff08;Single Sign On&#xff0c;SSO&#xff09;就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后&#xff0c;即可获得访问单点登录系统中其他关联系统和应用软件的权限&#xff0c;同时这种实现…

E. DS哈希查找--Trie树

目录 题目描述 思路分析 AC代码 题目描述 Trie树又称单词查找树&#xff0c;是一种树形结构&#xff0c;如下图所示。 它是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎…

【经验版】Linux相关教程(二)

一、参考资料 二、常用指令 1. 安装run软件包 # 可执行权限 chmod x 软件包名.run# 校验软件包安装文件的一致性和完整性 ./软件包名.run --check# 指定安装路径 ./软件包名.run --install如果用户未指定安装路径&#xff0c;则软件会安装到默认路径下&#xff0c;默认安装路…

kafka一致性保证

1、概念 水位标记&#xff1a; 水位或水印&#xff08;watermark&#xff09;一词&#xff0c;表示位置信息&#xff0c;即位移&#xff08;offset&#xff09;。Kafka源码中使用的名字是高水位&#xff0c;HW&#xff08;high watermark&#xff09;。 副本角色&#xff1a;…