Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

ノンブロッキング機能を備えたPSoC 4フラッシュ エミュレーション EEPROM – KBA233049

ノンブロッキング機能を備えたPSoC 4フラッシュ エミュレーション EEPROM – KBA233049

Infineon_Team
Employee
Employee
50 replies posted 25 likes received 25 replies posted

Translated by: keni_4440091

Original KBA: PSoC 4 Flash Emulate EEPROM with Non-blocking Feature – KBA233049

Version: **


質問:

PSoCTM 4 フラッシュでブロッキング方式の代わりにノンブロッキング方式を使用する方法は?

 

回答:

フラッシュ消去または書込み動作を実行している時に、ローレベルドライバはブロッキング書込み方式を使用し、動作が終了するまですべてのCPU割込みを無効化します。場合によっては、システムはノンブロッキング書込みを使用する必要があります。以下の手順は、CY8CKIT-041デモキットを使ったノンブロッキング方式の使用方法を示しています。

1main.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 GenerationFalseに設定します。次に、プロジェクトをコンパイルし、ローレベルドライバを生成します

IFX_Publisher1_0-1674123981986.png

 

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) &parameters[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:

keni_4440091_9-1623719793337.png

keni_4440091_10-1623719800798.png

keni_4440091_11-1623719808309.png

6. ビルド設定ダイアログで、Skip Code GenerationTrueに設定します。次にプロジェクトをコンパイルします。

keni_4440091_12-1623719821268.png

 

7. チップにhexをダウンロードします。ブルーとレッドのライトが、点滅せずにONします。ブロッキングモードを使用している場合、書込みまたは消去の時にCPUはフラッシュを操作できないので、ライトは点滅します。次に、タイマー割込みハンドラーは操作が完了するまで保留されます。フラッシュ動作の最小時間は15msから20msであるひつようがあります。

0 件の賞賛
147 件の閲覧回数