RENESAS - 실습2

2022. 2. 8. 09:52전공공부/마이크로프로세서 윈터캠프

 

성균관대학교 윈터캠프 <마이크로프로세서 - 전재욱 교수님>에서 실습한 내용 중 일부다.

Renesas RA6M3(176 pin) 계열의 칩을 선택했다. 그리고 IDE는 E2 studio를 활용했다.

 

이번 실습의 목표는 각 sw를 누를 때마다 각각 다른 사운드를 들려주고, 그 때 sw위에 있는 LED를 표시한다. 사운드가 나올 때는 다른 sw를 눌러도 반응하지 못한다. 

 

https://youtu.be/f-pFYVHeGso

 

먼저 FSP configuration을 진행한다. 스위치를 통제하는 stack 4개를 추가하고, DAC를 추가한다. 그 뒤 pin을 LED를 포해서 설정해준다. 

 

#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
void R_AGT0_interrupt(timer_callback_args_t *p_args);
void R_USP_initLED();
void R_IRQ11_interrupt();
void R_IRQ12_interrupt();
void R_IRQ13_interrupt();
void R_IRQ14_interrupt();
FSP_CPP_FOOTER

//extern unsigned char rawData[127968];
extern unsigned char rawData1[212300];
extern unsigned char rawData2[141282];
extern unsigned char rawData3[95082];
extern unsigned char rawData4[89830];
int agt_counter;
uint16_t value;
int flag;

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
    R_DAC_Start(&g_dac0_ctrl);
    R_AGT_Open(&g_timer0_ctrl, &g_timer0_cfg);
    R_AGT_Start(&g_timer0_ctrl);
    R_ICU_ExternalIrqOpen(&g_external_irq11_ctrl, &g_external_irq11_cfg);
    R_ICU_ExternalIrqEnable(&g_external_irq11_ctrl);
    R_ICU_ExternalIrqOpen(&g_external_irq12_ctrl, &g_external_irq12_cfg);
    R_ICU_ExternalIrqEnable(&g_external_irq12_ctrl);
    R_ICU_ExternalIrqOpen(&g_external_irq13_ctrl, &g_external_irq13_cfg);
    R_ICU_ExternalIrqEnable(&g_external_irq13_ctrl);
    R_ICU_ExternalIrqOpen(&g_external_irq14_ctrl, &g_external_irq14_cfg);
    R_ICU_ExternalIrqEnable(&g_external_irq14_ctrl);
    R_USP_initLED();
    flag = 0;
    while(1){

    }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

void R_USP_initLED(){
   R_PORT10->PDR = 0x0700;
   R_PORT11->PDR = 0x0001;

   R_PORT10->PODR = 0x0000;
   R_PORT11->PODR = 0x0000;
}
void R_IRQ11_interrupt(external_irq_callback_args_t *p_args){
    FSP_PARAMETER_NOT_USED(p_args);
    R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_10, (ioport_size_t)(0x0E00), (ioport_size_t)0x0700);
    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_11_PIN_00, BSP_IO_LEVEL_HIGH);
    for(uint32_t i=0; i< sizeof(rawData1); i+=2){
       value = (uint16_t)(rawData1[i] | rawData1[i+1] <<8);
       R_DAC_Write(&g_dac0_ctrl, value);
       R_BSP_SoftwareDelay(45, BSP_DELAY_UNITS_MICROSECONDS); // same as sample rate
    }
}

void R_IRQ12_interrupt(external_irq_callback_args_t *p_args){
    FSP_PARAMETER_NOT_USED(p_args);
    R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_10, (ioport_size_t)(0x0D00), (ioport_size_t)0x0700);
    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_11_PIN_00, BSP_IO_LEVEL_HIGH);
    for(uint32_t i=0; i< sizeof(rawData2); i+=2){
       value = (uint16_t)(rawData2[i] | rawData2[i+1] <<8);
       R_DAC_Write(&g_dac0_ctrl, value);
       R_BSP_SoftwareDelay(45, BSP_DELAY_UNITS_MICROSECONDS); // same as sample rate
    }
}

void R_IRQ13_interrupt(external_irq_callback_args_t *p_args){
    FSP_PARAMETER_NOT_USED(p_args);
    R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_10, (ioport_size_t)(0x0B00), (ioport_size_t)0x0700);
    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_11_PIN_00, BSP_IO_LEVEL_HIGH);
    for(uint32_t i=0; i< sizeof(rawData3); i+=2){
       value = (uint16_t)(rawData3[i] | rawData3[i+1] <<8);
       R_DAC_Write(&g_dac0_ctrl, value);
       R_BSP_SoftwareDelay(45, BSP_DELAY_UNITS_MICROSECONDS); // same as sample rate
    }
}

void R_IRQ14_interrupt(external_irq_callback_args_t *p_args){
    FSP_PARAMETER_NOT_USED(p_args);
    R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_10, (ioport_size_t)0x0F00, (ioport_size_t)0x0700);
    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_11_PIN_00, BSP_IO_LEVEL_LOW);
    for(uint32_t i=0; i< sizeof(rawData4); i+=2){
       value = (uint16_t)(rawData4[i] | rawData4[i+1] <<8);
       R_DAC_Write(&g_dac0_ctrl, value);
       R_BSP_SoftwareDelay(45, BSP_DELAY_UNITS_MICROSECONDS); // same as sample rate
    }
}

void R_AGT0_interrupt(timer_callback_args_t *p_args){
    FSP_PARAMETER_NOT_USED(p_args);
    if(agt_counter >= 1000) agt_counter=0;
    agt_counter++;
}

/*******************************************************************************************************************//**
 * This function is called at various points during the startup process.  This implementation uses the event that is
 * called right before main() to set up the pins.
 *
 * @param[in]  event    Where at in the start up process the code is currently at
 **********************************************************************************************************************/
void R_BSP_WarmStart(bsp_warm_start_event_t event)
{
    if (BSP_WARM_START_RESET == event)
    {
#if BSP_FEATURE_FLASH_LP_VERSION != 0

        /* Enable reading from data flash. */
        R_FACI_LP->DFLCTL = 1U;

        /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
         * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
#endif
    }

    if (BSP_WARM_START_POST_C == event)
    {
        /* C runtime environment and system clocks are setup. */

        /* Configure pins. */
        R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
    }
}

#if BSP_TZ_SECURE_BUILD

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{

}
#endif

코드에서는 처음에 DAC와 interrupt, LED를 허용하도록 설정한다.

 

그 뒤 각각 sw를 작동했을때 어떻게 변화하는 지 작성한다. 예를 들어 R_IRQ11_interrupt에서 portwrite, pinwrite를 설정에서 LED를 제어한다. 여기서 0은 LED를 키는 것, 1은 끄는 것이다. 

 

그리고 틀을 사운드(rawdata)를 하나 결정하고, DAC에 각각 value를 쓴다. 그리고 밑에 R_BSP_SoftwareDelay는 sample rate과 동일하게 작성한다.

 

위와 같은 방식으로 4개의 스위치에 대해 작성해준다. 그러면 위의 동영상 같은 결과가 나온다. 만약 헷갈리거나 어려운 코드가 있다면 이 그룹의 다른 게시물을 참고하면 알 수 있을 것이다.