dsp之BF531笔记
获得更多资料欢迎进入我的网站或者 csdn或者博客园
很久以前的BF531的笔记,觉得有用分享出来。摘自于open dsp
通用Gpio
ADSP-BF53x 处理器上有16 个PF 接口,这些接口就是通常所有的IO 接口,通过寄存器配置,每一个PF 接口都可以作为外部中断接口。
Blackfin 处理器的IO 使用与单片机不同,在使用前必须对该接口进行初始化,如告知接口的方向,如配置为输出接口,则直接配置输出接口电平信号,如配置为输入接口,需打开输入使能开关,配置输出信号触发方式,是否中断触发,是否双极性触发等等。初始化完成后,才能使用PF 接口。
PF 接口主要寄存器功能与使用方法
例子代码分析:
输入接口配置:
将 PF0 接口配置为输入接口,并且读出接口电平状态。
*pFIO_DIR &= ~PF0; //设置PF0 为输入
*pFIO_INEN |= PF0; //输入使能
i = *pFIO_FLAG_D; //读取数据
输出接口配置:
将 PF0 接口配置为输出接口,使用两种方式设置PF0 输出高低电平。
*pFIO_DIR |= PF0; //设置PF0 为输出
*pFIO_FLAG_S |= PF0; //PF0 脚置高
*pFIO_FLAG_C |= PF0; //PF0 脚置低
*pFIO_FLAG_D |= PF0; //PF0 脚置高
*pFIO_FLAG_D &= ~PF0; //PF0 脚置低
gpio中断
ADSP-BF53x 的16 个PF 接口都可以做为外部中断来使用。要使用PF 的外部中断,需要为PF 脚选择一个中断源,设置中断触发方式,为中断设置一个中断优先级,并且使能中断。 FIO_MASKA_D 和FIO_MASKB_D:用来为PF 管脚设置中断源,ADSP-BF53x 共有PFA 和PFB 两个中断源,通过选择配置这两个寄存器,使用不同的中断源。
SIC_IARx:设置中断优先等级。每个中断源都有一个默认的优先等级,如不对该寄存器配置,则可以使用默认的中断优先等级配置中断源。
从表中可以看出 PF 管脚相关的中断源PFA 和PFB 位于SIC_IAR2,其默认配置值都为5,根据其配置值,通过下表获知其对应的中断等级为IVG12,如将SIC_IAR2 配置值改为下表中的数值,则中断等级变为该数值对应的中断等级。
SIC_IMASK:中断屏蔽寄存器,使能中断使用。
函数:
register_handler(ik_ivg12, FlagA_ISR);
中断等级管理函数,该函数在头文件“exception.h”中定义,定义该头文件后直接可以使用,其功能是告知中断管理器定义的中断标识符为FlagA_ISR 和中断等级为12 级。
EX_INTERRUPT_HANDLER(FlagA_ISR)
中断函数,该函数在头文件“exception.h”中定义,当触发中断后,会进入该函数执行。
例子代码分析:
PF 口设置使用外部中断:
*pFIO_INEN |= PF0|PF1; //设置PF0,PF1 输入使能
*pFIO_DIR &=~(PF0|PF1); //设置PF0,PF1 为输入接口
*pFIO_EDGE |= PF0|PF1; //设置为沿触发
*pFIO_MASKA_D |= PF0|PF1; //使用中断源为PFA,使能PF 外部中断
配置外部中断:
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xffff5fff; //设置中断等级参数为5
register_handler(ik_ivg12, FlagA_ISR); //告知中断管理器使用中断等级为12,中断标志为 FlagA_ISR
*pSIC_IMASK = 0x00080000; //使能外部中断
中断函数:
EX_INTERRUPT_HANDLER(FlagA_ISR) //设置中断函数标志为FlagA_ISR
{
if(*pFIO_FLAG_D == PF0) //判断是否为PF0 中断
{
printf("interrupt is PF0!\n");
}
else if(*pFIO_FLAG_D == PF1) //判断是否为PF1 中断
{
printf("interrupt is PF1!\n");
}
*pFIO_FLAG_C = PF0|PF1; //清楚中断标志
}
BF53x_PLL
PLL(Phase Locked Loop)是ADSP-BF53x 的内核和时钟设置的机制,叫做锁相环。通过PLL 配置当前处理器工作的
内核和系统时钟。
BF53x_EBIU
EBIU 接口是ADSP-BF53x 的外部总线接口,ADSP-BF53x 的EBIU 接口共有16 根数据线,19 根地址线,支持同步
的SDRAM 接入和异步的总线外设接入,ADSP-BF53x 的异步EBIU 接口共有4 个BANK,每个BANK 1MByte,
支持各种总线接口设备。
BF53x_SPI
接口功能
SPI 接口是4 线串口,可以连接SPIFLASH,SPI 接口的AD,DA 等等。ADSP-BF53x 的SPI 接口支持主机模式和从机模式,它有7 个SPI 从机片选,在主机模式下,它同时可以挂载7 个SPI 设备,还可以在主机模式或从机模式下进行BOOT 启动。
1、MOSI 主输入从输出接口,根据主机和设备模式确定功能
2、MISO 从输入主输出接口,根据主机和设备模式确定功能
3、SCK SPI时钟
4、SPISELx SPI设备选则接口
5、SPISS SPI从机片选接口
SPI 接口时钟最快可以到系统时钟的1/4,其配置公式为:
SCK Frequency = (Peripheral clock frequency SCLK)/(2 x SPI_BAUD)
接口寄存器说明
1、SPI_CTL SPI 控制寄存器,配置SPI 工作模式及相位等
2、SPI_FLG SPI 从机选择寄存器,用于选择使用哪一个片选控制设备
3、SPI_STAT SPI 状态寄存器,获取SPI 当前工作状态
4、SPI_TDBR SPI 数据传输寄存器
5、SPI_RDBR SPI 数据接收寄存器
6、SPI_SHADOW SPI_RDBR 的影子寄存器,可用于读取数据
例子代码分析
*pSPI_BAUD=2; //配置速率为1/4 系统时钟 SPI 速率 = SCLK/2*SPI_BAUD
*pSPI_FLG |=FLS2; //选择SPISEL2 接口
*pSPI_CTL = 0x1001|CPHA| CPOL; //配置模式为手动片选模式
*pSPI_CTL = (*pSPI_CTL | SPE); //使能SPI 接口
*pSPI_FLG &= ~FLG2; //将SPISEL2 拉到0
while(!(*pSPI_STAT & SPIF)); //查看SPI 传输状态是否完成
*pSPI_TDBR = 0x55; //将数据送入SPI 传输数据寄存器
*pSPI_FLG |= FLG2; //将SPISEL2 拉到1,完成数据传输
*pSPI_FLG &= ~FLG2; //将SPISEL2 拉到0
while(*pSPI_STAT & RXS)//查看SPI 传输状态是否有数据需要接收
i = *pSPI_RDBR; //读取数据
*pSPI_FLG |= FLG2; //将SPISEL2 拉到1,完成数据传输
ADSP-BF53x 的SPI 接口支持手动片选和自动片选两种模式,通过SPI_CTL 寄存器的CPHA 和CPOL 位配置, 例子代码采用的是手动片选模式,每次读取数据和数据读取结束后需要通过代码来选通和关闭片选.
BF53x_Timer
接口功能
ADSP-BF53x 上有3 个通用定时器,每个定时器有三种模式:
- 脉冲宽度调制模式(PWM_OUT)
- 脉冲宽度计数捕获模式(WDTH_CAP)
- 外部事件模式(EXT_CLK)
接口寄存器说明
TIMERx_CONFIG 定时器配置寄存器,用于设置定时器工作模式
TIMERx_WIDTH 定时器宽度寄存器,设置输出波形脉冲宽度
TIMERx_PERIOD 定时器周期寄存器,设置输出波形的周期
TIMERx_COUNTER 定时器计数寄存器,读取捕获的脉冲数量
TIMER_ENABLE 定时器使能寄存器
TIMER_DISABLE 定时器关闭寄存器
TIMER_STATUS 定时器状态寄存器
例子代码分析
代码实现了将定时器配置为 PWM_OUT 模式,通过定时器中断来定时一个0x00800000 个系统的时间长度,定
时完成后,在中断内打印信息。
定时器没有单独的计时功能,所以如果计时,可以采用 PWM_OUT 模式,利用定时器中断来进行计时,同时
在芯片的TIMER0 管脚上,会有PWM 波形输出。
*pTIMER0_CONFIG = 0x0019; //配置定时器为PWM 模式
*pTIMER0_PERIOD = 0x00800000; //设置周期为0x00800000 个系统时钟
*pTIMER0_WIDTH = 0x00400000; //设置脉宽为0x00400000 个系统时钟
*pTIMER_ENABLE = 0x0001; //使能Timer0
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xfffffff4; //配置中断等级数据为4
register_handler(ik_ivg11, TIMER0_ISR); //注册中断等级为11,标识符为TIMER0_ISR
*pSIC_IMASK = 0x00010000;
EX_INTERRUPT_HANDLER(TIMER0_ISR) //标识符为TIMER0_ISR 的中断函数
{
*pTIMER_STATUS = 0x0001; //清除定时器中断标志
printf("timer0 interrupt !\n"); //打印信息
}
BF53x_UART
接口功能介绍
UART(Universal Asynchronous Receiver/Transmitter (UART) port)接口,是全双工通用的串行接口,由RX 和TX两根线组成,扩展RS232 芯片可以直接和计算机串口通讯,通常作为调试用的命令和数据通讯接口。
接口寄存器说明
UART_THR UART 传输数据寄存器
UART_RBR UART 接收缓存寄存器
UART_DLL UART 波特率配置低8 位寄存器
UART_DLH UART 波特率配置高8 位寄存器
UART_IER UART 中断使能寄存器
UART_IIR UART 中断识别寄存器
UART_LCR UART 线路控制寄存器
UART_MCR UART 调制控制寄存器
UART_LSR UART 线路状态寄存器
UART_SCR UART 暂存寄存器
UART_GCTL UART 全局控制寄存器
例子代码分析
*pUART_GCTL=0x0009;
*pUART_LCR=0x0080;// DLAB=1 允许访问DLL 和DLH
*pUART_DLL=div; //将变量div 的值写入波特率配置寄存器
*pUART_DLH=div>>8; //DLL DLH 分别赋值
*pUART_LCR=0x0003;// 允许访问 RBR THR 和IER
*pUART_IER=0x0001;// 接收中断允许
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff; // UART 中断等级设置
*pSIC_IAR2 = 0xffffffff;
register_handler(ik_ivg10, UART_ISR); // 注册UART 中断等级为10,标志为UART_ISR
*pSIC_IMASK = 0x00004000; //使能UART 中断
*pUART_THR=TXbuf[i]; //向UART 传输数据寄存器写数据
while(!(*pUART_LSR&0x0020)); //等待传输完成
EX_INTERRUPT_HANDLER(UART_ISR) //UART 接收数据中断函数
{
if(*pUART_LSR&DR) //判断是否有新的数据。
{
if(cont>512) //防止buff 溢出,测试代码,将接收到的数据重复写入512 字节的buff
cont = 0;
RXbuf[cont]=*pUART_RBR; //读取数据
cont++;
}
}
代码实现了配置波特率为 9600,设定了数据接收中断,运行代码后,会将数组Txbuf 中的字符串通过串口发送出,当接收到数据后,会进入中断函数读取数据。
BF53x_PPI
接口功能介绍
PPI(Parallel Peripheral Interface )接口在ADSP-BF53x 上常用于视频信号和同步数据的传输,是半双工接口,支持数据的采集和数据的传输。
ADSP-BF533x 上有一个16Bit 的PPI 接口,最高速度可以到系统时钟的1/2,有视频信号传输使用的行、列、场是三个同步信号,支持ITU656,ITU601 等模式,可兼容大部分视频相关的芯片。
PPI 接口自身不能产生时钟信号,所以PPICLK 信号必须由外部设备或者晶振提供,它没有专门的行,列同步信号管脚,在使用PPI 时,需采用与其复用的Timer1 和Timer2 管脚来作为行列同步信号管脚,PPI 接口的场同步管脚FS3 与PF3 脚复用,该信号是在传输电视视频信号时,指示当前传输的信号是奇场还是偶场信号,在通常不使用的情况下,该管脚必须下拉。PPI 接口与其他接口不同,他没有发送和接收数据的寄存器,不能采用Core 来操作数据,只能采用DMA 传输。PPI 接口管脚与复用定义:
接口寄存器说明
PPI_CONTROL PPI 控制寄存器,用于配置PPI 工作模式
PPI_STATUS PPI 状态寄存器
PPI_COUNT PPI 传输计数寄存器,设置图像一条线由多少数据组成
PPI_DELAY PPI 延时计数寄存器,设置在传输时延时多少个时钟开始采数据
PPI_FRAME PPI 帧寄存器,用来设置一幅完整图像一帧的线条数
例子代码分析
*pDMA0_START_ADDR = 0; //配置PPIDMA 数据起始地址
*pDMA0_X_COUNT = 480; //配置DMA 一行要传输多少次数据
*pDMA0_X_MODIFY = 2; //配置每次传输行地址的增量
*pDMA0_Y_COUNT = 286; //配置要传输多少行数据
*pDMA0_Y_MODIFY = 2; //配置每次列数据地址的增量
*pDMA0_CONFIG = 0x1034; //配置DMA 工作模式
*pPPI_CONTROL = 0x781e; //配置PPI 工作偶是
*pPPI_DELAY = 0; //配置时钟延时为0
*pPPI_COUNT = 479; //配置PPI 每行要传输480 次
*pPPI_FRAME = 286; //配置每帧图像有286 行
*pTIMER1_PERIOD = 525; //配置行同步信号产生的周期
*pTIMER1_WIDTH = 41; //配置行同步信号宽度
*pTIMER1_CONFIG = 0x00a9;//配置行同步信号工作模式
*pTIMER2_PERIOD = 150150;//配置列同步信号产生的周期
*pTIMER2_WIDTH = 5250; //配置列同步信号宽度
*pTIMER2_CONFIG = 0x00a9; //配置列同步信号工作模式
*pDMA0_CONFIG |= 0x1; //使能DMA
asm("ssync;"); //系统同步
*pPPI_CONTROL |= 0x1; //使能PPI
asm("ssync;"); //系统同步
*pTIMER_ENABLE|= 0x0006; //使能行场同步信号
asm("ssync;"); //系统同步
//PPI 的行场同步信号与TIMER1 和TIMER2 复用,所以要配置TIMER 寄存器来启动PPI 的同步信号。
dsp之BF531笔记的更多相关文章
- DSP EPWM学习笔记2 - EPWM相关寄存器设置问题解析
DSP EPWM学习笔记2 - EPWM相关寄存器设置问题解析 彭会锋 本篇主要针对不太熟悉的TZ 故障捕获 和 DB 死区产生两个子模块进行学习研究 感觉TI的寄存器命名还是有一定规律可循的 SEL ...
- DSP EPWM学习笔记1 - EPWM定时中断
DSP EPWM学习笔记1 - EPWM定时中断 彭会锋 EPWM模块组成 EPWM有7个子模块组成:时间基准 TB.比较功能 CC.动作限定 AQ.死区产生 DB.斩波控制 PC.故障捕获 TZ.事 ...
- DSP - Bootloader学习笔记2
DSP - Bootloader学习笔记2 彭会锋 1 本文主要以F2812为例进行说明的: F28027内部资源 F28027内存映射
- DSP bootloader学习笔记1
DSP bootloader学习笔记1 彭会锋 参考: TMS320F28xx DSP中内部Flash的应用研究 http://wenku.baidu.com/view/83e9837931b765c ...
- linux dev/dsp 声卡学习笔记
原文地址:dev/dsp 声卡学习笔记">linux dev/dsp 声卡学习笔记作者:ziyou飞翔 无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(f ...
- DSP开发笔记一
前言 本笔记首先对DSP的特点及其选型进行了描述,然后重点记录DSP开发环境的搭建及基础工程示例,对为DSP开发新手有一定的指导作用. 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一 ...
- 【DM642学习笔记二】dsp基础实验:发光二级管的显示 led.c
1,OSDFPGA配置一个专用的8位寄存器控制指示灯亮灭,访问地址为90080017h,由电路图可知低电平点亮. 2,程序运行时,可直接editmemory.即修改90080017h地址的值(可在Ed ...
- 【DM642学习笔记十】DSP优化记录
1. 处理的数据先EDMA到片内,具有更高的效率! 以YUV2RGB为例: #pragma DATA_SECTION(onchipBuf0_y,".INTPROCBUFF"); # ...
- iOS阶段学习第二天笔记(数据类型与进制)
iOS学习(C语言)知识点整理笔记 1.C语言32个关键字 一.存储相关 1)auto 声明自动变量 2)register 声明寄存器变量 3)volatile 声明的变量在程序执行过程中可能被隐含的 ...
随机推荐
- Android控件使用自定义字体
我们不可能只满足于系统自带的字体(太丑),其实控件自定义字体也很简单.. 1.首先找到该字体的ttf文件. 2.把字体文件放在scr/mian/assets/fonts下,如果没有该路径则自己创建. ...
- js中slice,splice和split方法的区别
1.slice(数组) 用法:array.slice(start,end) 解释:该方法是对数组进行部分截取,并返回一个数组副本:参数start是截取的开始数组索引,end参数等于你要取的最后一个字符 ...
- schedule和scheduleAtFixedRate的区别
- oracle job SYSDATE
hr BEGIN SYS.DBMS_JOB.REMOVE(); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job =&g ...
- 把Oracle的数据导入到SQL2012中 导出数据--SSIS
在ORACLE表和SQL Server表之间'转换'那步很重要,可以改变默认的字段数据类型,如image->text,decimal->int number ->int (注意设置 ...
- C++——多线程
1.多进程和多线程:进程是一个总任务,一个进程可能包含多个线程. 2.并行和并发: 并发的关键是你有处理多个任务的能力,不一定要同时. 并行的关键是你有同时处理多个任务的能力. 3.共享数据的管理和线 ...
- IWebBrowser和IE浏览器的行为不一样
原本一直以为IWebBrowser2的行为和IE浏览器的行为应该是一样的,但是最近发现事实不是如此. IE8以后的浏览器都带有兼容模式,而IWebBrowser2默认情况下是在兼容模式下运行的,可以参 ...
- Navicat 连接阿里云的 MySQL
1 利用Navicat连接阿里云服务器中MySQL 常规连接方式常用于连接本机数据库以及虚拟机中的数据库:但是连接阿里云的MySQL数据库时会出现连接不上的情况,错误信息如下: 1.1 常规中的配置 ...
- BeautifulSoup练习
html1="""<!DOCTYPE html><html lang="en" xmlns="http://www.w3. ...
- Solidity字符串拼接实现oraclize动态查询
solidity本身没有字符串拼接功能,但是如果你恰巧要用oraclize api,那么可以使用oraclize api中的字符串拼接方法(strConcat).之所以oraclize api里会有s ...