dsp 的emif 介面,常用於dsp 擴充套件外部儲存器,可外接同步儲存器也可接非同步儲存器
本文主要講解了基於csl的emif 介面的配置。
要對emif進行配置,要按如下過程:
第一步:
開啟emif 控制器,對於tms320c6455 要執行一下**:
csl_finst(((csl_devregs*)csl_dev_regs)->percfg1, dev_percfg1_emifactl, \
enable);
該**是如何實現對emif 控制器的使能在上一文中已經詳細分析過,這裡不在重複。
第二步:
執行函式csl_emifainit(null)初始化emif csl 模組,**如下:
csl_status status;
status = csl_emifainit(null);
第三步:
執行函式csl_emifaopen開啟emif 裝置,**如下:
csl_status status;
csl_emifaobj emifaobj;
csl_emifahandle hemifa;
status csl_emifainit(null);
hemifa = csl_emifaopen( &emifaobj, csl_emifa, null, &status);
第四步:
執行函式csl_emifahwsetup對emif 裝置進行配置,**如下:
csl_emifahandle hemifa;
csl_emifaasync asyncmem = csl_emifa_asynccfg_defaults;
csl_emifaasyncwait asyncwait = csl_emifa_asyncwait_defaults;
csl_emifamemtype value;
csl_emifahwsetup hwsetup;
csl_status status;
value.ssel = 0;
value.async = &asyncmem;
value.sync = null;
hwsetup.asyncwait = &asyncwait;
hwsetup.cecfg[0] = &value;
hwsetup.cecfg[1] = null;
hwsetup.cecfg[2] = null;
hwsetup.cecfg[3] = null;
//initialize and open the emifa csl
...//open emifa module
status = csl_emifahwsetup(hemifa, &hwsetup);
...
第五步:
配置完畢,在執行完以上幾步後,就可以通過emif 介面對儲存器進行操作了。
重點來了,如何知道怎麼配置emif 介面呢??也就是第五步中的hwsetup 變數如何來定義與賦值???
這就是本文所要將的重點。
首先要知道hwsetup 變數如何來定義的,看一下**:
typedef struct csl_emifahwsetup;
該變數中包含了兩個指標結構體變數,*asyncwait 該變數用於配置非同步等待配置暫存器,
*cecfg[numchipenable] 該變數用於選擇所要配置的暫存器型別,同步還是非同步
其中numchipenable在csl 中已經定義為4,因為有四個空間ce2-ce5
再來看看*asyncwait 該變數是如何定義的,如下:
typedef struct csl_emifaasyncwait;
該變數又有三個變數,第乙個asyncrdypol,表示非同步ready 訊號的極性,是個列舉型別。
第二個變數maxextwait,表示非同步儲存器的最大等待週期數
第三個變數turnarnd,表示翻轉週期數
列舉型別變數asyncrdypol定義,如下:
typedef enum csl_emifaardypol;
接下來看看變數*cecfg[numchipenable]的定義,如下:
typedef struct csl_emifamemtype;
其中ssel是用來選擇儲存器型別的,同步還是非同步
變數*async又是乙個結構體,是對非同步儲存器的一些引數的設定
變數*sync又是乙個結構體,是對同步儲存器的一些引數的設定
看看變數*async的定義:
typedef struct csl_emifaasync;
每個引數的含義是什麼,可以檢視csl api 參考手冊
看看變數*sync的定義:
typedef struct csl_emifasync;
每個引數的含義是什麼,可以檢視csl api 參考手冊
上面對hwsetup 變數進行了細緻深入的介紹,相信大家,可能有點雲裡霧裡的感覺,
下面我們來看看下面這幅圖:
相信大家看了這圖後,對該變數的結構和層次有了乙個比較清楚的了解。
一下**是將ce2配置為同步儲存器介面模式,**如下:
/*
* main.c
*/#include #include "define.h"
#include "csl_emifa.h"
#include "cslr_dev.h"
#define emifa_memtype_async 0
#define emifa_memtype_sync 1
extern int g_reversal;
/* handle for the emifa instance */
csl_emifahandle hemifa;
void main(void)
else
/* opening the emifa instance */
hemifa = csl_emifaopen(&emifaobj, csl_emifa, null, &status);
if ((status != csl_sok) || (hemifa == null))
else
/* setting up configuration parameter using hwsetup */
status = csl_emifahwsetup(hemifa, &hwsetup);
if (status != csl_sok)
else
printf("\tinfo: async read write \n");
while (1)
return;
}
FreeRTOS 支援時間片
所謂時間片就是同乙個優先順序任務下可以有多個任務,每個任務輪流的享有相同的cpu時間,享有cpu的時間我們叫做時間片。在rtos中,最小的時間單位是乙個tick,即 systick 的中斷週期。對於freertos,時間片只能是乙個tick。與其說freertos支援時間片,倒不如說他的時間片就是正...
STM32 片上Flash 操作
之前iap時候記錄過一些,今天對特定地方寫又加深了印象,寫與擦除都需要先unclock 1 讀取指定位址的半字 16位資料 2 faddr 讀位址 此位址必須為2的倍數 3 返回值 對應資料.4u16 stmflash readhalfword u32 faddr 5stmflash readhal...
CC254X片上flash讀寫解析
如果在開發中,希望個別資料掉電不丟失,那麼有幾種方法可以考慮,一種是通過i2c或者spi匯流排外接儲存,比如e2prom或flash,如果資料不大,第二種方便的方法就是操作片上flash了,要想操作片上flash,首先要搞清楚片上flash的儲存結構以及定址方式。例如cc2541f256這個晶元,我...