Blackfin DSP(二):寄存器操作与GPIO
BlackfinDSP的寄存器是通过指针操作的,与51、ARM等MCU一样,通过“或”操作来置1,通过“与”操作清零。
在DSP上最简单的外设非IO口莫属,但是由于其功能强大,远非一般IO口可比,因此区别的称之为“GPIO”(general purpose IO),也称为PF(programmable flagas)口,本文通过GPIO控制LED来演示寄存器的操作方式。
//=============== 开发环境 ======================
上位机: win7 旗舰版
DSP环境: CCES1.0.2 (用Blackfin DSP第一节:新建工程一文中的Visual DSP++完全一样)
开发板 : ADSP-BF561 EZKIT(用561的原因是,手头的533EZKIT的GPIO连接到了FLASH上,想驱动LED,必须先对FLASH进行操作,比较麻烦,以后会尽量采 用533,虽然用561,但是操作方式是一致的,只不过寄存器的定义不同)
//================ 原理图 =====================


由图可见,LED1~LED8分别连接在PF40~PF47口,当PFx输出为高电平时,可点亮相应的LED。
//================ 寄存器定义 =====================
1.方向寄存器(参考Hardware reference)

首先,必须将PFx的方向设置为输出;
2.设置输出电平
输出高电平是通过FLAG_SET寄存器来进行设置的,在相应的位写1,即可设置为高电平。定义如下:

