페이지

글목록

2016년 2월 6일 토요일

[dialog] IO control with da14580 DSPS profile (1/3)

안녕하세요, 이번에는 Dialog 의 DA14580 BLE chip으로 이미 만들어져 있는 DSPS 프로파일 프로젝트에 Timer,UART에 데이터 송신,BLE에 데이터 송신,Port Out/Input 테스트를 진행하겠습니다.

추가로 BLE로 DA14580이 직접 데이터를 수신하여 특정 명령어에 반응하도록 테스트 해 보겠습니다.

저는 DA14580 developement kit Expert 를 갖고 있습니다. (basic kit 가 더 좋은 것 같습니다. JTAG도 내장되어있고 SPI FLASH도 있고 싸고요. ^^. Expert 는 참고로 130만원. )

이 테스트는 JTAG로 그냥 Debug 모드로 SRAM에 올려서 테스트 했습니다.
UART에 점퍼 셋팅해 놓았고요. 이 외에 특이한 사항은 없습니다.

좀 프로그램이 다듬어지지 않았고, 걍 테테스트입니다. ^^

테스트 보드 사진입니다. (점퍼가 없어져서 선으로 이은 것 뿐, 특이 사항 없슴.)


먼저 GPIO 출력포트를 DSPS 기본 예제에 추가해 보겠습니다.

1. periph_setup.c 에 있는 void GPIO_reservations(void) 함수에 코드를 추가했습니다.

#if DEVELOPMENT_DEBUG

void GPIO_reservations(void)
{
RESERVE_GPIO(LED, LED_PORT, LED_PIN, PID_GPIO);    // LED OUT

RESERVE_GPIO( UART1_TX, UART1_TX_PORT, UART1_TX_PIN, PID_UART1_TX);
RESERVE_GPIO( UART1_RX, UART1_RX_PORT, UART1_RX_PIN, PID_UART1_RX);

#if (UART_HW_FLOW_ENABLED)
 RESERVE_GPIO( UART1_RTS, UART1_RTS_PORT, UART1_RTS_PIN, PID_UART1_RTSN);
RESERVE_GPIO( UART1_CTS, UART1_CTS_PORT, UART1_CTS_PIN, PID_UART1_CTSN);
#endif /*UART_HW_FLOW_ENABLED*/
}
#endif //DEVELOPMENT_DEBUG

(Dialog 기본프로그램은  GPIO 포트를 사용하려할때, GPIO_reservations에서 reserve 하더군요. )



2. set_pad_functions() 함수도 바꿔 줬습니다.

void set_pad_functions(void)        // set gpio port function mode
{
    GPIO_ConfigurePin(LED_PORT, LED_PIN, OUTPUT, PID_GPIO, false);

    GPIO_ConfigurePin( UART1_TX_PORT, UART1_TX_PIN, OUTPUT, PID_UART1_TX, false );
    GPIO_ConfigurePin( UART1_RX_PORT, UART1_RX_PIN, INPUT_PULLUP, PID_UART1_RX, false );
#if (UART_HW_FLOW_ENABLED)
    GPIO_ConfigurePin( UART1_RTS_PORT, UART1_RTS_PIN, OUTPUT, PID_UART1_RTSN, false );
    GPIO_ConfigurePin( UART1_CTS_PORT, UART1_CTS_PIN, INPUT_PULLUP, PID_UART1_CTSN, false );
#endif /*UART_HW_FLOW_ENABLED*/
}


자, 이렇게 설정하고 Timer Interrupt 동작을 한번 테스트 해 볼까요?

periph.c  의 periph_init 함수를 다음과 같이 수정합니다.
- 타이머 인터럽트 발생 주기를 100ms(RELOAD_100MS=20000)로 설정하고 타이머 인터럽트를 활성화합니다.

void periph_init(void)
{
// Power up peripherals' power domain
    SetBits16(PMU_CTRL_REG, PERIPH_SLEEP, 0);
    while (!(GetWord16(SYS_STAT_REG) & PER_IS_UP)) ;
//rom patch
patch_func();
//Init pads
set_pad_functions();
   
 SetBits16(CLK_PER_REG, UART1_ENABLE, 1);    // enable clock - always @16MHz
    // baudr=9-> 115k2
    // mode=3-> no parity, 1 stop bit 8 data length
 uart_sps_init(UART_SPS_BAUDRATE, 3); //exact baud rate defined in uart.h

   // Enable the pads
SetBits16(SYS_CTRL_REG, PAD_LATCH_EN, 1);

#if (EXT_SLEEP_ENABLED)
    app_scheduler_reinit();
#endif //EXT_SLEEP_ENABLED

    // Stop timer for enter settings
    timer0_stop();
    // register callback function for SWTIM_IRQn irq
    timer0_register_callback(timer0_general_user_callback_function);
    // Enable TIMER0 clock
    set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
    // Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
    set_tmr_div(CLK_PER_REG_TMR_DIV_8);
    // clear PWM settings register to not generate PWM
    timer0_set_pwm_high_counter(NO_PWM);
    timer0_set_pwm_low_counter(NO_PWM);
    
    timer0_set_pwm_on_counter(RELOAD_100MS);
    timer0_enable_irq();
    timer0_start();


#if ((UART_HW_FLOW_ENABLED) && !defined(GPIO_DRV_IRQ_HANDLING_DISABLED))
    GPIO_RegisterCallback(GPIO0_IRQn, gpio0_callback);
    if(GPIO_GetPinStatus(UART1_CTS_PORT,UART1_CTS_PIN)==FALSE)
    {
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 0, 1, 0);
    }
    else if(GPIO_GetPinStatus(UART1_CTS_PORT,UART1_CTS_PIN)==TRUE)
    {
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 1, 0, 0);
    }
#endif //((UART_HW_FLOW_ENABLED) && !defined(GPIO_DRV_IRQ_HANDLING_DISABLED))
}

이렇게 하면  타이머 인터럽트가 걸리면 void timer0_general_user_callback_function(void) 함수를 호출하게 됩니다.


다음으로 timer0_general_user_callback_function 함수의 내용 입니다.
void timer0_general_user_callback_function(void)
{
    static uint8_t n = 0;
    static uint32_t cnt_100ms = 0;
uint8_t try_test[100];
uint16_t port_Input=0;

cnt_100ms++;
    // when pass  10 * 100ms
    if ( 10 == n )
    {
        n = 0;
        if (GPIO_GetPinStatus(LED_PORT, LED_PIN))
        {
            GPIO_SetInactive(LED_PORT, LED_PIN);
        }
        else
        {
            GPIO_SetActive(LED_PORT, LED_PIN);
        }
     }
     n++;
}


자, 이렇게 하면 어떻게 될까요?
LED_PORT 의 LED_PIN 이 토글하겠죠? 

정확히 말하면 타이머 인터럽트가 100ms 마다 발생하면, timer0_general_user_callback_function 함수가 호출되어 static 변수 n이 1씩 증가하다가 n이 10이되면(1초마다) 현재 LED에 연결되어 있는 GPIO 포트를 읽어서 1이면 0, 0이면 1로 토글하는 동작을 합니다.

이렇게 해서, DSPS에 Timer 와 GPIO 출력까지 추가해 봤습니다.

예제 소스 파일은 마지막(3/3)에 추가 하겠습니다.

댓글 없음:

댓글 쓰기