이번에는 지난 번에 만들어 놓은 Timer callbak 함수 내에 일정한 주기로 포트를 읽어서 입력된 포트값의 상태를 읽어서 UART에 Write 하는 동작을 테스트 해 보겠습니다.
먼저, 입력 포트를 추가합니다.
periph.c 의 GPIO_reservations 함수에 다음을 추가합니다. Expert Kit 의 스위치는 2개가 있는데, P0_6 과 P1_1 이어서 이 2개의 포트를 추가합니다.
void GPIO_reservations(void)
{
RESERVE_GPIO(SW0, GPIO_PORT_0, GPIO_PIN_6, PID_GPIO); // SW IN(K2)
RESERVE_GPIO(SW1, GPIO_PORT_1, GPIO_PIN_1, PID_GPIO); // SW IN(K1)
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*/
}
set_pad_functions 함수에도 코드를 추가합니다.
void set_pad_functions(void) // set gpio port function mode
{
GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_6, INPUT_PULLUP, PID_GPIO, true);
GPIO_ConfigurePin(GPIO_PORT_1, GPIO_PIN_1, INPUT_PULLUP, PID_GPIO, true);
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*/
}
다음으로, 지난번에 만들어 두었던 타이머 인터럽트에 의해 1초마다 콜백되는 timer0_general_user_callback_function 함수에 포트를 읽어서 UART로 송신하는 프로그램을 추가해 보겠습니다.
UART에 Write 하는 방법은 사실 좀 오랫동안 찾아 해메다가 알아냈습니다. 좀 편법적인듯도 하지만 동작은 잘 되네요. DSPS 프로그램은 버퍼가 2개 있는데 1)BLE 쪽 송/수신 버퍼 와 2)UART 송/수신 버퍼 입니다. DSPS 동작 특성은 BLE 로 받으면 무조건 UART로 보내게 되어 있으므로 BLE 수신 버퍼에 데이터를 Write 하면 UART에 출력됩니다. 이 버퍼는 링버퍼로 이루어져 있는데 아무 때나, 버퍼에 최대 용량 이내로 데이터를 넣어주면 UART로 출력되고, 다 나가면 버퍼는 비워집니다.
쉽게 말하면, da14580을 BLE에서 데이터가 들어온 것으로 속이는 것입니다.
BLE 수신시 링버퍼에 데이터를 넣는(push) 함수가 app_ble_push() 입니다.
이 함수에 전송할 데이터와 데이터 갯수를 전달해 주면 UART에 출력됩니다.
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 )
{
port_Input = GPIO_GetPinStatus(GPIO_PORT_0,GPIO_PIN_6) + ((GPIO_GetPinStatus(GPIO_PORT_1,GPIO_PIN_1))<<1 span="">1>
sprintf((char *)try_test,"time = %8d ms , Port state : %01X\n\r\0",(cnt_100ms*100),port_Input);
app_ble_push(try_test,size_user_str(try_test));
n = 0;
if (GPIO_GetPinStatus(LED_PORT, LED_PIN))
{
GPIO_SetInactive(LED_PORT, LED_PIN);
}
else
{
GPIO_SetActive(LED_PORT, LED_PIN);
}
}
n++;
}
자 그럼, 출력된 UART 를 터미날로 볼까요?
버튼 상태가 잘 읽히고, DA14580을 속여서 UART로 데이터가 잘 송신되고 있습니다. ^^
댓글 없음:
댓글 쓰기