上一节谈了GPIO问题,是用BF561 ezkit进行说明的,这是因为561 ezkit上的GPIO是与LED直连的,讲解GPIO时不会涉及到其它问题,降低了复杂性。对于533,也采取同样的操作即可。
但是有一个问题,533 ezkit上的led是连到了带IO口的flash上的,因此为了点亮相应的LED,必须通过flash来进行。这一节就讨论一下如何通过控制flash将其点亮。
Blackfin处理器具有外部总线接口单元(External Bus Interface Unit,EBIU),它为处理器与外部的同步存储器和异步存储器提供了无缝连接。片上的SDRAM控制器(SDC)兼容PC-100和PC-133标准。EBIU接口同时具有异步存储器控制器(Asynchronous Memory Controller,AMC),该控制器支持与异步存储器相连,如flash、ROM和ASIC/FPGA。接口信号如下:
系统为存储器划分的存储片段如下:
ADSP-BF53x 的异步EBIU 接口共有4 个BANK,每个BANK 1MByte,支持各种总线接口设备。EBIU 接口采用指针方式访问,通过宏定义出要访问的地址,然后通过指针进行读写数据操作。
- 为什么要引入BANK?
由于地址线的数量有限,为了扩大寻址范围,采用添加若干条bank选择信号线如AMS0等,来扩展寻址范围,在各个bank之间切换。
例程:通过AMC控制flash中的寄存器,使其输出电平,点亮与之相连的LED.
#include<cdefbf533.h> #include<adi_types.h> #define pFlashA_PortA_In ((volatile unsigned char *)0x20270000) // address of flash A port A input data register #define pFlashA_PortA_Out ((volatile unsigned char *)0x20270004) // address of flash A port A output data register #define pFlashA_PortA_Dir ((volatile unsigned char *)0x20270006) // address of flash A port A direction register #define pFlashA_PortB_In ((volatile unsigned char *)0x20270001) // address of flash A port B input data register #define pFlashA_PortB_Out ((volatile unsigned char *)0x20270005) // address of flash A port B output data register #define pFlashA_PortB_Dir ((volatile unsigned char *)0x20270007) // address of flash A port B direction register #define pFlashB_PortA_In ((volatile unsigned char *)0x202E0000) // address of flash B port A input data register #define pFlashB_PortA_Out ((volatile unsigned char *)0x202E0004) // address of flash B port A output data register #define pFlashB_PortA_Dir ((volatile unsigned char *)0x202E0006) // address of flash B port A direction register #define pFlashB_PortB_In ((volatile unsigned char *)0x202E0001) // address of flash B port B input data register #define pFlashB_PortB_Out ((volatile unsigned char *)0x202E0005) // address of flash B port B output data register #define pFlashB_PortB_Dir ((volatile unsigned char *)0x202E0007) // address of flash B port B direction register void ezConfigureFlashA(void); void ezTurnOnLED(uint16_t led); void Init_EBIU(void); void main(void) { Init_EBIU(); //初始化EBIU ezConfigureFlashA(); //初始化flash配置寄存器 ezTurnOnLED(); //点亮第4个led ); } void Init_EBIU(void) { *pEBIU_AMBCTL0 = 0x7bb07bb0; *pEBIU_AMBCTL1 = 0x7bb07bb0; *pEBIU_AMGCTL = 0x000f; } /********************************************************************* Function: ezConfigureFlashA Description: Sets up the A flash on the board for use. *********************************************************************/ void ezConfigureFlashA(void) // sets up the flash { #ifdef __ADSPBF533__ *pFlashA_PortA_Out = ; // resets port A to initial value *pFlashA_PortA_Dir = 0xFF; // configure everything on port A as outputs *pFlashA_PortB_Out = ; // resets port B to initial value *pFlashA_PortB_Dir = 0x3f; // configure everything on port B as outputs #endif } void ezTurnOnLED(uint16_t led) { unsigned char LEDs; ) { LEDs = *pFlashA_PortB_Out; //读取原来的输出口的状态 LEDs = LEDs | (<<led); *(pFlashA_PortB_Dir) = 0x3f; *pFlashA_PortB_Out = LEDs; } }
关于AMBCTL0、1这两个寄存器是如何配置的,要参考flash手册的时序参数,找到保持时间、建立时间等,然后按照硬件手册上关于寄存器各位的说明进行配置。
在一般情况下,保持上述配置即可。