- 忘れるので、メモっておく。
概要
SoftDeviceで、BLEで、Read/Writeされたときは、割り込み中なので、UARTの割り込みが動かない。(PRIORITYをHIGHにすると、別のとこがおかしくなった)
ので、UARTはFIFOのやつを使って、UARTの割り込みハンドラのUART0_IRQHandler()を呼び続ける。
BLEでリクエストあったときに、別のデバイスから、UARTで情報取り出して、それを使いたいとか、そういうとき使う。反応がおそいと、BLE接続が切れるので注意する。
例
volatile uint8_t bFlagExit;
uint8_t ReceivedCh;
void usr_uart_recv_ch(uint8_t ch)
{
ReceivedCh = ch;
bFlagExit = 1; // ループを抜ける
}
void uart_error_handle(app_uart_evt_t * p_event)
{
switch (p_event->evt_type)
{
case APP_UART_COMMUNICATION_ERROR:
APP_ERROR_HANDLER(p_event->data.error_communication);
break;
case APP_UART_FIFO_ERROR:
APP_ERROR_HANDLER(p_event->data.error_code);
break;
case APP_UART_DATA_READY:
case APP_UART_DATA:
{
uint8_t cr;
if (app_uart_get(&cr) == NRF_SUCCESS)
{ //読み出しがうまくいったら、ユーザ関数を呼んで、うまく処理する
usr_uart_recv_ch(cr);
}
break;
}
case APP_UART_TX_EMPTY:
break;
default:
break;
}
}
void uart_wait_for_RX_in_interrput()
{
bFlagExit = 0;
while (!bFlagExit)
{
UART0_IRQHandler(); // こいつをぶん回して、uart受信すると、ル=プから抜けるハズ
}
}
uart_error_handle()は、uartの初期化の時に登録するコールバック
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_error_handle, //<==こいつ
APP_IRQ_PRIORITY_LOW,
err_code);