UART
UART moduleを用いることで、UART通信を行うことが可能になります。
基板とオプション設定
UARTでデータの送受信をするには、基板のRX, TXのピンの位置を確認しておく。
基板名 |
RX |
TX |
RTS |
CTS |
PCA10028 |
P0.11 |
P0.09 |
P0.08 |
P0.06 |
PCA10036 |
P0.08 |
P0.06 |
P0.05 |
P0.10 |
FaBo Breakout |
P0.09 |
P0.11 |
なし |
なし |
コンポーネントの取り込み
Device関連 |
nRF Driver |
nRF Libraries |
nRF SoftDevice |
|
|
|
|
もし、オレンジ色に変わる場合は、ライブラリの足りていないエラーなので、Rsolvボタンを押して不足ライブラリを補充する。
URATの設定
OptionのC/C++タブで、Defineの値にボード名をいれることで、URATのPINを設定することができる。
基板名 |
Defineの値 |
実際の画面 |
PCA10028 |
BOARD_PCA10028 |
|
PCA10036 |
BOARD_PCA10036 |
|
FaBo Breakout Board |
BOARD_CUSTOM |
|
Nordic製の開発ボードは、boards.hを読み込みにいき、boards.hに書くボードようのヘッダーファイルのincludeが記載されている。PCA10028, PCA10036のPINの値は、それぞれpca10028.h, pca10036.hで定義されている。
boards.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | #ifndef BOARDS_H
#define BOARDS_H
#include "nrf_gpio.h"
#if defined(BOARD_NRF6310)
#include "nrf6310.h"
#elif defined(BOARD_PCA10000)
#include "pca10000.h"
#elif defined(BOARD_PCA10001)
#include "pca10001.h"
#elif defined(BOARD_PCA10002)
#include "pca10000.h"
#elif defined(BOARD_PCA10003)
#include "pca10003.h"
#elif defined(BOARD_PCA20006)
#include "pca20006.h"
#elif defined(BOARD_PCA10028)
#include "pca10028.h"
#elif defined(BOARD_PCA10031)
#include "pca10031.h"
#elif defined(BOARD_PCA10036)
#include "pca10036.h"
#elif defined(BOARD_PCA10040)
#include "pca10040.h"
#elif defined(BOARD_WT51822)
#include "wt51822.h"
#elif defined(BOARD_N5DK1)
#include "n5_starterkit.h"
#elif defined(BOARD_CUSTOM)
#include "custom_board.h"
#else
#error "Board is not defined"
|
FaBo Breakout Boardに関しては、独自にPINの値の定義をおこなう。CUSTOM_BOARDと定義すると、boards_custom.h
を読みにいくようになるので、boards_custom.h
を作成し、そこに値を記載する。また、boards_custom.h
の作成したディレクトリにパスを通しておくことも忘れない。
boards_custom.h
| #define RX_PIN_NUMBER 9
#define TX_PIN_NUMBER 11
#define RTS_PIN_NUMBER 99
#define CTS_PIN_NUMBER 99
|
SourceCode(PCA10028, PCA10036用)
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 | #include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "app_uart.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "boards.h"
#define UART_TX_BUF_SIZE 1024u /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 1024u /**< UART RX buffer size. */
int counter = 0;
/**
* @brief UARTのイベントハンドラ.
*/
void uart_events_handler(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_TX_EMPTY:
break;
default: break;
}
}
/**
* @brief UART初期化処理.
*/
void uart_config(void)
{
uint32_t err_code;
const app_uart_comm_params_t comm_params =
{
RX_PIN_NUMBER,
TX_PIN_NUMBER,
RTS_PIN_NUMBER,
CTS_PIN_NUMBER,
APP_UART_FLOW_CONTROL_DISABLED,
false,
UART_BAUDRATE_BAUDRATE_Baud38400
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_events_handler,
APP_IRQ_PRIORITY_LOW,
err_code);
APP_ERROR_CHECK(err_code);
}
/**
* @brief Main処理.
*/
int main(void)
{
uart_config();
while (true)
{
printf("\n\rCounter:%d.\r\n", counter);
nrf_delay_ms(1000);
counter++;
}
}
|
SourceCode(FaBo Breakout)
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 | #include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "app_uart.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "boards.h"
#define UART_TX_BUF_SIZE 1024u /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 1024u /**< UART RX buffer size. */
int counter = 0;
/**
* @brief UARTのイベントハンドラ.
*/
void uart_events_handler(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_TX_EMPTY:
break;
default: break;
}
}
/**
* @brief UART初期化処理.
*/
void uart_config(void)
{
uint32_t err_code;
const app_uart_comm_params_t comm_params =
{
RX_PIN_NUMBER,
TX_PIN_NUMBER,
RTS_PIN_NUMBER,
CTS_PIN_NUMBER,
APP_UART_FLOW_CONTROL_DISABLED,
false,
UART_BAUDRATE_BAUDRATE_Baud38400
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_events_handler,
APP_IRQ_PRIORITY_LOW,
err_code);
APP_ERROR_CHECK(err_code);
}
/**
* @brief Main処理.
*/
int main(void)
{
uart_config();
while (true)
{
printf("\n\rCounter:%d.\r\n", counter);
nrf_delay_ms(1000);
counter++;
}
}
|
board_custom.h
(新規作成)
| #define RX_PIN_NUMBER 9
#define TX_PIN_NUMBER 11
#define RTS_PIN_NUMBER 99
#define CTS_PIN_NUMBER 99
|
board_custom.hを作成したフォルダにパスを通す。
Configを修正し、UARTを有効にする
nrf_drv_config.hファイルにGPIOTE, UARTの有効にする変数があるので、修正を加える。
GPIOTEを有効にするため
にする。
| /* GPIOTE */
#define GPIOTE_ENABLED 1
#if (GPIOTE_ENABLED == 1)
#define GPIOTE_CONFIG_USE_SWI_EGU false
#define GPIOTE_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1
#endif
|
UARTを有効にするため
にする。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | /* UART */
#define UART0_ENABLED 1
#if (UART0_ENABLED == 1)
#define UART0_CONFIG_HWFC NRF_UART_HWFC_DISABLED
#define UART0_CONFIG_PARITY NRF_UART_PARITY_EXCLUDED
#define UART0_CONFIG_BAUDRATE NRF_UART_BAUDRATE_38400
#define UART0_CONFIG_PSEL_TXD 0
#define UART0_CONFIG_PSEL_RXD 0
#define UART0_CONFIG_PSEL_CTS 0
#define UART0_CONFIG_PSEL_RTS 0
#define UART0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
#ifdef NRF52
#define UART0_CONFIG_USE_EASY_DMA false
//Compile time flag
#define UART_EASY_DMA_SUPPORT 1
#define UART_LEGACY_SUPPORT 1
#endif //NRF52
#endif
|
Buildして転送