输出低电平是通过FLAG_CLEAR寄存器实现,写1清除相应的端口电平值。(图就不贴了)
//=================== 寄存器的操作 ======================
blackfin系列的寄存器定义都是在安装目录下的cdefbf5xx.h中定义的,为此,在程序的开始部分要包含相应的头文件。比如cdefbf561.h包含了所有561寄存器的定义:
……
#define pFIO2_FLAG_D ((volatile unsigned short *)FIO2_FLAG_D)
#define pFIO2_FLAG_C ((volatile unsigned short *)FIO2_FLAG_C)
#define pFIO2_FLAG_S ((volatile unsigned short *)FIO2_FLAG_S)
#define pFIO2_FLAG_T ((volatile unsigned short *)FIO2_FLAG_T)
……
#define FIO2_FLAG_D 0xFFC01700 /* Flag Data register (mask used to directly */
#define FIO2_FLAG_C 0xFFC01704 /* Flag Clear register */
#define FIO2_FLAG_S 0xFFC01708 /* Flag Set register */
#define FIO2_FLAG_T 0xFFC0170C /* Flag Toggle register (mask used to */
这是一个地址指针,因此可以直接当作指针来操作,比如置1操作如下:
*pFIO2_DIR |= 0xFF00; /*将pFIO2_DIR的高8位置为1*/
//=================== 代码示例=======================
以下代码中包含了GPIO的输出、输入、反转 这三个功能的设置方法,对于其它功能,可以查看硬件手册。
#include <cdefbf561.h> /* C POINTERS TO SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 */
#include <adi_types.h> /* type defines */
#include <ccblkfn.h> /* include the async() function prototype */ void TurnOnLed(uint8_t nLed);
void msDelay(uint32_t msec) ;
void TurnOffAllLed(void);
void ToggleLed(uint8_t nLed);
void delay(int i); void main(void)
{
TurnOnLed(); // 打开LED1 (PF40)
TurnOnLed(); // 打开LED2 (PF41)
msDelay();
TurnOffAllLed(); // 关闭所有LED TurnOnLed(); // 打开LED1 (PF40)
TurnOnLed(); // 打开LED2 (PF41)
msDelay();
TurnOffAllLed(); // 关闭所有LED while() //blink
{
ToggleLed(); //翻转LED
msDelay();
}
}
/* GPIO as output */
void TurnOnLed(uint8_t nLed)
{
*pFIO2_DIR |= 0xFF00; /*set PF40~PF47 as output */
ssync();
*pFIO2_FLAG_S = ( << (nLed+) ); /*set the corresponding bit in FLAG_SET register as high*/
ssync(); }
/* GPIO as input */
void TurnOffAllLed(void)
{
*pFIO2_DIR |= 0xFF00; /*set PF40~PF47 as output */
ssync();
*pFIO2_FLAG_C = 0xFF00; /*set Flag_clear register to clear the PFx */
ssync();
}
/* Toggle GPIO */
void ToggleLed(uint8_t nLed)
{
*pFIO2_DIR |= 0xFF00;
ssync();
*pFIO2_FLAG_T = ( << (nLed+) ); // write 1 to toggle
ssync();
}
/********************************************************************* Function: ezDelay Description: Delays for approximately 1 msec when running at 600 MHz *********************************************************************/ void msDelay(uint32_t msec)
{ volatile uint32_t i,j; // value of 0x3000000 is about 1 sec so 0xc49b is about 1msec for (j = ; j < msec; j++) {
for (i = ; i < 0xc49b; i++) ;
} }
P.S:要想用好DSP,首先最重要的就是把寄存器的定义读懂,那Hardware reference 必不可少,做到哪都到哪,才能有所领悟~不看手册,那是不行地。。。
Blackfin DSP(二):寄存器操作与GPIO的更多相关文章
- Blackfin DSP(八):1D DMA与音频处理模板
1.DMA产生的背景 在许多需要使用DSP 的场合,一般都需要大量的数据搬移工作,而如果每次数据搬移都由DSP 内核来参与完成,将大大占用DSP 内核的处理时间,从而严重影响其信号处理能力.因此,Bl ...
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- I.MX6 AR8031 寄存器操作
/*************************************************************************** * I.MX6 AR8031 寄存器操作 * ...
- 直接对寄存器操作,实现usart的串口输出寄存器的配置
就像前面提到的,我用的板子是一款stm32f107系列的板子,在这块板子上,已经开发出了一套比较成熟的库函数,这也就意味着你可以不用直接去操作存储器来实现某些功能.比方说对于USART来说可以直接通过 ...
- Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)
原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...
- STM32 下的库函数和寄存器操作比较
以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制 ...
- RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】
实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍 LED模块 Matrix-LE ...
- windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)
windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...
- {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作
MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...
随机推荐
- HTML5全局属性和事件
全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件. 属性: HTML5属性能够赋给标签元素含义和语 ...
- C语言基础--数组及相关
概念: 一堆相同类型的数据的有序集合 格式: 元素类型 数组名称[ 元素个数 ] 定义数组: // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据 ]; // 只要定义一 ...
- 黑马程序员——OC语言 核心语法 (3)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)分类Category 1) 基本用途 如何在不改变原来类模型的前提下 ...
- jquery元素插入、删除、清空
1)jquery元素插入 <!--位置1--> <div id='test'> <!--位置2--> <div>测试</div> <! ...
- UML学习笔记2
4.协作图 它跟顺序图区别:前者强调时间,后者强调空间.两者可以转换 5.状态图 主要用于时间建模 6.活动图 7.构件图
- 关于工伤事故索赔计算很好用的一款APP
关于工伤事故索赔计算很好用的一款APP.详细介绍工伤伤残等级评估 工伤计算器根据国家颁布<劳动能力鉴定 职工工伤与职业病致残等级>,通过关键字检索,快速评估工伤伤残等级. 软件说明: 1 ...
- H.264简介
H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后最新的, 最有前途的视频压缩标准. H.264是由ITU-U和ISO/IEC联合开发组共同开发的最新国际 ...
- html元素中id和name的区别
可以说几乎每个做过Web开发的人都问过,到底元素的ID和Name有什么区别阿?为什么有了ID还要有Name呢?! 而同样我们也可以得到最classical的答案:ID就像是一个人的身份证号码,而Nam ...
- <jsp:include>和<%@ include %>的区别
使用<%@ include %>指令元素只是将页面的内容静态的包含进来,如果被包含的文件中有JSP代码,则会执行该代码,而不管该文件是否为动态文件. <jsp:include> ...
- 今天<人人都能弹吉他>免费版获得了苹果的新品推荐
今天改了一天程序, 来回测来回改, 准备提交一个新版本了. 傍晚跑步回来, 看了一下今天的下载量, 竟然比昨天多了. 然后就想, 难不成被苹果推荐了? 上线一看, 果然, 而且美国和中国两大市场都在新 ...