LoginSignup
5
7

More than 5 years have passed since last update.

[メモ]Nordic nrf51822: BLE GATT read/writeされてるときにUARTを使いたい

Posted at
  • 忘れるので、メモっておく。

概要

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);
5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7