안녕하세요, 이번에는 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)에 추가 하겠습니다.
댓글 없음:
댓글 쓰기