RENESAS - 실습2
2022. 2. 8. 09:52ㆍ전공공부/마이크로프로세서 윈터캠프
성균관대학교 윈터캠프 <마이크로프로세서 - 전재욱 교수님>에서 실습한 내용 중 일부다.
Renesas RA6M3(176 pin) 계열의 칩을 선택했다. 그리고 IDE는 E2 studio를 활용했다.
이번 실습의 목표는 각 sw를 누를 때마다 각각 다른 사운드를 들려주고, 그 때 sw위에 있는 LED를 표시한다. 사운드가 나올 때는 다른 sw를 눌러도 반응하지 못한다.
먼저 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개의 스위치에 대해 작성해준다. 그러면 위의 동영상 같은 결과가 나온다. 만약 헷갈리거나 어려운 코드가 있다면 이 그룹의 다른 게시물을 참고하면 알 수 있을 것이다.
'전공공부 > 마이크로프로세서 윈터캠프' 카테고리의 다른 글
윈터캠프 - 왕관현상프로젝트 (0) | 2022.02.20 |
---|---|
c언어 comparison is always true due to limited range of data type [-Wtype-limits] 에러 해결 (2) | 2022.02.07 |
RENESAS - DAC, audio conversion (0) | 2022.02.02 |
RENESAS - 실습1 (0) | 2022.02.02 |
RENESAS - AGT timer 설정 (0) | 2022.01.28 |