ノンブロッキング機能を備えたPSoC 4フラッシュ エミュレーション EEPROM – KBA233049
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Translated by: keni_4440091
Original KBA: PSoC 4 Flash Emulate EEPROM with Non-blocking Feature – KBA233049
Version: **
質問:
PSoCTM 4 フラッシュでブロッキング方式の代わりにノンブロッキング方式を使用する方法は?
回答:
フラッシュ消去または書込み動作を実行している時に、ローレベルドライバはブロッキング書込み方式を使用し、動作が終了するまですべてのCPU割込みを無効化します。場合によっては、システムはノンブロッキング書込みを使用する必要があります。以下の手順は、CY8CKIT-041デモキットを使ったノンブロッキング方式の使用方法を示しています。
1. main.cに以下のラインコードを追加し、*.cydwrクロックにIMOが48MHzに設定されていることを確認してください。
#define SPC_INT_IRQ 9u //the SPC interrupt No. follow the table
PSOC series |
SPCIF IRQ |
PSOC 4000S |
9 |
PSOC 4100S |
12 |
PSOC 4100S plus |
15 |
#define REG(addr) (*((volatile uint32 *) (addr)))
#define CPUSS_CONFIG_REG REG( 0x40100000 )
extern void SpcIntHandler();
void main()
{
…
CyIntSetVector(SPC_INT_IRQ,SpcIntHandler);
CyIntSetPriority(SPC_INT_IRQ,3);
CyIntEnable(SPC_INT_IRQ);
/* Set CPUSS_CONFIG.VECS_IN_RAM because SPC ISR should be in SRAM */
CPUSS_CONFIG_REG |= 0x00000001;
…
}
2. プロジェクト→ ビルド設定に移動します。 ビルド設定ダイアログで、Skip Code GenerationをFalseに設定します。次に、プロジェクトをコンパイルし、ローレベルドライバを生成します。
3. 現在の*.ldファイルに赤いコードラインを追加します。
.data : ALIGN(8)
{
__cy_region_start_data = .;
KEEP(*(.jcr))
*(.got.plt) *(.got)
*(.shdata)
*(.data .data.* .gnu.linkonce.d.*)
. = ALIGN (8);
*(.ram)
KEEP(*(.sramCode))
. = ALIGN (8);
_edata = .;
} >ram AT>rom
4. flash.cファイルのRAMセクションに、以下の3つの関数を定義し、割り付けます。
/* Variable to keep track of how many times SPC ISR is triggered */
uint32 iStatusInt = 0;
CY_SECTION(".sramCode") __attribute__((used))
void DoStuffRunningInSram(void)
{
CY_NOP;
}
CY_SECTION(".sramCode") __attribute__((used))
void SpcIntHandler(void)
{
volatile uint32 parameters[1];
/* Write key1, key2 parameters to SRAM */
parameters[0u] = (uint32) (((uint32) CY_FLASH_KEY_TWO(0x09) << CY_FLASH_PARAM_KEY_TWO_OFFSET) | CY_FLASH_KEY_ONE);
/* Write the address of key1 to the CPUSS_SYSARG arg */
CY_FLASH_CPUSS_SYSARG_REG = (uint32) ¶meters[0u];
/* Write the API code = 0x09 to the CPUSS_SYSREQ.COMMAND
* register and assert the sysreq bit */
CY_FLASH_CPUSS_SYSREQ_REG = CY_FLASH_CPUSS_REQ_START | 0x09;
/* Number of times the ISR has triggered */
iStatusInt ++;
}
/*******************************************************************************
* Function Name: CySysFlashWriteRow
****************************************************************************//**
*
* Erases a row of Flash and programs it with the new data
********************************************************************************/
CY_SECTION(".sramCode") __attribute__((used))
uint32 CySysFlashWriteRow(uint32 rowNum, const uint8 rowData[])
{…}
5. 他の割込み、main.cの2 msタイマー割込みサービスルーチンなどを設定します。以下のコードを追加します。CPUは2ms毎にこのハンドラーを実行します。
CY_SECTION(".sramCode") __attribute__((used))
CY_ISR(Isr_Timer)
{
/* Clear the TCPWM terminal count interrupt */
Timer_ClearInterrupt(Timer_INTR_MASK_TC);
LED_Blue_Write(~LED_Blue_Read());
msCount++;
if(msCount >= 2)//////1000
{
/* Toggle the green LED state */
LED_Red_Write(~LED_Red_Read());
msCount = 0;
secFlag = 1;
}
Assign the API in the interrupt handler to the RAM:
6. ビルド設定ダイアログで、Skip Code GenerationをTrueに設定します。次にプロジェクトをコンパイルします。
7. チップにhexをダウンロードします。ブルーとレッドのライトが、点滅せずにONします。ブロッキングモードを使用している場合、書込みまたは消去の時にCPUはフラッシュを操作できないので、ライトは点滅します。次に、タイマー割込みハンドラーは操作が完了するまで保留されます。フラッシュ動作の最小時間は15msから20msであるひつようがあります。