• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

C言語でBBC micro:bit V2およびDFRobot micro:Maqueenを操作する


Commit MetaInfo

Revision3ffc896044bf590dd9dda7e0666858bf46d3b90b (tree)
Time2023-09-09 09:44:17
Authorxm6_original <tanaka_yasushi2008@yaho...>
Commiterxm6_original

Log Message

I2C・ラインセンサ・モータ制御を追加

Change Summary

Incremental Difference

--- a/nRFHello/include/pf_button.h
+++ b/nRFHello/include/pf_button.h
@@ -32,7 +32,7 @@ typedef enum PF_BUTTON_ID_Tag
3232 {
3333 PF_BUTTON_ID_BUTTON_A, //!< BUTTON A(Display面から見て左側)
3434 PF_BUTTON_ID_BUTTON_B, //!< BUTTON B(Display面から見て右側)
35- PF_BUTTON_ID_MAX //!< (IDの個数を表す)I
35+ PF_BUTTON_ID_MAX, //!< (IDの個数を表す)
3636 } PF_BUTTON_ID;
3737
3838 //! @brief ボタン初期化
@@ -40,7 +40,7 @@ typedef enum PF_BUTTON_ID_Tag
4040 void pf_button_init(void);
4141
4242 //! @brief ボタン定期タスク
43-//! @remarks 定期タスク(入力系)処理から呼び出すこと
43+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
4444 void pf_button_task(void);
4545
4646 //! @brief ボタンの押下状態を取得
--- a/nRFHello/include/pf_display.h
+++ b/nRFHello/include/pf_display.h
@@ -28,16 +28,16 @@
2828 #include "pf_types.h"
2929
3030 //! @brief 行の最大数
31-#define PF_DISPLAY_ROW_MAX 5
31+#define PF_DISPLAY_ROW_MAX ((u4)5U)
3232
3333 //! @brief 列の最大数
34-#define PF_DISPLAY_COL_MAX 5
34+#define PF_DISPLAY_COL_MAX ((u4)5U)
3535
3636 //! @brief 明るさの最小値
37-#define PF_DISPLAY_BRIGHTNESS_MIN 4
37+#define PF_DISPLAY_BRIGHTNESS_MIN ((u4)4U)
3838
3939 //! @brief 明るさの最大値
40-#define PF_DISPLAY_BRIGHTNESS_MAX 96
40+#define PF_DISPLAY_BRIGHTNESS_MAX ((u4)96U)
4141
4242 //! @brief イメージのID
4343 typedef enum PF_DISPLAY_ID_Tag
@@ -83,7 +83,7 @@ void pf_display_init(void);
8383
8484 //! @brief Display表示(文字)
8585 //! @param [in] ch ASCII文字(0x20~0x7F)
86-void pf_display_chr(char ch);
86+void pf_display_ch(char ch);
8787
8888 //! @brief Display表示(ID)
8989 //! @param [in] id イメージのID
--- a/nRFHello/include/pf_gpio.h
+++ b/nRFHello/include/pf_gpio.h
@@ -44,9 +44,15 @@ typedef enum PF_GPIO_ID_Tag
4444 PF_GPIO_ID_COL5, //!< Display COL5
4545 PF_GPIO_ID_BUTTON_A, //!< BUTTON A
4646 PF_GPIO_ID_BUTTON_B, //!< BUTTON B
47+ PF_GPIO_ID_INTERNAL_SCL, //!< 内部I2Cバス SCL
48+ PF_GPIO_ID_INTERNAL_SDA, //!< 内部I2Cバス SDA
49+ PF_GPIO_ID_EXTERNAL_SCL, //!< 外部I2Cバス SCL
50+ PF_GPIO_ID_EXTERNAL_SDA, //!< 外部I2Cバス SDA
4751 PF_GPIO_ID_MAQUEEN_LED_L, //!< MAQUEEN LED L
4852 PF_GPIO_ID_MAQUEEN_LED_R, //!< MAQUEEN LED R
49- PF_GPIO_ID_MAX //!< (IDの個数を表す)I
53+ PF_GPIO_ID_MAQUEEN_PATROL_L, //!< MAQUEEN PATROL L
54+ PF_GPIO_ID_MAQUEEN_PATROL_R, //!< MAUQEEN PATROL R
55+ PF_GPIO_ID_MAX, //!< (IDの個数を表す)
5056 } PF_GPIO_ID;
5157
5258 //! @brief GPIO初期化
--- /dev/null
+++ b/nRFHello/include/pf_i2c.h
@@ -0,0 +1,91 @@
1+//! @file pf_i2c.h
2+//! @brief プラットフォーム(I2C)ヘッダファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#ifndef PF_I2C_H
26+#define PF_I2C_H
27+
28+#include "pf_types.h"
29+
30+//! @brief I2Cコールバック関数
31+//! @param [in] status 通信ステータス(TRUE=成功/FALSE=失敗)
32+typedef void (*PF_I2C_CALLBACK)(BOOL status);
33+
34+//! @brief I2C通信先のID
35+typedef enum PF_I2C_ID_Tag
36+{
37+ PF_I2C_ID_ACCELEROMETER, //!< 加速度センサ
38+ PF_I2C_ID_MAGNETOMETER, //!< 磁気センサ
39+ PF_I2C_ID_MAQUEEN_MOTOR, //!< MAQUEEN モータ
40+ PF_I2C_ID_MAX //!< (IDの個数を表す)
41+} PF_I2C_ID;
42+
43+//! @brief I2Cエラー情報構造体
44+typedef struct PF_I2C_ERROR_Tag
45+{
46+ u4 overrun; //!< オーバーラン発生回数(受信動作が不正)
47+ u4 anack; //!< アドレスNACK発生回数
48+ u4 dnack; //!< データNACK発生回数
49+} PF_I2C_ERROR;
50+
51+//! @brief I2C初期化
52+//! @remarks プラットフォーム初期化処理から呼び出すこと
53+void pf_i2c_init(void);
54+
55+//! @brief I2C送信
56+//! @param [in] id I2C通信先のID
57+//! @param [in] buf 送信バッファへのポインタ
58+//! @param [in] bytes 送信バイト数
59+//! @return 送信ステータス(TRUE=送信開始/FALSE=デバイスBUSY)
60+//! @attention 呼び出し側で送信バッファのライフタイムを保証すること
61+BOOL pf_i2c_send(PF_I2C_ID id, const u1 *buf, u4 bytes);
62+
63+//! @brief I2C受信
64+//! @param [in] id I2C通信先のID
65+//! @param [in] reg 受信レジスタ
66+//! @param [in] buf 受信バッファへのポインタ
67+//! @param [in] bytes 受信バイト数
68+//! @return 受信ステータス(TRUE=受信開始/FALSE=デバイスBUSY)
69+BOOL pf_i2c_recv(PF_I2C_ID id, u1 reg, u1 *buf, u4 bytes);
70+
71+//! @brief I2Cエラー情報取得
72+//! @param [in] id I2C通信先のID
73+//! @param [out] error エラー情報構造体へのポインタ
74+//! @remarks プラットフォーム内部のエラー情報はクリアされる
75+void pf_i2c_error(PF_I2C_ID id, PF_I2C_ERROR *error);
76+
77+//! @brief I2Cコールバック関数設定
78+//! @param [in] id I2C通信先のID
79+//! @param [in] func I2Cコールバック関数へのポインタ
80+//! @attention I2Cコールバック関数は割り込みコンテキストで呼び出される
81+void pf_i2c_callback(PF_I2C_ID id, PF_I2C_CALLBACK func);
82+
83+//! @brief I2C割り込みハンドラ(チャネル0=内部I2Cバス)
84+//! @attention データ競合(割り込み干渉)に注意する
85+void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void);
86+
87+//! @brief I2C割り込みハンドラ(チャネル1=外部I2Cバス)
88+//! @attention データ競合(割り込み干渉)に注意する
89+void SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler(void);
90+
91+#endif // PF_I2C_H
--- a/nRFHello/include/pf_interrupt.h
+++ b/nRFHello/include/pf_interrupt.h
@@ -31,9 +31,10 @@
3131 typedef enum PF_INTERRUPT_PRI_Tag
3232 {
3333 PF_INTERRUPT_PRI_SYSTICK = 0, //!< SysTick
34- PF_INTERRUPT_PRI_POWER, //!< Power
3534 PF_INTERRUPT_PRI_UART, //!< UART
3635 PF_INTERRUPT_PRI_DISPLAY_TIMER, //!< Display Timer
36+ PF_INTERRUPT_PRI_I2C_INT, //!< I2C(内部)
37+ PF_INTERRUPT_PRI_I2C_EXT, //!< I2C(外部)
3738 } PF_INTERRUPT_PRI;
3839
3940 //! @brief グローバル割り込み禁止
--- a/nRFHello/include/pf_led.h
+++ b/nRFHello/include/pf_led.h
@@ -30,15 +30,19 @@
3030 //! @brief LEDのID
3131 typedef enum PF_LED_ID_Tag
3232 {
33- PF_LED_ID_MAQUEEN_L, //!< micro:Maqueenの左側赤色LED
34- PF_LED_ID_MAQUEEN_R, //!< micro:Maqueenの右側赤色LED
35- PF_LED_ID_MAX //!< (IDの個数を表す)
33+ PF_LED_ID_L, //!< 左側LED
34+ PF_LED_ID_R, //!< 右側LED
35+ PF_LED_ID_MAX, //!< (IDの個数を表す)
3636 } PF_LED_ID;
3737
3838 //! @brief LED初期化
3939 //! @remarks プラットフォーム初期化処理から呼び出すこと
4040 void pf_led_init(void);
4141
42+//! @brief LED定期タスク
43+//! @remarks プラットフォーム定期タスク(出力系)処理から呼び出すこと
44+void pf_led_task(void);
45+
4246 //! @brief LED制御
4347 //! @param [in] id LEDのID
4448 //! @param [in] ctrl LED制御情報(TRUE=LED点灯/FALSE=LED消灯)
--- /dev/null
+++ b/nRFHello/include/pf_motor.h
@@ -0,0 +1,54 @@
1+//! @file pf_motor.h
2+//! @brief プラットフォーム(モータ)ヘッダファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#ifndef PF_MOTOR_H
26+#define PF_MOTOR_H
27+
28+#include "pf_types.h"
29+
30+//! @brief モータ駆動方向
31+typedef enum PF_MOTOR_DIR_Tag
32+{
33+ PF_MOTOR_DIR_FORWARD, //!< 前進
34+ PF_MOTOR_DIR_LEFT, //!< 左回転
35+ PF_MOTOR_DIR_RIGHT, //!< 右回転
36+ PF_MOTOR_DIR_BACKWORD, //!< 後進
37+ PF_MOTOR_DIR_STOP, //!< 停止
38+ PF_MOTOR_DIR_MAX, //!< (方向の個数を表す)
39+} PF_MOTOR_DIR;
40+
41+//! @brief モータ初期化
42+//! @remarks プラットフォーム初期化処理から呼び出すこと
43+void pf_motor_init(void);
44+
45+//! @brief モータ定期タスク
46+//! @remarks プラットフォーム定期タスク(出力系)処理から呼び出すこと
47+void pf_motor_task(void);
48+
49+//! @brief モータ駆動
50+//! @details モータ定期タスクで実際のモータ出力が行われる
51+//! @param [in] dir モータ駆動方向
52+void pf_motor_drive(PF_MOTOR_DIR dir);
53+
54+#endif // PF_MOTOR_H
--- /dev/null
+++ b/nRFHello/include/pf_patrol.h
@@ -0,0 +1,59 @@
1+//! @file pf_patrol.h
2+//! @brief プラットフォーム(ラインセンサ)ヘッダファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#ifndef PF_PATROL_H
26+#define PF_PATROL_H
27+
28+#include "pf_types.h"
29+
30+//! @brief ラインセンサのID
31+typedef enum PF_PATROL_ID_Tag
32+{
33+ PF_PATROL_ID_L, //!< 左センサ
34+ PF_PATROL_ID_R, //!< 右センサ
35+ PF_PATROL_ID_MAX, //!< (IDの個数を表す)
36+} PF_PATROL_ID;
37+
38+//! @brief ラインセンサで検出できる色
39+typedef enum PF_PATROL_COLOR_Tag
40+{
41+ PF_PATROL_COLOR_WHITE = 0, //!< 白色
42+ PF_PATROL_COLOR_BLACK, //!< 黒色
43+ PF_PATROL_COLOR_MAX, //!< (色の個数を表す)
44+} PF_PATROL_COLOR;
45+
46+//! @brief ラインセンサ初期化
47+//! @remarks プラットフォーム初期化処理から呼び出すこと
48+void pf_patrol_init(void);
49+
50+//! @brief ラインセンサ定期タスク
51+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
52+void pf_patrol_task(void);
53+
54+//! @brief ラインセンサの白黒状態を取得
55+//! @param [in] id ラインセンサのID
56+//! @return 色状態(PF_PATROL_COLOR_WHITE=白色/PF_PATROL_COLOR_BLACK=黒色)
57+PF_PATROL_COLOR pf_patrol_get(PF_PATROL_ID id);
58+
59+#endif // PF_PATROL_H
--- a/nRFHello/include/pf_power.h
+++ b/nRFHello/include/pf_power.h
@@ -32,8 +32,8 @@
3232 //! @attention Display初期化の後で呼び出すこと
3333 void pf_power_init(void);
3434
35-//! @brief Power割り込みハンドラ
36-//! @attention 割り込み発生以降、Displayの動作が×固定になる
37-void POWER_CLOCK_IRQHandler(void);
35+//! @brief Power定期タスク
36+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
37+void pf_power_task(void);
3838
3939 #endif // PF_POWER_H
--- a/nRFHello/include/pf_systick.h
+++ b/nRFHello/include/pf_systick.h
@@ -33,9 +33,9 @@
3333 //! @brief SysTick時刻情報構造体
3434 typedef struct PF_SYSTICK_TIME_Tag
3535 {
36- u4 sec; //!< [sec]秒
37- u4 ms; //!< [ms]ミリ秒(0~999)
38- u4 us; //!< [us]マイクロ秒(0~999)
36+ u4 sec; //!< 秒(0~)
37+ u4 ms; //!< ミリ秒(0~999)
38+ u4 us; //!< マイクロ秒(0~999)
3939 } PF_SYSTICK_TIME;
4040
4141 //! @brief SysTick初期化
--- a/nRFHello/include/pf_uart.h
+++ b/nRFHello/include/pf_uart.h
@@ -27,13 +27,22 @@
2727
2828 #include "pf_types.h"
2929
30+//! @brief UARTエラー情報構造体
31+typedef struct PF_UART_ERROR_Tag
32+{
33+ u4 overrun; //!< オーバーランエラー発生回数
34+ u4 parity; //!< パリティエラー発生回数
35+ u4 framing; //!< フレーミングエラー発生回数
36+ u4 brk; //!< ブレーク信号受信回数
37+} PF_UART_ERROR;
38+
3039 //! @brief UART初期化
3140 //! @remarks プラットフォーム初期化処理から呼び出すこと
3241 //! @attention GPIO初期化の後で呼び出すこと
3342 void pf_uart_init(void);
3443
3544 //! @brief UART定期タスク
36-//! @remarks 定期タスク(出力系)処理から呼び出すこと
45+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
3746 void pf_uart_task(void);
3847
3948 //! @brief UART送信
@@ -47,6 +56,11 @@ void pf_uart_send(const u1 *buf, u4 bytes);
4756 //! @return 受信したバイト数
4857 u4 pf_uart_recv(u1 *buf, u4 bytes);
4958
59+//! @brief UARTエラー情報取得
60+//! @param [out] error エラー情報構造体へのポインタ
61+//! @remarks プラットフォーム内部のエラー情報はクリアされる
62+void pf_uart_error(PF_UART_ERROR *error);
63+
5064 //! @brief UART1文字出力
5165 //! @param [in] ch 送信する文字(0xFF以外)
5266 void pf_uart_putc(u1 ch);
--- a/nRFHello/src/main.c
+++ b/nRFHello/src/main.c
@@ -29,46 +29,58 @@
2929 #include "pf_timer.h"
3030 #include "pf_uart.h"
3131 #include "pf_display.h"
32+#include "pf_i2c.h"
3233 #include "pf_power.h"
3334 #include "pf_button.h"
3435 #include "pf_led.h"
36+#include "pf_patrol.h"
37+#include "pf_motor.h"
3538
3639 //! @brief プラットフォーム初期化
3740 //! @attention 初期化順序に注意する
3841 static void pf_init(void)
3942 {
40- // Phase1: クロックをHFXO(外部発振子)に切り替える
43+ // Step1: クロックをHFXO(外部発振子)に切り替える
4144 pf_clock_init();
4245
43- // Phase2: 低位モジュールを初期化する
46+ // Step2: 低位モジュールを初期化する
4447 pf_gpio_init();
4548 pf_systick_init();
4649 pf_timer_init();
4750
48- // Phase3: 中位モジュール(低位モジュールに依存するモジュール)を初期化する
51+ // Step3: 中位モジュール(低位モジュールに依存するモジュール)を初期化する
4952 pf_uart_init();
5053 pf_display_init();
54+ pf_i2c_init();
5155
52- // Phase4: その他のモジュールを初期化する
56+ // Step4: 高位モジュール(低位モジュールまたは中位モジュールに依存するモジュール)を初期化する
5357 pf_power_init();
5458 pf_button_init();
5559 pf_led_init();
60+ pf_patrol_init();
61+ pf_motor_init();
5662 }
5763
5864 //! @brief 定期タスク(入力系)
5965 static void pf_input_task(void)
6066 {
67+ pf_power_task();
68+ pf_uart_task();
6169 pf_button_task();
70+ pf_patrol_task();
6271 }
6372
6473 //! @brief 定期タスク(出力系)
6574 static void pf_output_task(void)
6675 {
67- pf_uart_task();
76+ pf_led_task();
77+ pf_motor_task();
6878 }
6979
7080 static BOOL button_prev[2];
7181 static PF_DISPLAY_ID display_id;
82+static char display_ch = 0x20;
83+static PF_MOTOR_DIR motor_dir = 0;
7284
7385 //! @brief アプリケーションタスク
7486 static void app_task(void)
@@ -83,8 +95,9 @@ static void app_task(void)
8395 if (button_now[0])
8496 {
8597 pf_uart_log("Button A: OFF -> ON");
86- pf_display_id(display_id);
8798
99+ // アイコン系
100+ pf_display_id(display_id);
88101 display_id++;
89102 if (display_id >= PF_DISPLAY_ID_MAX)
90103 {
@@ -102,15 +115,52 @@ static void app_task(void)
102115 if (button_now[1])
103116 {
104117 pf_uart_log("Button B: OFF -> ON");
105- pf_led_ctrl(PF_LED_ID_MAQUEEN_L, TRUE);
118+
119+ // キャラクタ系
120+ pf_display_ch(display_ch);
121+ if (display_ch == 0x7F)
122+ {
123+ display_ch = 0x20;
124+ }
125+ else
126+ {
127+ display_ch++;
128+ }
129+
130+ // モータ駆動
131+ pf_motor_drive(motor_dir);
132+ motor_dir++;
133+ if (motor_dir >= PF_MOTOR_DIR_MAX)
134+ {
135+ motor_dir = 0;
136+ }
106137 }
107138 else
108139 {
109140 pf_uart_log("Button B: ON -> OFF\n");
110- pf_led_ctrl(PF_LED_ID_MAQUEEN_L, FALSE);
111141 }
112142 }
113143
144+ // ラインセンサとLEDの連携制御(黒色で点灯、白色で消灯)
145+ if (PF_PATROL_COLOR_BLACK == pf_patrol_get(PF_PATROL_ID_L))
146+ {
147+ pf_led_ctrl(PF_LED_ID_L, TRUE);
148+ }
149+ else
150+ {
151+ pf_led_ctrl(PF_LED_ID_L, FALSE);
152+ }
153+
154+ if (PF_PATROL_COLOR_BLACK == pf_patrol_get(PF_PATROL_ID_R))
155+ {
156+ pf_led_ctrl(PF_LED_ID_R, TRUE);
157+ }
158+ else
159+ {
160+ pf_led_ctrl(PF_LED_ID_R, FALSE);
161+ }
162+
163+ // ボタン情報を更新
114164 button_prev[0] = button_now[0];
115165 button_prev[1] = button_now[1];
116166 }
--- a/nRFHello/src/pf/pf_button.c
+++ b/nRFHello/src/pf/pf_button.c
@@ -27,12 +27,18 @@
2727 #include "pf_button.h"
2828
2929 //! @brief チャタリング防止のためのフィルタ段数(最低2段以上にすること)
30-#define PF_BUTTON_FILTER_MAX (3)
30+#define PF_BUTTON_FILTER_MAX ((u4)3U)
31+
32+//! @brief ボタン→GPIO IDテーブル
33+static const PF_GPIO_ID pf_button_to_gpio[PF_BUTTON_ID_MAX] =
34+{
35+ PF_GPIO_ID_BUTTON_A, //!< BUTTON A(Display面から見て左側)
36+ PF_GPIO_ID_BUTTON_B, //!< BUTTON B(Display面から見て右側)
37+};
3138
3239 //! @brief ボタン情報構造体
3340 typedef struct PF_BUTTON_INFO_Tag
3441 {
35- PF_GPIO_ID gpio; //!< GPIOピンのID
3642 BOOL prev[PF_BUTTON_FILTER_MAX]; //!< 過去データ
3743 BOOL now; //!< 現在データ
3844 } PF_BUTTON_INFO;
@@ -49,18 +55,6 @@ static void pf_button_init_id(PF_BUTTON_ID id)
4955 // オート変数初期化
5056 loop = 0;
5157
52- // GPIOピンのIDを設定
53- if (0 == id)
54- {
55- // ボタンA
56- pf_button_info[id].gpio = PF_GPIO_ID_BUTTON_A;
57- }
58- else
59- {
60- // ボタンB
61- pf_button_info[id].gpio = PF_GPIO_ID_BUTTON_B;
62- }
63-
6458 // 過去データをすべてFALSE(押されていない)に初期化
6559 for (loop = 0; loop < PF_BUTTON_FILTER_MAX; loop++)
6660 {
@@ -75,16 +69,16 @@ static void pf_button_init_id(PF_BUTTON_ID id)
7569 //! @remarks プラットフォーム初期化処理から呼び出すこと
7670 void pf_button_init(void)
7771 {
78- u4 id;
72+ PF_BUTTON_ID id;
7973
8074 // オート変数初期化
8175 id = 0;
8276
8377 // すべてのIDをループ
84- for (id = 0; id < (u4)PF_BUTTON_ID_MAX; id++)
78+ for (id = 0; id < PF_BUTTON_ID_MAX; id++)
8579 {
8680 // 1つのIDを初期化
87- pf_button_init_id((PF_BUTTON_ID)id);
81+ pf_button_init_id(id);
8882 }
8983 }
9084
@@ -92,17 +86,19 @@ void pf_button_init(void)
9286 //! @param [in] id ボタンのID
9387 static void pf_button_task_id(PF_BUTTON_ID id)
9488 {
89+ PF_GPIO_ID gpio;
9590 u4 loop;
9691 BOOL result;
9792 BOOL now;
9893
9994 // オート変数初期化
95+ gpio = pf_button_to_gpio[id];
10096 loop = 0;
10197 result = FALSE;
10298 now = FALSE;
10399
104100 // 現在のボタン押下情報を取得(GPIOからの入力が'L'で押されている)
105- if (FALSE == pf_gpio_input(pf_button_info[id].gpio))
101+ if (FALSE == pf_gpio_input(gpio))
106102 {
107103 // 押されている
108104 result = TRUE;
@@ -140,19 +136,19 @@ static void pf_button_task_id(PF_BUTTON_ID id)
140136 }
141137
142138 //! @brief ボタン定期タスク
143-//! @remarks 定期タスク(入力系)処理から呼び出すこと
139+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
144140 void pf_button_task(void)
145141 {
146- u4 id;
142+ PF_BUTTON_ID id;
147143
148144 // オート変数初期化
149145 id = 0;
150146
151147 // すべてのIDをループ
152- for (id = 0; id < (u4)PF_BUTTON_ID_MAX; id++)
148+ for (id = 0; id < PF_BUTTON_ID_MAX; id++)
153149 {
154150 // 1つのIDを処理
155- pf_button_task_id((PF_BUTTON_ID)id);
151+ pf_button_task_id(id);
156152 }
157153 }
158154
--- a/nRFHello/src/pf/pf_clock.c
+++ b/nRFHello/src/pf/pf_clock.c
@@ -34,18 +34,17 @@ void pf_clock_init(void)
3434 {
3535 // X1クロック(32MHz)有効イベントをクリア
3636 NRF_CLOCK->EVENTS_HFCLKSTARTED =
37- CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_NotGenerated
37+ CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_NotGenerated
3838 << CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Pos;
3939
4040 // X1クロック(32MHz)を有効にし、高精度クロック64MHzで動作開始
4141 NRF_CLOCK->TASKS_HFCLKSTART =
42- CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Trigger
43- << CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Pos;
42+ CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Trigger << CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Pos;
4443
4544 // 高精度クロック(64MHz)が有効になるまで待つ
4645 while ((CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_NotGenerated
47- << CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Pos)
48- == NRF_CLOCK->EVENTS_HFCLKSTARTED)
46+ << CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Pos)
47+ == NRF_CLOCK->EVENTS_HFCLKSTARTED)
4948 {
5049 // 何もしない
5150 }
--- a/nRFHello/src/pf/pf_display.c
+++ b/nRFHello/src/pf/pf_display.c
@@ -28,26 +28,6 @@
2828 #include "pf_timer.h"
2929 #include "pf_display.h"
3030
31-//! @brief 行→GPIO IDテーブル
32-static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] =
33-{
34- PF_GPIO_ID_ROW1, //!< ROW1
35- PF_GPIO_ID_ROW2, //!< ROW2
36- PF_GPIO_ID_ROW3, //!< ROW3
37- PF_GPIO_ID_ROW4, //!< ROW4
38- PF_GPIO_ID_ROW5, //!< ROW5
39-};
40-
41-//! @brief 列→GPIO IDテーブル
42-static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] =
43-{
44- PF_GPIO_ID_COL1, //!< COL1
45- PF_GPIO_ID_COL2, //!< COL2
46- PF_GPIO_ID_COL3, //!< COL3
47- PF_GPIO_ID_COL4, //!< COL4
48- PF_GPIO_ID_COL5, //!< COL5
49-};
50-
5131 //! @brief Display情報構造体
5232 typedef struct PF_DISPLAY_INFO_Tag
5333 {
@@ -61,6 +41,26 @@ typedef struct PF_DISPLAY_INFO_Tag
6141 //! @brief Display情報
6242 static PF_DISPLAY_INFO pf_display_info;
6343
44+//! @brief 行→GPIO IDテーブル
45+static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] =
46+{
47+ PF_GPIO_ID_ROW1, //!< ROW1
48+ PF_GPIO_ID_ROW2, //!< ROW2
49+ PF_GPIO_ID_ROW3, //!< ROW3
50+ PF_GPIO_ID_ROW4, //!< ROW4
51+ PF_GPIO_ID_ROW5, //!< ROW5
52+};
53+
54+//! @brief 列→GPIO IDテーブル
55+static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] =
56+{
57+ PF_GPIO_ID_COL1, //!< COL1
58+ PF_GPIO_ID_COL2, //!< COL2
59+ PF_GPIO_ID_COL3, //!< COL3
60+ PF_GPIO_ID_COL4, //!< COL4
61+ PF_GPIO_ID_COL5, //!< COL5
62+};
63+
6464 //! @brief micro:bit標準フォント(pendolino3) from codal-core(BitmapFont.cpp)
6565 static const u1 pf_display_pendolino3[96][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MAX] =
6666 {
@@ -1231,7 +1231,7 @@ void pf_display_init(void)
12311231
12321232 //! @brief Display表示(文字)
12331233 //! @param [in] ch ASCII文字(0x20~0x7F)
1234-void pf_display_chr(char ch)
1234+void pf_display_ch(char ch)
12351235 {
12361236 const u1 *font;
12371237 u4 offset;
@@ -1363,8 +1363,7 @@ void pf_display_brightness(u4 brightness)
13631363 cc[1] = MICROSEC_TO_TIMERCC(1000);
13641364
13651365 // パラメータチェック
1366- if ((brightness >= PF_DISPLAY_BRIGHTNESS_MIN)
1367- && (brightness <= PF_DISPLAY_BRIGHTNESS_MAX))
1366+ if ((brightness >= PF_DISPLAY_BRIGHTNESS_MIN) && (brightness <= PF_DISPLAY_BRIGHTNESS_MAX))
13681367 {
13691368 // 強制フラグチェック
13701369 if (FALSE == pf_display_info.force)
--- a/nRFHello/src/pf/pf_gpio.c
+++ b/nRFHello/src/pf/pf_gpio.c
@@ -51,18 +51,18 @@ typedef enum PF_GPIO_PULL_Tag
5151 //! @brief 駆動特性
5252 typedef enum PF_GPIO_DRIVE_Tag
5353 {
54- PF_GPIO_DRIVE_S0S1 = 0x0000, //!< '0':標準/'1':標準
55- PF_GPIO_DRIVE_H0S1 = 0x0100, //!< '0':高駆動/'1':標準
56- PF_GPIO_DRIVE_S0H1 = 0x0200, //!< '0':標準/'1':高駆動
57- PF_GPIO_DRIVE_H0H1 = 0x0300, //!< '0':高駆動/'1':高駆動
58- PF_GPIO_DRIVE_D0S1 = 0x0400, //!< '0':未接続/'1':標準
59- PF_GPIO_DRIVE_D0H1 = 0x0500, //!< '0':未接続/'1':高駆動
60- PF_GPIO_DRIVE_S0D1 = 0x0600, //!< '0':標準/'1':未接続
61- PF_GPIO_DRIVE_H0D1 = 0x0700, //!< '0':高駆動/'1':未接続
54+ PF_GPIO_DRIVE_S0S1 = 0x0000, //!< '0'=標準/'1'=標準
55+ PF_GPIO_DRIVE_H0S1 = 0x0100, //!< '0'=高駆動/'1'=標準
56+ PF_GPIO_DRIVE_S0H1 = 0x0200, //!< '0'=標準/'1'=高駆動
57+ PF_GPIO_DRIVE_H0H1 = 0x0300, //!< '0'=高駆動/'1'=高駆動
58+ PF_GPIO_DRIVE_D0S1 = 0x0400, //!< '0'=未接続/'1'=標準
59+ PF_GPIO_DRIVE_D0H1 = 0x0500, //!< '0'=未接続/'1'=高駆動
60+ PF_GPIO_DRIVE_S0D1 = 0x0600, //!< '0'=標準/'1'=未接続
61+ PF_GPIO_DRIVE_H0D1 = 0x0700, //!< '0'=高駆動/'1'=未接続
6262 } PF_GPIO_DRIVE;
6363
64-//! @brief GPIOピン設定情報構造体
65-typedef struct PF_GPIO_INFO_Tag
64+//! @brief GPIOピン初期化情報構造体
65+typedef struct PF_GPIO_INIT_Tag
6666 {
6767 u4 port; //!< ポート(0~1)
6868 u4 pin; //!< ピン(0~31)
@@ -71,11 +71,11 @@ typedef struct PF_GPIO_INFO_Tag
7171 PF_GPIO_INBUF inbuf; //!< 入力バッファ
7272 PF_GPIO_PULL pull; //!< プルアップ・プルダウン
7373 PF_GPIO_DRIVE drive; //!< 駆動特性
74-} PF_GPIO_INFO;
74+} PF_GPIO_INIT;
7575
76-//! @brief GPIOピン設定情報テーブル
77-//! @todo 未使用ピンをすべてプルアップ有効の入力にするよう設定すること
78-const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] =
76+//! @brief GPIOピン初期化情報テーブル
77+//! @todo 未使用ピンがすべてプルアップ有効の入力にするよう設定すること
78+const PF_GPIO_INIT pf_gpio_init_table[PF_GPIO_ID_MAX] =
7979 {
8080 // PF_GPIO_ID_UART_TXD
8181 {
@@ -232,6 +232,50 @@ const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] =
232232 PF_GPIO_DRIVE_S0S1, // 駆動特性
233233 },
234234
235+ // PF_GPIO_ID_INTERNAL_SCL
236+ {
237+ 0, // ポート
238+ 8, // ピン
239+ FALSE, // 初期出力レベル
240+ PF_GPIO_DIR_INPUT, // 入出力方向
241+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
242+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
243+ PF_GPIO_DRIVE_S0D1, // 駆動特性
244+ },
245+
246+ // PF_GPIO_ID_INTERNAL_SDA
247+ {
248+ 0, // ポート
249+ 16, // ピン
250+ FALSE, // 初期出力レベル
251+ PF_GPIO_DIR_INPUT, // 入出力方向
252+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
253+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
254+ PF_GPIO_DRIVE_S0D1, // 駆動特性
255+ },
256+
257+ // PF_GPIO_ID_EXTERNAL_SCL
258+ {
259+ 0, // ポート
260+ 26, // ピン
261+ FALSE, // 初期出力レベル
262+ PF_GPIO_DIR_INPUT, // 入出力方向
263+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
264+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
265+ PF_GPIO_DRIVE_S0D1, // 駆動特性
266+ },
267+
268+ // PF_GPIO_ID_EXTERNAL_SDA
269+ {
270+ 1, // ポート
271+ 0, // ピン
272+ FALSE, // 初期出力レベル
273+ PF_GPIO_DIR_INPUT, // 入出力方向
274+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
275+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
276+ PF_GPIO_DRIVE_S0D1, // 駆動特性
277+ },
278+
235279 // PF_GPIO_ID_MAQUEEN_LED_L
236280 {
237281 0, // ポート
@@ -253,6 +297,28 @@ const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] =
253297 PF_GPIO_PULL_NONE, // プルアップ・プルダウン
254298 PF_GPIO_DRIVE_S0S1, // 駆動特性
255299 },
300+
301+ // PF_GPIO_ID_MAQUEEN_PATROL_L
302+ {
303+ 0, // ポート
304+ 17, // ピン
305+ FALSE, // 初期出力レベル
306+ PF_GPIO_DIR_INPUT, // 入出力方向
307+ PF_GPIO_INBUF_CONNECT, // 入力バッファ
308+ PF_GPIO_PULL_UP, // プルアップ・プルダウン
309+ PF_GPIO_DRIVE_S0S1, // 駆動特性
310+ },
311+
312+ // PF_GPIO_ID_MAQUEEN_PATROL_R
313+ {
314+ 0, // ポート
315+ 1, // ピン
316+ FALSE, // 初期出力レベル
317+ PF_GPIO_DIR_INPUT, // 入出力方向
318+ PF_GPIO_INBUF_CONNECT, // 入力バッファ
319+ PF_GPIO_PULL_UP, // プルアップ・プルダウン
320+ PF_GPIO_DRIVE_S0S1, // 駆動特性
321+ },
256322 };
257323
258324 //! @brief GPIOデバイス取得
@@ -266,7 +332,7 @@ static NRF_GPIO_Type* pf_gpio_get_dev(PF_GPIO_ID id)
266332 dev = NULL;
267333
268334 // ポート別振り分け
269- if (0 == pf_gpio_table[id].port)
335+ if (0 == pf_gpio_init_table[id].port)
270336 {
271337 dev = NRF_P0;
272338 }
@@ -288,36 +354,35 @@ static void pf_gpio_init_id(PF_GPIO_ID id)
288354 dev = NULL;
289355
290356 // 出力方向の場合、先に出力値を設定する
291- if (PF_GPIO_DIR_OUTPUT == pf_gpio_table[id].dir)
357+ if (PF_GPIO_DIR_OUTPUT == pf_gpio_init_table[id].dir)
292358 {
293- pf_gpio_output(id, pf_gpio_table[id].level);
359+ pf_gpio_output(id, pf_gpio_init_table[id].level);
294360 }
295361
296362 // IDからデバイスを取得
297363 dev = pf_gpio_get_dev(id);
298364
299365 // コンフィグ設定
300- dev->PIN_CNF[pf_gpio_table[id].pin] = (u4)(
301- pf_gpio_table[id].dir
302- | pf_gpio_table[id].inbuf
303- | pf_gpio_table[id].pull
304- | pf_gpio_table[id].drive);
366+ dev->PIN_CNF[pf_gpio_init_table[id].pin] = (u4)(pf_gpio_init_table[id].dir
367+ | pf_gpio_init_table[id].inbuf
368+ | pf_gpio_init_table[id].pull
369+ | pf_gpio_init_table[id].drive);
305370 }
306371
307372 //! @brief GPIO初期化
308373 //! @remarks プラットフォーム初期化処理から呼び出すこと
309374 void pf_gpio_init(void)
310375 {
311- u4 id;
376+ PF_GPIO_ID id;
312377
313378 // オート変数初期化
314379 id = 0;
315380
316381 // すべてのIDをループ
317- for (id = 0; id < (u4)PF_GPIO_ID_MAX; id++)
382+ for (id = 0; id < PF_GPIO_ID_MAX; id++)
318383 {
319384 // 1つのIDを初期化
320- pf_gpio_init_id((PF_GPIO_ID)id);
385+ pf_gpio_init_id(id);
321386 }
322387 }
323388
@@ -334,7 +399,7 @@ u4 pf_gpio_get_port(PF_GPIO_ID id)
334399 // パラメータチェック
335400 if (id < PF_GPIO_ID_MAX)
336401 {
337- port = pf_gpio_table[id].port;
402+ port = pf_gpio_init_table[id].port;
338403 }
339404
340405 return port;
@@ -353,7 +418,7 @@ u4 pf_gpio_get_pin(PF_GPIO_ID id)
353418 // パラメータチェック
354419 if (id < PF_GPIO_ID_MAX)
355420 {
356- pin = pf_gpio_table[id].pin;
421+ pin = pf_gpio_init_table[id].pin;
357422 }
358423
359424 return pin;
@@ -380,7 +445,7 @@ BOOL pf_gpio_input(PF_GPIO_ID id)
380445 dev = pf_gpio_get_dev(id);
381446
382447 // 当該ピンのみを取り出した情報を取得
383- in = dev->IN & (1 << pf_gpio_table[id].pin);
448+ in = dev->IN & (1 << pf_gpio_init_table[id].pin);
384449
385450 // 0で'L'レベル、1で'H'レベル
386451 if (0 == in)
@@ -418,12 +483,12 @@ void pf_gpio_output(PF_GPIO_ID id, BOOL level)
418483 if (FALSE == level)
419484 {
420485 // 'L'レベル
421- dev->OUTCLR = 1 << pf_gpio_table[id].pin;
486+ dev->OUTCLR = 1 << pf_gpio_init_table[id].pin;
422487 }
423488 else
424489 {
425490 // 'H'レベル
426- dev->OUTSET = 1 << pf_gpio_table[id].pin;
491+ dev->OUTSET = 1 << pf_gpio_init_table[id].pin;
427492 }
428493 }
429494 }
--- /dev/null
+++ b/nRFHello/src/pf/pf_i2c.c
@@ -0,0 +1,673 @@
1+//! @file pf_i2c.c
2+//! @brief プラットフォーム(I2C)実装ファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#include "pf_types.h"
26+#include "nrf52833.h"
27+#include "nrf52833_bitfields.h"
28+#include "pf_gpio.h"
29+#include "pf_interrupt.h"
30+#include "pf_i2c.h"
31+
32+//! @brief I2Cチャネルの最大数
33+#define PF_I2C_CHANNEL_MAX (2)
34+
35+//! @brief I2Cアドレス情報構造体
36+typedef struct PF_I2C_ADDR_Tag
37+{
38+ u4 addr; //!< I2Cアドレス
39+ u4 channel; //!< I2Cチャネル(0=内部/1=外部)
40+} PF_I2C_ADDR;
41+
42+//! @brief I2Cアドレス情報テーブル
43+static const PF_I2C_ADDR pf_i2c_addr_table[PF_I2C_ID_MAX] =
44+{
45+ // PF_I2C_ID_ACCELEROMETER
46+ {
47+ 0x19,
48+ 0,
49+ },
50+
51+ // PF_I2C_ID_MAGNETOMETER
52+ {
53+ 0x1E,
54+ 0,
55+ },
56+
57+ // PF_I2C_ID_MAQUEEN_MOTOR
58+ {
59+ 0x10,
60+ 1,
61+ },
62+};
63+
64+//! @brief I2C動作情報構造体
65+typedef struct PF_I2C_STATUS_Tag
66+{
67+ PF_I2C_CALLBACK callback; //!< コールバック関数
68+ BOOL busy; //!< BUSYフラグ
69+ BOOL status; //!< 通信ステータス(TRUE=成功/FALSE=失敗)
70+ u4 overrun; //!< オーバーラン発生回数(受信動作が不正)
71+ u4 anack; //!< アドレスNACK発生回数
72+ u4 dnack; //!< データNACK発生回数
73+ u1 reg; //!< 受信レジスタ
74+} PF_I2C_STATUS;
75+
76+//! @brief I2C動作情報テーブル
77+static PF_I2C_STATUS pf_i2c_status[PF_I2C_ID_MAX];
78+
79+//! @brief I2Cチャネル→デバイステーブル
80+static NRF_TWIM_Type* const pf_i2c_channel_to_dev[PF_I2C_CHANNEL_MAX] =
81+{
82+ NRF_TWIM0, //!< チャネル0(内部)
83+ NRF_TWIM1, //!< チャネル1(外部)
84+};
85+
86+//! @brief I2Cチャネル→割り込み優先度テーブル
87+static const PF_INTERRUPT_PRI pf_i2c_channel_to_pri[PF_I2C_CHANNEL_MAX] =
88+{
89+ PF_INTERRUPT_PRI_I2C_INT, //!< チャネル0(内部)
90+ PF_INTERRUPT_PRI_I2C_EXT, //!< チャネル1(外部)
91+};
92+
93+//! @brief I2Cチャネル→割り込み番号テーブル
94+static const IRQn_Type pf_i2c_channel_to_irq[PF_I2C_CHANNEL_MAX] =
95+{
96+ SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, //!< チャネル0(内部)
97+ SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn, //!< チャネル1(外部)
98+};
99+
100+//! @brief I2C割り込み禁止
101+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
102+//! @return 直前のI2C割り込み禁止状態(1:割り込み禁止/0:割り込み許可)
103+static u4 pf_i2c_interrupt_disable(u4 channel)
104+{
105+ u4 enable;
106+ PF_INTERRUPT_PRI pri;
107+
108+ // オート変数初期化
109+ enable = 0;
110+ pri = pf_i2c_channel_to_pri[channel];
111+
112+ // ローカル割り込み禁止
113+ enable = pf_interrupt_local_disable(pri);
114+
115+ return enable;
116+}
117+
118+//! @brief I2C割り込み復元
119+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
120+//! @param [in] enable pf_i2c_interrupt_disable(channel)の返り値
121+static void pf_i2c_interrupt_restore(u4 channel, u4 enable)
122+{
123+ PF_INTERRUPT_PRI pri;
124+
125+ // オート変数初期化
126+ pri = pf_i2c_channel_to_pri[channel];
127+
128+ // ローカル割り込み復元
129+ pf_interrupt_local_restore(pri, enable);
130+}
131+
132+//! @brief I2CデバイスBUSYチェック
133+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
134+//! @return デバイスBUSY状態(TRUE=デバイスBUSY/FALSE=デバイスREADY)
135+//! @attention I2C割り込み禁止状態で呼び出すこと
136+static BOOL pf_i2c_get_busy(u4 channel)
137+{
138+ BOOL busy;
139+ PF_I2C_ID id;
140+
141+ // オート変数初期化
142+ busy = FALSE;
143+ id = 0;
144+
145+ // すべてのIDをループ
146+ for (id = 0; id < PF_I2C_ID_MAX; id++)
147+ {
148+ // 当該チャネルに該当するか
149+ if (channel == pf_i2c_addr_table[id].channel)
150+ {
151+ // BUSYであれば
152+ if (TRUE == pf_i2c_status[id].busy)
153+ {
154+ // そのチャネルはBUSY
155+ busy = TRUE;
156+ break;
157+ }
158+ }
159+ }
160+
161+ return busy;
162+}
163+
164+//! @brief 動作中のIDを取得
165+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
166+//! @return I2C通信先のID
167+//! @attention I2C割り込み禁止状態で呼び出すこと
168+static PF_I2C_ID pf_i2c_get_id(u4 channel)
169+{
170+ PF_I2C_ID id;
171+
172+ // オート変数初期化
173+ id = 0;
174+
175+ // すべてのIDをループ
176+ for (id = 0; id < PF_I2C_ID_MAX; id++)
177+ {
178+ // 当該チャネルに該当するか
179+ if (channel == pf_i2c_addr_table[id].channel)
180+ {
181+ // BUSYであれば
182+ if (TRUE == pf_i2c_status[id].busy)
183+ {
184+ // このIDが該当する
185+ break;
186+ }
187+ }
188+ }
189+
190+ return id;
191+}
192+
193+//! @brief I2C初期化(単一のID)
194+//! @param [in] id I2C通信先のID
195+static void pf_i2c_init_id(PF_I2C_ID id)
196+{
197+ // コールバック関数なし
198+ pf_i2c_status[id].callback = NULL;
199+
200+ // デバイスREADY
201+ pf_i2c_status[id].busy = FALSE;
202+
203+ // エラーなし
204+ pf_i2c_status[id].overrun = 0;
205+ pf_i2c_status[id].anack = 0;
206+ pf_i2c_status[id].dnack = 0;
207+
208+ // 受信レジスタ0
209+ pf_i2c_status[id].reg = 0;
210+}
211+
212+//! @brief I2C初期化(デバイス)
213+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
214+static void pf_i2c_init_dev(u4 channel)
215+{
216+ NRF_TWIM_Type *dev;
217+ PF_INTERRUPT_PRI pri;
218+ IRQn_Type irq;
219+ u4 scl_port;
220+ u4 scl_pin;
221+ u4 sda_port;
222+ u4 sda_pin;
223+
224+ // オート変数初期化
225+ dev = pf_i2c_channel_to_dev[channel];
226+ pri = pf_i2c_channel_to_pri[channel];
227+ irq = pf_i2c_channel_to_irq[channel];
228+ scl_port = 0;
229+ scl_pin = 0;
230+ sda_port = 0;
231+ sda_pin = 0;
232+
233+ // I2C無効化
234+ dev->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos;
235+
236+ // 割り込み有効化(転送完了およびエラー)
237+ dev->INTEN = (TWIM_INTEN_STOPPED_Enabled << TWIM_INTEN_STOPPED_Pos)
238+ | (TWIM_INTEN_ERROR_Enabled << TWIM_INTEN_ERROR_Pos);
239+
240+ // 割り込み設定
241+ NVIC_SetPriority(irq, pri);
242+ NVIC_ClearPendingIRQ(irq);
243+ NVIC_EnableIRQ(irq);
244+
245+ // 転送速度(400kbps)
246+ dev->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400 << TWIM_FREQUENCY_FREQUENCY_Pos;
247+
248+ // pf_gpioよりポート番号およびピン番号を取得
249+ if (0 == channel)
250+ {
251+ // SCL(チャネル0)
252+ scl_port = pf_gpio_get_port(PF_GPIO_ID_INTERNAL_SCL);
253+ scl_pin = pf_gpio_get_pin(PF_GPIO_ID_INTERNAL_SCL);
254+
255+ // SDA(チャネル0)
256+ sda_port = pf_gpio_get_port(PF_GPIO_ID_INTERNAL_SDA);
257+ sda_pin = pf_gpio_get_pin(PF_GPIO_ID_INTERNAL_SDA);
258+ }
259+ else
260+ {
261+ // SCL(チャネル1)
262+ scl_port = pf_gpio_get_port(PF_GPIO_ID_EXTERNAL_SCL);
263+ scl_pin = pf_gpio_get_pin(PF_GPIO_ID_EXTERNAL_SCL);
264+
265+ // SDA(チャネル1)
266+ sda_port = pf_gpio_get_port(PF_GPIO_ID_EXTERNAL_SDA);
267+ sda_pin = pf_gpio_get_pin(PF_GPIO_ID_EXTERNAL_SDA);
268+ }
269+
270+ // SCLピン設定(pf_gpioで管理しているポート番号・ピン番号に接続する)
271+ dev->PSEL.SCL = (scl_pin << TWIM_PSEL_SCL_PIN_Pos) | (scl_port << TWIM_PSEL_SCL_PORT_Pos)
272+ | (TWIM_PSEL_SCL_CONNECT_Connected << TWIM_PSEL_SCL_CONNECT_Pos);
273+
274+ // SDAピン設定
275+ dev->PSEL.SDA = (sda_pin << TWIM_PSEL_SDA_PIN_Pos) | (sda_port << TWIM_PSEL_SDA_PORT_Pos)
276+ | (TWIM_PSEL_SDA_CONNECT_Connected << TWIM_PSEL_SDA_CONNECT_Pos);
277+
278+ // Array Listは使用しない
279+ dev->RXD.LIST = TWIM_RXD_LIST_LIST_Disabled << TWIM_RXD_LIST_LIST_Pos;
280+ dev->TXD.LIST = TWIM_TXD_LIST_LIST_Disabled << TWIM_TXD_LIST_LIST_Pos;
281+
282+ // I2C有効化
283+ dev->ENABLE = TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos;
284+}
285+
286+//! @brief I2C初期化
287+//! @remarks プラットフォーム初期化処理から呼び出すこと
288+void pf_i2c_init(void)
289+{
290+ PF_I2C_ID id;
291+
292+ // オート変数初期化
293+ id = 0;
294+
295+ // すべてのIDをループ
296+ for (id = 0; id < PF_I2C_ID_MAX; id++)
297+ {
298+ // 1つのIDを初期化
299+ pf_i2c_init_id(id);
300+ }
301+
302+ // デバイス初期化(内部)
303+ pf_i2c_init_dev(0);
304+
305+ // デバイス初期化(外部)
306+ pf_i2c_init_dev(1);
307+}
308+
309+//! @brief I2C送信(デバイス)
310+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
311+//! @param [in] addr I2Cアドレス
312+//! @param [in] buf 送信バッファへのポインタ
313+//! @param [in] bytes 送信バイト数
314+//! @attention デバイスREADYの場合に限り呼び出すこと
315+static void pf_i2c_send_dev(u4 channel, u4 addr, const u1 *buf, u4 bytes)
316+{
317+ NRF_TWIM_Type *dev;
318+
319+ // オート変数初期化
320+ dev = pf_i2c_channel_to_dev[channel];
321+
322+ // イベントのショートカット
323+ dev->SHORTS = TWIM_SHORTS_LASTTX_STOP_Enabled << TWIM_SHORTS_LASTTX_STOP_Pos;
324+
325+ // 通信先I2Cアドレス
326+ dev->ADDRESS = addr;
327+
328+ // 送信バッファ
329+ dev->TXD.PTR = (u4)buf;
330+
331+ // 送信バイト数
332+ dev->TXD.MAXCNT = bytes;
333+
334+ // 送信開始
335+ dev->TASKS_STARTTX = TWIM_TASKS_STARTTX_TASKS_STARTTX_Trigger
336+ << TWIM_TASKS_STARTTX_TASKS_STARTTX_Pos;
337+}
338+
339+//! @brief I2C送信
340+//! @param [in] id I2C通信先のID
341+//! @param [in] buf 送信バッファへのポインタ
342+//! @param [in] bytes 送信バイト数
343+//! @return 送信ステータス(TRUE=送信開始/FALSE=デバイスBUSY)
344+//! @attention 呼び出し側で送信バッファのライフタイムを保証すること
345+BOOL pf_i2c_send(PF_I2C_ID id, const u1 *buf, u4 bytes)
346+{
347+ u4 channel;
348+ u4 enable;
349+ BOOL busy;
350+ BOOL result;
351+
352+ // オート変数初期化
353+ channel = 0;
354+ enable = 0;
355+ busy = FALSE;
356+ result = FALSE;
357+
358+ // パラメータチェック
359+ if ((id < PF_I2C_ID_MAX) && (NULL != buf) && (bytes > 0))
360+ {
361+ // チャネル取得
362+ channel = pf_i2c_addr_table[id].channel;
363+
364+ // I2C割り込み禁止
365+ enable = pf_i2c_interrupt_disable(channel);
366+
367+ // デバイスBUSYチェック
368+ busy = pf_i2c_get_busy(channel);
369+
370+ // READYであれば送信開始
371+ if (FALSE == busy)
372+ {
373+ // 通信成功に初期化
374+ pf_i2c_status[id].status = TRUE;
375+
376+ // 送信開始
377+ pf_i2c_send_dev(channel, pf_i2c_addr_table[id].addr, buf, bytes);
378+
379+ // BUSYへ変更
380+ pf_i2c_status[id].busy = TRUE;
381+
382+ // 送信開始に成功した
383+ result = TRUE;
384+ }
385+
386+ // I2C割り込み復元
387+ pf_i2c_interrupt_restore(channel, enable);
388+ }
389+
390+ return result;
391+}
392+
393+//! @brief I2C受信(デバイス)
394+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
395+//! @param [in] addr I2Cアドレス
396+//! @param [in] reg 受信レジスタへのポインタ
397+//! @param [in] buf 受信バッファへのポインタ
398+//! @param [in] bytes 受信バイト数
399+//! @attention デバイスREADYの場合に限り呼び出すこと
400+static void pf_i2c_recv_dev(u4 channel, u4 addr, const u1 *reg, u1 *buf, u4 bytes)
401+{
402+ NRF_TWIM_Type *dev;
403+
404+ // オート変数初期化
405+ dev = pf_i2c_channel_to_dev[channel];
406+
407+ // イベントのショートカット
408+ dev->SHORTS = (TWIM_SHORTS_LASTTX_STARTRX_Enabled << TWIM_SHORTS_LASTTX_STARTRX_Pos)
409+ | (TWIM_SHORTS_LASTRX_STOP_Enabled << TWIM_SHORTS_LASTRX_STOP_Pos);
410+
411+ // 通信先I2Cアドレス
412+ dev->ADDRESS = addr;
413+
414+ // 送信バッファ(受信レジスタ)
415+ dev->TXD.PTR = (u4)reg;
416+
417+ // 送信バイト数
418+ dev->TXD.MAXCNT = 1;
419+
420+ // 受信バッファ
421+ dev->RXD.PTR = (u4)buf;
422+
423+ // 送信バイト数
424+ dev->RXD.MAXCNT = bytes;
425+
426+ // レジスタ送信開始(レジスタ送信完了後、受信動作に移行する)
427+ dev->TASKS_STARTTX = TWIM_TASKS_STARTTX_TASKS_STARTTX_Trigger
428+ << TWIM_TASKS_STARTTX_TASKS_STARTTX_Pos;
429+}
430+
431+//! @brief I2C受信
432+//! @param [in] id I2C通信先のID
433+//! @param [in] reg 受信レジスタ
434+//! @param [in] buf 受信バッファへのポインタ
435+//! @param [in] bytes 受信バイト数
436+//! @return 受信ステータス(TRUE=受信開始/FALSE=デバイスBUSY)
437+BOOL pf_i2c_recv(PF_I2C_ID id, u1 reg, u1 *buf, u4 bytes)
438+{
439+ u4 channel;
440+ u4 enable;
441+ BOOL busy;
442+ BOOL result;
443+
444+ // オート変数初期化
445+ channel = 0;
446+ enable = 0;
447+ busy = FALSE;
448+ result = FALSE;
449+
450+ // パラメータチェック
451+ if ((id < PF_I2C_ID_MAX) && (NULL != buf) && (bytes > 0))
452+ {
453+ // チャネル取得
454+ channel = pf_i2c_addr_table[id].channel;
455+
456+ // I2C割り込み禁止
457+ enable = pf_i2c_interrupt_disable(channel);
458+
459+ // デバイスBUSYチェック
460+ busy = pf_i2c_get_busy(channel);
461+
462+ // READYであれば送受信開始
463+ if (FALSE == busy)
464+ {
465+ // 受信レジスタを記憶
466+ pf_i2c_status[id].reg = reg;
467+
468+ // 通信成功に初期化
469+ pf_i2c_status[id].status = TRUE;
470+
471+ // 送受信開始
472+ pf_i2c_recv_dev(channel, pf_i2c_addr_table[id].addr, &pf_i2c_status[id].reg, buf,
473+ bytes);
474+
475+ // BUSYへ変更
476+ pf_i2c_status[id].busy = TRUE;
477+
478+ // 送受信開始に成功した
479+ result = TRUE;
480+ }
481+
482+ // I2C割り込み復元
483+ pf_i2c_interrupt_restore(channel, enable);
484+ }
485+
486+ return result;
487+}
488+
489+//! @brief I2Cエラー情報取得
490+//! @param [in] id I2C通信先のID
491+//! @param [out] error エラー情報構造体へのポインタ
492+//! @remarks プラットフォーム内部のエラー情報はクリアされる
493+void pf_i2c_error(PF_I2C_ID id, PF_I2C_ERROR *error)
494+{
495+ u4 channel;
496+ channel = 0;
497+ u4 enable;
498+
499+ // オート変数初期化
500+ channel = 0;
501+ enable = 0;
502+
503+ // パラメータチェック
504+ if ((id < PF_I2C_ID_MAX) && (NULL != error))
505+ {
506+ // チャネル取得
507+ channel = pf_i2c_addr_table[id].channel;
508+
509+ // I2C割り込み禁止
510+ enable = pf_i2c_interrupt_disable(channel);
511+
512+ // エラー情報を転送
513+ error->overrun = pf_i2c_status[id].overrun;
514+ error->anack = pf_i2c_status[id].anack;
515+ error->dnack = pf_i2c_status[id].dnack;
516+
517+ // プラットフォーム内部のエラー情報をクリア
518+ pf_i2c_status[id].overrun = 0;
519+ pf_i2c_status[id].anack = 0;
520+ pf_i2c_status[id].dnack = 0;
521+
522+ // I2C割り込み復元
523+ pf_i2c_interrupt_restore(channel, enable);
524+ }
525+}
526+
527+//! @brief I2Cコールバック関数設定
528+//! @param [in] id I2C通信先のID
529+//! @param [in] func I2Cコールバック関数へのポインタ
530+//! @attention I2Cコールバック関数は割り込みコンテキストで呼び出される
531+void pf_i2c_callback(PF_I2C_ID id, PF_I2C_CALLBACK func)
532+{
533+ u4 channel;
534+ u4 enable;
535+
536+ // オート変数初期化
537+ channel = 0;
538+ enable = 0;
539+
540+ // IDチェック
541+ if (id < PF_I2C_ID_MAX)
542+ {
543+ // チャネル取得
544+ channel = pf_i2c_addr_table[id].channel;
545+
546+ // I2C割り込み禁止
547+ enable = pf_i2c_interrupt_disable(channel);
548+
549+ // コールバック関数設定
550+ pf_i2c_status[id].callback = func;
551+
552+ // I2C割り込み復元
553+ pf_i2c_interrupt_restore(channel, enable);
554+ }
555+}
556+
557+//! @brief I2C割り込みハンドラ(STOPPED)
558+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
559+//! @attention データ競合(割り込み干渉)に注意する
560+static void pf_i2c_isr_stopped(u4 channel)
561+{
562+ PF_I2C_ID id;
563+
564+ // オート変数初期化
565+ id = PF_I2C_ID_ACCELEROMETER;
566+
567+ // チャネルから通信先IDを逆引きする
568+ id = pf_i2c_get_id(channel);
569+
570+ // 通信終了
571+ pf_i2c_status[id].busy = FALSE;
572+
573+ // I2Cコールバック関数が登録されていれば、呼び出す
574+ if (NULL != pf_i2c_status[id].callback)
575+ {
576+ pf_i2c_status[id].callback(pf_i2c_status[id].status);
577+ }
578+}
579+
580+//! @brief I2C割り込みハンドラ(ERROR)
581+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
582+//! @attention データ競合(割り込み干渉)に注意する
583+static void pf_i2c_isr_error(u4 channel)
584+{
585+ PF_I2C_ID id;
586+ NRF_TWIM_Type *dev;
587+ u4 overrun;
588+ u4 anack;
589+ u4 dnack;
590+
591+ // オート変数初期化
592+ id = PF_I2C_ID_ACCELEROMETER;
593+ dev = pf_i2c_channel_to_dev[channel];
594+ overrun = TWIM_ERRORSRC_OVERRUN_Received << TWIM_ERRORSRC_OVERRUN_Pos;
595+ anack = TWIM_ERRORSRC_ANACK_Received << TWIM_ERRORSRC_ANACK_Pos;
596+ dnack = TWIM_ERRORSRC_DNACK_Received << TWIM_ERRORSRC_DNACK_Pos;
597+
598+ // チャネルから通信先IDを逆引きする
599+ id = pf_i2c_get_id(channel);
600+
601+ // 通信エラーあり
602+ pf_i2c_status[id].status = FALSE;
603+
604+ // エラー種別判定(ANACK)
605+ if (anack == (dev->ERRORSRC & anack))
606+ {
607+ // ANACK発生。'1'を書き込むことでクリアする
608+ pf_i2c_status[id].anack++;
609+ dev->ERRORSRC = anack;
610+ }
611+
612+ // エラー種別判定(DNACK)
613+ if (dnack == (dev->ERRORSRC & dnack))
614+ {
615+ // DNACK発生。'1'を書き込むことでクリアする
616+ pf_i2c_status[id].dnack++;
617+ dev->ERRORSRC = dnack;
618+ }
619+
620+ // エラー種別判定(OVERRUN)
621+ if (overrun == (dev->ERRORSRC & overrun))
622+ {
623+ // オーバーラン発生。'0'を書き込むことでクリアする
624+ pf_i2c_status[id].overrun++;
625+ dev->ERRORSRC = TWIM_ERRORSRC_OVERRUN_NotReceived << TWIM_ERRORSRC_OVERRUN_Pos;
626+ }
627+
628+ // ここでI2C通信を打ち切る(この後、pf_i2c_isr_stoppedが呼ばれる)
629+ dev->TASKS_STOP = TWIM_TASKS_STOP_TASKS_STOP_Trigger << TWIM_TASKS_STOP_TASKS_STOP_Pos;
630+}
631+
632+//! @brief 共通割り込みハンドラ
633+//! @param [in] channel I2Cチャネル(0=内部/1=外部)
634+//! @attention データ競合(割り込み干渉)に注意する
635+static void pf_i2c_isr(u4 channel)
636+{
637+ NRF_TWIM_Type *dev;
638+
639+ // オート変数初期化
640+ dev = pf_i2c_channel_to_dev[channel];
641+
642+ // STOPPED
643+ if ((TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Generated << TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos)
644+ == dev->EVENTS_STOPPED)
645+ {
646+ dev->EVENTS_STOPPED = TWIM_EVENTS_STOPPED_EVENTS_STOPPED_NotGenerated
647+ << TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos;
648+ pf_i2c_isr_stopped(channel);
649+ }
650+
651+ // ERROR
652+ if ((TWIM_EVENTS_ERROR_EVENTS_ERROR_Generated << TWIM_EVENTS_ERROR_EVENTS_ERROR_Pos)
653+ == dev->EVENTS_ERROR)
654+ {
655+ dev->EVENTS_ERROR = TWIM_EVENTS_ERROR_EVENTS_ERROR_NotGenerated
656+ << TWIM_EVENTS_ERROR_EVENTS_ERROR_Pos;
657+ pf_i2c_isr_error(channel);
658+ }
659+}
660+
661+//! @brief I2C割り込みハンドラ(チャネル0=内部I2Cバス)
662+//! @attention データ競合(割り込み干渉)に注意する
663+void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void)
664+{
665+ pf_i2c_isr(0);
666+}
667+
668+//! @brief I2C割り込みハンドラ(チャネル1=外部I2Cバス)
669+//! @attention データ競合(割り込み干渉)に注意する
670+void SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler(void)
671+{
672+ pf_i2c_isr(1);
673+}
--- a/nRFHello/src/pf/pf_interrupt.c
+++ b/nRFHello/src/pf/pf_interrupt.c
@@ -33,6 +33,9 @@ u4 pf_interrupt_global_disable(void)
3333 u4 primask;
3434
3535 // オート変数初期化
36+ primask = 0;
37+
38+ // 現在のPRIMASKビットを取得
3639 primask = (u4)__get_PRIMASK();
3740
3841 // 割り込み禁止
@@ -45,7 +48,7 @@ u4 pf_interrupt_global_disable(void)
4548 //! @param [in] primask pf_interrupt_global_disable()の返り値
4649 void pf_interrupt_global_restore(u4 primask)
4750 {
48- // 直前の割り込み禁止状態が割り込み許可の場合のみ
51+ // 直前の状態が割り込み許可の場合のみ
4952 if (0 == primask)
5053 {
5154 // 割り込み許可
@@ -56,7 +59,7 @@ void pf_interrupt_global_restore(u4 primask)
5659 //! @brief 割り込み番号を取得
5760 //! @param [in] pri 割り込み優先度
5861 //! @return 割り込み番号(priが不正の場合、UARTE1_IRQn)
59-static u4 pf_interrupt_get_irq(PF_INTERRUPT_PRI pri)
62+static IRQn_Type pf_interrupt_get_irq(PF_INTERRUPT_PRI pri)
6063 {
6164 IRQn_Type irq;
6265
@@ -66,11 +69,6 @@ static u4 pf_interrupt_get_irq(PF_INTERRUPT_PRI pri)
6669 // 割り込み優先度から割り込み番号を取得
6770 switch (pri)
6871 {
69- // POWER
70- case PF_INTERRUPT_PRI_POWER:
71- irq = POWER_CLOCK_IRQn;
72- break;
73-
7472 // UART
7573 case PF_INTERRUPT_PRI_UART:
7674 irq = UARTE0_UART0_IRQn;
@@ -81,6 +79,16 @@ static u4 pf_interrupt_get_irq(PF_INTERRUPT_PRI pri)
8179 irq = TIMER0_IRQn;
8280 break;
8381
82+ // I2C(内部)
83+ case PF_INTERRUPT_PRI_I2C_INT:
84+ irq = SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn;
85+ break;
86+
87+ // I2C(外部)
88+ case PF_INTERRUPT_PRI_I2C_EXT:
89+ irq = SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn;
90+ break;
91+
8492 default:
8593 break;
8694 }
--- a/nRFHello/src/pf/pf_led.c
+++ b/nRFHello/src/pf/pf_led.c
@@ -27,10 +27,10 @@
2727 #include "pf_led.h"
2828
2929 //! @brief LED→GPIO IDテーブル
30-static const PF_GPIO_ID pf_led_gpio_table[PF_LED_ID_MAX] =
30+static const PF_GPIO_ID pf_led_to_gpio[PF_LED_ID_MAX] =
3131 {
32- PF_GPIO_ID_MAQUEEN_LED_L, //!< PF_LED_ID_MAQUEEN_L
33- PF_GPIO_ID_MAQUEEN_LED_R, //!< PF_LED_ID_MAQUEEN_R
32+ PF_GPIO_ID_MAQUEEN_LED_L, //!< PF_LED_ID_L
33+ PF_GPIO_ID_MAQUEEN_LED_R, //!< PF_LED_ID_R
3434 };
3535
3636 //! @brief LED情報テーブル
@@ -44,46 +44,54 @@ static BOOL pf_led_info[PF_LED_ID_MAX] =
4444 //! @remarks プラットフォーム初期化処理から呼び出すこと
4545 void pf_led_init(void)
4646 {
47- u4 loop;
47+ PF_LED_ID id;
4848 PF_GPIO_ID gpio;
4949
5050 // オート変数初期化
51- loop = 0;
51+ id = 0;
5252 gpio = PF_GPIO_ID_MAQUEEN_LED_L;
5353
54- for (loop = 0; loop < (u4)PF_LED_ID_MAX; loop++)
54+ // すべてのIDをループ
55+ for (id = 0; id < PF_LED_ID_MAX; id++)
5556 {
5657 // LED消灯(GPIOに対し'H'レベルで点灯、'L'レベルで消灯)
57- gpio = pf_led_gpio_table[loop];
58+ gpio = pf_led_to_gpio[id];
5859 pf_gpio_output(gpio, FALSE);
5960
6061 // LED情報を更新
61- pf_led_info[loop] = FALSE;
62+ pf_led_info[id] = FALSE;
6263 }
6364 }
6465
65-//! @brief LED制御
66-//! @param [in] id LEDのID
67-//! @param [in] ctrl LED制御情報(TRUE=LED点灯/FALSE=LED消灯)
68-void pf_led_ctrl(PF_LED_ID id, BOOL ctrl)
66+//! @brief LED定期タスク
67+//! @remarks プラットフォーム定期タスク(出力系)処理から呼び出すこと
68+void pf_led_task(void)
6969 {
70+ PF_LED_ID id;
7071 PF_GPIO_ID gpio;
7172
7273 // オート変数初期化
74+ id = 0;
7375 gpio = PF_GPIO_ID_MAQUEEN_LED_L;
7476
77+ // すべてのIDをループ
78+ for (id = 0; id < PF_LED_ID_MAX; id++)
79+ {
80+ // GPIOへ反映
81+ gpio = pf_led_to_gpio[id];
82+ pf_gpio_output(gpio, pf_led_info[id]);
83+ }
84+}
85+
86+//! @brief LED制御
87+//! @param [in] id LEDのID
88+//! @param [in] ctrl LED制御情報(TRUE=LED点灯/FALSE=LED消灯)
89+void pf_led_ctrl(PF_LED_ID id, BOOL ctrl)
90+{
7591 // パラメータチェック
7692 if (id < PF_LED_ID_MAX)
7793 {
78- // 一致チェック
79- if (ctrl != pf_led_info[id])
80- {
81- // GPIO出力を更新
82- gpio = pf_led_gpio_table[id];
83- pf_gpio_output(gpio, ctrl);
84-
85- // LED情報を更新
86- pf_led_info[id] = ctrl;
87- }
94+ // LED情報を更新
95+ pf_led_info[id] = ctrl;
8896 }
8997 }
--- /dev/null
+++ b/nRFHello/src/pf/pf_motor.c
@@ -0,0 +1,288 @@
1+//! @file pf_motor.c
2+//! @brief プラットフォーム(モータ)実装ファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#include "pf_types.h"
26+#include "pf_interrupt.h"
27+#include "pf_i2c.h"
28+#include "pf_motor.h"
29+
30+//! @brief モータ速度(デフォルト)
31+#define PF_MOTOR_DEFAULT_SPEED ((u1)100U)
32+
33+//! @brief チャネル(左)
34+#define PF_MOTOR_CHANNEL_LEFT ((u1)0x00U)
35+
36+//! @brief チャネル(左)
37+#define PF_MOTOR_CHANNEL_RIGHT ((u1)0x02U)
38+
39+//! @brief チャネル数
40+#define PF_MOTOR_CHANNEL_MAX ((u4)2U)
41+
42+//! @brief 回転方向(前回転)
43+#define PF_MOTOR_MOVE_FORWARD ((u1)0x00U)
44+
45+//! @brief 回転方向(後回転)
46+#define PF_MOTOR_MOVE_BACKWARD ((u1)0x01U)
47+
48+//! @brief 動作速度(駆動)
49+#define PF_MOTOR_SPEED_DRIVE ((u1)0x01U)
50+
51+//! @brief 動作速度(停止)
52+#define PF_MOTOR_SPEED_STOP ((u1)0x00U)
53+
54+//! @brief I2Cバッファ要素定義
55+typedef enum PF_MOTOR_I2C_Tag
56+{
57+ PF_MOTOR_I2C_CHANNEL = 0, //!< チャネル
58+ PF_MOTOR_I2C_MOVE, //!< 回転方向
59+ PF_MOTOR_I2C_SPEED, //!< 速度
60+ PF_MOTOR_I2C_MAX, //!< (バッファのサイズを表す)
61+} PF_MOTOR_I2C;
62+
63+//! @brief モータ駆動情報構造体
64+typedef struct PF_MOTOR_DIR_INFO_Tag
65+{
66+ u1 channel; //!< チャネル
67+ u1 direction; //!< 駆動方向
68+ u1 speed; //!< 動作速度
69+} PF_MOTOR_DIR_INFO;
70+
71+//! @brief モータ駆動方向→モータ駆動情報テーブル
72+static const PF_MOTOR_DIR_INFO pf_motor_dir_to_info[PF_MOTOR_DIR_MAX][PF_MOTOR_CHANNEL_MAX] =
73+{
74+ // PF_MOTOR_DIR_FORWARD
75+ {
76+ // LEFT
77+ {
78+ PF_MOTOR_CHANNEL_LEFT,
79+ PF_MOTOR_MOVE_FORWARD,
80+ PF_MOTOR_SPEED_DRIVE,
81+ },
82+
83+ // RIGHT
84+ {
85+ PF_MOTOR_CHANNEL_RIGHT,
86+ PF_MOTOR_MOVE_FORWARD,
87+ PF_MOTOR_SPEED_DRIVE,
88+ },
89+ },
90+
91+ // PF_MOTOR_DIR_LEFT
92+ {
93+ // LEFT
94+ {
95+ PF_MOTOR_CHANNEL_LEFT,
96+ PF_MOTOR_MOVE_BACKWARD,
97+ PF_MOTOR_SPEED_DRIVE,
98+ },
99+
100+ // RIGHT
101+ {
102+ PF_MOTOR_CHANNEL_RIGHT,
103+ PF_MOTOR_MOVE_FORWARD,
104+ PF_MOTOR_SPEED_DRIVE,
105+ },
106+ },
107+
108+ // PF_MOTOR_DIR_RIGHT
109+ {
110+ // LEFT
111+ {
112+ PF_MOTOR_CHANNEL_LEFT,
113+ PF_MOTOR_MOVE_FORWARD,
114+ PF_MOTOR_SPEED_DRIVE,
115+ },
116+
117+ // RIGHT
118+ {
119+ PF_MOTOR_CHANNEL_RIGHT,
120+ PF_MOTOR_MOVE_BACKWARD,
121+ PF_MOTOR_SPEED_DRIVE,
122+ },
123+ },
124+
125+ // PF_MOTOR_DIR_BACKWORD
126+ {
127+ // LEFT
128+ {
129+ PF_MOTOR_CHANNEL_LEFT,
130+ PF_MOTOR_MOVE_BACKWARD,
131+ PF_MOTOR_SPEED_DRIVE,
132+ },
133+
134+ // RIGHT
135+ {
136+ PF_MOTOR_CHANNEL_RIGHT,
137+ PF_MOTOR_MOVE_BACKWARD,
138+ PF_MOTOR_SPEED_DRIVE,
139+ },
140+ },
141+
142+ // PF_MOTOR_DIR_STOP
143+ {
144+ // LEFT
145+ {
146+ PF_MOTOR_CHANNEL_LEFT,
147+ PF_MOTOR_MOVE_FORWARD,
148+ PF_MOTOR_SPEED_STOP,
149+ },
150+
151+ // RIGHT
152+ {
153+ PF_MOTOR_CHANNEL_RIGHT,
154+ PF_MOTOR_MOVE_FORWARD,
155+ PF_MOTOR_SPEED_STOP,
156+ },
157+ },
158+};
159+
160+//! @brief I2C通信バッファ
161+static u1 pf_motor_buf[PF_MOTOR_CHANNEL_MAX][PF_MOTOR_I2C_MAX];
162+
163+//! @brief 現在のモータ駆動方向
164+static PF_MOTOR_DIR pf_motor_current_dir;
165+
166+//! @brief 次回のモータ駆動方向
167+static PF_MOTOR_DIR pf_motor_next_dir;
168+
169+//! @brief 現在のモータ速度
170+static u1 pf_motor_current_speed;
171+
172+//! @brief 現在の送信中チャネル
173+static u4 pf_motor_current_channel;
174+
175+//! @brief I2Cからのコールバック関数
176+//! @param [in] status 通信ステータス(TRUE=成功/FALSE=失敗)
177+static void pf_motor_callback(BOOL status)
178+{
179+ // 成功の場合
180+ if (TRUE == status)
181+ {
182+ // 送信中チャネルをインクリメント
183+ pf_motor_current_channel++;
184+
185+ // 送信中チャネルが最大値に達しているか
186+ if (pf_motor_current_channel < PF_MOTOR_CHANNEL_MAX)
187+ {
188+ // 次の送信をスタート
189+ (void)pf_i2c_send(PF_I2C_ID_MAQUEEN_MOTOR, &pf_motor_buf[pf_motor_current_channel][0],
190+ PF_MOTOR_I2C_MAX);
191+ }
192+ else
193+ {
194+ // すべてのチャネルを送信完了したので、更新
195+ pf_motor_current_dir = pf_motor_next_dir;
196+ }
197+ }
198+}
199+
200+//! @brief モータ初期化
201+//! @remarks プラットフォーム初期化処理から呼び出すこと
202+void pf_motor_init(void)
203+{
204+ // モータ駆動方向: 停止
205+ pf_motor_current_dir = PF_MOTOR_DIR_STOP;
206+ pf_motor_next_dir = PF_MOTOR_DIR_STOP;
207+
208+ // モータ速度: デフォルト
209+ pf_motor_current_speed = PF_MOTOR_DEFAULT_SPEED;
210+
211+ // I2Cコールバック関数を設定
212+ pf_i2c_callback(PF_I2C_ID_MAQUEEN_MOTOR, pf_motor_callback);
213+}
214+
215+//! @brief モータ駆動情報送信
216+static void pf_motor_send(void)
217+{
218+ u4 loop;
219+
220+ // オート変数初期化
221+ loop = 0;
222+
223+ // チャネル数ループ
224+ for (loop = 0; loop < PF_MOTOR_CHANNEL_MAX; loop++)
225+ {
226+ // チャネル
227+ pf_motor_buf[loop][PF_MOTOR_I2C_CHANNEL] =
228+ pf_motor_dir_to_info[pf_motor_next_dir][loop].channel;
229+
230+ // 駆動方向
231+ pf_motor_buf[loop][PF_MOTOR_I2C_MOVE] =
232+ pf_motor_dir_to_info[pf_motor_next_dir][loop].direction;
233+
234+ // 動作速度(駆動の場合は現在の速度を設定する)
235+ if (PF_MOTOR_SPEED_STOP == pf_motor_dir_to_info[pf_motor_next_dir][loop].speed)
236+ {
237+ // 停止
238+ pf_motor_buf[loop][PF_MOTOR_I2C_SPEED] = PF_MOTOR_SPEED_STOP;
239+ }
240+ else
241+ {
242+ // 現在の速度で駆動
243+ pf_motor_buf[loop][PF_MOTOR_I2C_SPEED] = pf_motor_current_speed;
244+ }
245+ }
246+
247+ // 送信中チャネルを初期化
248+ pf_motor_current_channel = 0;
249+
250+ // 最初のチャネルの送信をスタート
251+ (void)pf_i2c_send(PF_I2C_ID_MAQUEEN_MOTOR, &pf_motor_buf[0][0], PF_MOTOR_I2C_MAX);
252+}
253+
254+//! @brief モータ定期タスク
255+//! @remarks プラットフォーム定期タスク(出力系)処理から呼び出すこと
256+void pf_motor_task(void)
257+{
258+ u4 enable;
259+ PF_MOTOR_DIR current;
260+
261+ // オート変数初期化
262+ enable = 0;
263+ current = PF_MOTOR_DIR_STOP;
264+
265+ // 現在の駆動方向を取得(グローバル割り込みを禁止して行う)
266+ enable = pf_interrupt_global_disable();
267+ current = pf_motor_current_dir;
268+ pf_interrupt_global_restore(enable);
269+
270+ // 駆動方向を比較
271+ if (current != pf_motor_next_dir)
272+ {
273+ // 一致するまで送信
274+ pf_motor_send();
275+ }
276+}
277+
278+//! @brief モータ駆動
279+//! @details モータ定期タスクで実際のモータ出力が行われる
280+//! @param [in] dir モータ駆動方向
281+void pf_motor_drive(PF_MOTOR_DIR dir)
282+{
283+ // パラメータチェック
284+ if (dir < PF_MOTOR_DIR_MAX)
285+ {
286+ pf_motor_next_dir = dir;
287+ }
288+}
--- /dev/null
+++ b/nRFHello/src/pf/pf_patrol.c
@@ -0,0 +1,120 @@
1+//! @file pf_patrol.c
2+//! @brief プラットフォーム(ラインセンサ)実装ファイル
3+
4+// The MIT License (MIT)
5+// Copyright (c) 2023 @xm6_original
6+//
7+// Permission is hereby granted, free of charge, to any person obtaining a
8+// copy of this software and associated documentation files (the "Software"),
9+// to deal in the Software without restriction, including without limitation
10+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
11+// and/or sell copies of the Software, and to permit persons to whom the
12+// Software is furnished to do so, subject to the following conditions:
13+//
14+// The above copyright notice and this permission notice shall be included in
15+// all copies or substantial portions of the Software.
16+//
17+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23+// DEALINGS IN THE SOFTWARE.
24+
25+#include "pf_types.h"
26+#include "pf_gpio.h"
27+#include "pf_patrol.h"
28+
29+//! @brief ラインセンサ→GPIO IDテーブル
30+static const PF_GPIO_ID pf_patrol_to_gpio[PF_PATROL_ID_MAX] =
31+{
32+ PF_GPIO_ID_MAQUEEN_PATROL_L, //!< PF_PATROL_ID_L
33+ PF_GPIO_ID_MAQUEEN_PATROL_R, //!< PF_PATROL_ID_R
34+};
35+
36+//! @brief ラインセンサ情報
37+static PF_PATROL_COLOR pf_patrol_info[PF_PATROL_ID_MAX];
38+
39+//! @brief ラインセンサ初期化(単一のID)
40+//! @param [in] id ラインセンサのID
41+static void pf_patrol_init_id(PF_PATROL_ID id)
42+{
43+ // 現在データをWHITEに初期化
44+ pf_patrol_info[id] = PF_PATROL_COLOR_WHITE;
45+}
46+
47+//! @brief ラインセンサ初期化
48+//! @remarks プラットフォーム初期化処理から呼び出すこと
49+void pf_patrol_init(void)
50+{
51+ PF_PATROL_ID id;
52+
53+ // オート変数初期化
54+ id = 0;
55+
56+ // すべてのIDをループ
57+ for (id = 0; id < PF_PATROL_ID_MAX; id++)
58+ {
59+ // 1つのIDを初期化
60+ pf_patrol_init_id(id);
61+ }
62+}
63+
64+//! @brief ラインセンサ定期タスク(単一のID)
65+//! @param [in] id ラインセンサのID
66+static void pf_patrol_task_id(PF_PATROL_ID id)
67+{
68+ PF_GPIO_ID gpio;
69+
70+ // オート変数初期化
71+ gpio = pf_patrol_to_gpio[id];
72+
73+ // 現在のフォトリフレクタ情報を取得(GPIOからの入力が'L'で白色)
74+ if (FALSE == pf_gpio_input(gpio))
75+ {
76+ // 白色
77+ pf_patrol_info[id] = PF_PATROL_COLOR_WHITE;
78+ }
79+ else
80+ {
81+ // 黒色
82+ pf_patrol_info[id] = PF_PATROL_COLOR_BLACK;
83+ }
84+}
85+
86+//! @brief ラインセンサ定期タスク
87+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
88+void pf_patrol_task(void)
89+{
90+ PF_PATROL_ID id;
91+
92+ // オート変数初期化
93+ id = 0;
94+
95+ // すべてのIDをループ
96+ for (id = 0; id < PF_PATROL_ID_MAX; id++)
97+ {
98+ // 1つのIDを処理
99+ pf_patrol_task_id(id);
100+ }
101+}
102+
103+//! @brief ラインセンサの白黒状態を取得
104+//! @param [in] id ラインセンサのID
105+//! @return 色状態(PF_PATROL_COLOR_WHITE=白色/PF_PATROL_COLOR_BLACK=黒色)
106+PF_PATROL_COLOR pf_patrol_get(PF_PATROL_ID id)
107+{
108+ PF_PATROL_COLOR result;
109+
110+ // オート変数初期化
111+ result = PF_PATROL_COLOR_WHITE;
112+
113+ // パラメータチェック
114+ if (id < PF_PATROL_ID_MAX)
115+ {
116+ result = pf_patrol_info[id];
117+ }
118+
119+ return result;
120+}
--- a/nRFHello/src/pf/pf_power.c
+++ b/nRFHello/src/pf/pf_power.c
@@ -30,6 +30,9 @@
3030 #include "pf_systick.h"
3131 #include "pf_power.h"
3232
33+//! @brief VDD電圧低下警告有無フラグ
34+static BOOL pf_power_warning = FALSE;
35+
3336 //! @brief インタフェースMCU初期化待ちのためのデモ(アニメーション)
3437 //! @details NRF_POWER->RESETREAS==0の場合に限り呼び出される。所要時間1000msで設計している
3538 static void pf_power_greetings(void)
@@ -50,11 +53,10 @@ static void pf_power_greetings(void)
5053 pf_display_id(PF_DISPLAY_ID_HAPPY);
5154
5255 // 460msループ(輝度を上げる)
53- while ((u4)(freerun - base)
54- <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
56+ while ((u4)(freerun - base) <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
5557 {
5658 // 目標輝度を算出
57- target = (u4) (freerun - base);
59+ target = (u4)(freerun - base);
5860 target /= 5;
5961 target += PF_DISPLAY_BRIGHTNESS_MIN;
6062
@@ -83,11 +85,10 @@ static void pf_power_greetings(void)
8385 base += 80;
8486
8587 // 460msループ(輝度を下げる)
86- while ((u4) (freerun - base)
87- <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
88+ while ((u4)(freerun - base) <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
8889 {
8990 // 目標輝度を算出
90- target = (u4) (freerun - base);
91+ target = (u4)(freerun - base);
9192 target /= 5;
9293 target = PF_DISPLAY_BRIGHTNESS_MAX - target;
9394
@@ -111,22 +112,14 @@ static void pf_power_greetings(void)
111112 //! @attention Display初期化の後で呼び出すこと
112113 void pf_power_init(void)
113114 {
114- // 割り込み設定(1)
115- NVIC_SetPriority(POWER_CLOCK_IRQn, PF_INTERRUPT_PRI_POWER);
116- NVIC_ClearPendingIRQ(POWER_CLOCK_IRQn);
117-
118- // 割り込み有効化(VDD電圧降下警告)
119- NRF_POWER->INTENSET = POWER_INTENSET_POFWARN_Set
120- << POWER_INTENSET_POFWARN_Pos;
115+ // VDD電圧低下警告なし
116+ pf_power_warning = FALSE;
121117
122- // 電源電圧低下警告(VDD、VDDHとも2.8Vで警告)
118+ // VDD電圧低下警告(VDD、VDDHとも2.8Vで警告)
123119 NRF_POWER->POFCON = (POWER_POFCON_POF_Enabled << POWER_POFCON_POF_Pos)
124120 | (POWER_POFCON_THRESHOLD_V28 << POWER_POFCON_THRESHOLD_Pos)
125121 | (POWER_POFCON_THRESHOLDVDDH_V28 << POWER_POFCON_THRESHOLDVDDH_Pos);
126122
127- // 割り込み設定(2)
128- NVIC_EnableIRQ(POWER_CLOCK_IRQn);
129-
130123 // パワーオンリセットの場合、インタフェースMCUの起動待ちのためのデモを行う
131124 if (0 == NRF_POWER->RESETREAS)
132125 {
@@ -134,18 +127,22 @@ void pf_power_init(void)
134127 }
135128 }
136129
137-//! @brief Power割り込みハンドラ
138-//! @attention 割り込み発生以降、Displayの動作が×固定になる
139-void POWER_CLOCK_IRQHandler(void)
130+//! @brief Power定期タスク
131+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
132+void pf_power_task(void)
140133 {
141- // イベントクリア(VDD電圧降下警告)
142- NRF_POWER->EVENTS_POFWARN = POWER_EVENTS_POFWARN_EVENTS_POFWARN_NotGenerated
143- << POWER_EVENTS_POFWARN_EVENTS_POFWARN_Pos;
144-
145- // 割り込み無効化(VDD電圧降下警告)
146- NRF_POWER->INTENCLR = POWER_INTENCLR_POFWARN_Clear
147- << POWER_INTENCLR_POFWARN_Pos;
134+ // VDD電圧低下警告なしの場合
135+ if (FALSE == pf_power_warning)
136+ {
137+ // POFWARN
138+ if (POWER_EVENTS_POFWARN_EVENTS_POFWARN_Generated << POWER_EVENTS_POFWARN_EVENTS_POFWARN_Pos
139+ == NRF_POWER->EVENTS_POFWARN)
140+ {
141+ // VDD電圧低下警告あり
142+ pf_power_warning = TRUE;
148143
149- // ディスプレイ表示
150- pf_display_powerdown();
144+ // ディスプレイ表示
145+ pf_display_powerdown();
146+ }
147+ }
151148 }
--- a/nRFHello/src/pf/pf_systick.c
+++ b/nRFHello/src/pf/pf_systick.c
@@ -28,7 +28,8 @@
2828 #include "pf_systick.h"
2929
3030 //! @brief フリーランカウンタ[ms]
31-static volatile u4 pf_systick_freerun_ms;
31+//! @remarks 通常コンテキストで変化を監視するためvolatile修飾を付与する
32+static volatile u4 pf_systick_freerun_ms;
3233
3334 //! @brief 制御周期カウンタ[ms]
3435 static u4 pf_systick_sync_ms;
@@ -41,7 +42,7 @@ void pf_systick_init(void)
4142 SysTick->CTRL = 0;
4243
4344 // 割り込み優先度を設定
44- NVIC_SetPriority(SysTick_IRQn, (u4)PF_INTERRUPT_PRI_SYSTICK);
45+ NVIC_SetPriority(SysTick_IRQn, PF_INTERRUPT_PRI_SYSTICK);
4546
4647 // フリーランタイマをリセット
4748 pf_systick_freerun_ms = 0;
@@ -58,8 +59,7 @@ void pf_systick_init(void)
5859 // ・SysClockタイマ動作
5960 // ・割り込みモードを指定
6061 // ・クロックソースとしてプロセッサクロックを指定
61- SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk
62- | SysTick_CTRL_CLKSOURCE_Msk;
62+ SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk;
6363
6464 // 制御周期カウンタをクリア
6565 pf_systick_sync_ms = 0;
@@ -76,7 +76,7 @@ void pf_systick_sync(void)
7676 quit = FALSE;
7777 freerun = 0;
7878
79- // ループ
79+ // 時間が経過するまでループ
8080 while (FALSE == quit)
8181 {
8282 // フリーランmsカウンタを取得
@@ -127,9 +127,9 @@ void pf_systick_time(PF_SYSTICK_TIME *timebuf)
127127
128128 // while文が必ず成立するよう条件設定
129129 freerun[1] = freerun[0] + 1;
130- val[0] = val[1] + 1;
130+ val[1] = val[0];
131131
132- // 2回読み出してmsが一致するまで続ける
132+ // 2回読み出して、msが一致かつVALの順序が正しくなるまで続ける
133133 while ((freerun[0] != freerun[1]) || (val[0] > val[1]))
134134 {
135135 // 移動
--- a/nRFHello/src/pf/pf_timer.c
+++ b/nRFHello/src/pf/pf_timer.c
@@ -28,6 +28,12 @@
2828 #include "pf_interrupt.h"
2929 #include "pf_timer.h"
3030
31+//! @brief Timerチャネル数
32+#define PF_TIMER_CHANNEL_MAX ((u4)5U)
33+
34+//! @brief コンペア最大数(チャネル0~チャネル4で共通)
35+#define PF_TIMER_COMPARE_MAX ((u4)4U)
36+
3137 //! @brief Timer動作
3238 typedef enum PF_TIMER_ACTION_Tag
3339 {
@@ -66,96 +72,46 @@ const PF_TIMER_INIT pf_timer_table[PF_TIMER_ID_MAX] =
6672 },
6773 };
6874
69-//! @brief Timer動作情報構造体
70-typedef struct PF_TIMER_OPERATION_Tag
75+//! @brief compares→CLEARビットテーブル
76+static const u4 pf_timer_clear_table[PF_TIMER_COMPARE_MAX + 1] =
7177 {
72- PF_TIMER_CALLBACK callback; //!< コールバック関数
73- u4 cc[4]; //!< コンペア値
74- BOOL running; //!< 動作中フラグ
75-} PF_TIMER_OPERATION;
76-
77-//! @brief Timer動作情報テーブル
78-static PF_TIMER_OPERATION pf_timer_status[PF_TIMER_ID_MAX];
78+ 0,
79+ TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos,
80+ TIMER_SHORTS_COMPARE1_CLEAR_Enabled << TIMER_SHORTS_COMPARE1_CLEAR_Pos,
81+ TIMER_SHORTS_COMPARE2_CLEAR_Enabled << TIMER_SHORTS_COMPARE2_CLEAR_Pos,
82+ TIMER_SHORTS_COMPARE3_CLEAR_Enabled << TIMER_SHORTS_COMPARE3_CLEAR_Pos,
83+};
7984
80-//! @brief SHORTSレジスタへの設定値を得る(COMPARE-CLEAR)
81-//! @param [in] id TimerのID
82-//! @return SHORTSレジスタへの設定値
83-static u4 pf_timer_get_shorts_clear(PF_TIMER_ID id)
85+//! @brief compares→STOPビットテーブル
86+static const u4 pf_timer_stop_table[PF_TIMER_COMPARE_MAX + 1] =
8487 {
85- u4 shorts;
86-
87- // オート変数初期化
88- shorts = 0;
89-
90- // コンペア数(1~4)によって分ける
91- switch (pf_timer_table[id].compares)
92- {
93- case 1:
94- shorts = TIMER_SHORTS_COMPARE0_CLEAR_Enabled
95- << TIMER_SHORTS_COMPARE0_CLEAR_Pos;
96- break;
97-
98- case 2:
99- shorts = TIMER_SHORTS_COMPARE1_CLEAR_Enabled
100- << TIMER_SHORTS_COMPARE1_CLEAR_Pos;
101- break;
102-
103- case 3:
104- shorts = TIMER_SHORTS_COMPARE2_CLEAR_Enabled
105- << TIMER_SHORTS_COMPARE2_CLEAR_Pos;
106- break;
107-
108- case 4:
109- shorts = TIMER_SHORTS_COMPARE3_CLEAR_Enabled
110- << TIMER_SHORTS_COMPARE3_CLEAR_Pos;
111- break;
112-
113- default:
114- break;
115- }
116-
117- return shorts;
118-}
88+ 0,
89+ TIMER_SHORTS_COMPARE0_STOP_Enabled << TIMER_SHORTS_COMPARE0_STOP_Pos,
90+ TIMER_SHORTS_COMPARE1_STOP_Enabled << TIMER_SHORTS_COMPARE1_STOP_Pos,
91+ TIMER_SHORTS_COMPARE2_STOP_Enabled << TIMER_SHORTS_COMPARE2_STOP_Pos,
92+ TIMER_SHORTS_COMPARE3_STOP_Enabled << TIMER_SHORTS_COMPARE3_STOP_Pos,
93+};
11994
120-//! @brief SHORTSレジスタへの設定値を得る(COMPARE-STOP)
121-//! @param [in] id TimerのID
122-//! @return SHORTSレジスタへの設定値
123-static u4 pf_timer_get_shorts_stop(PF_TIMER_ID id)
95+//! @brief Timer→割り込み番号テーブル
96+static const IRQn_Type pf_timer_to_irq[PF_TIMER_CHANNEL_MAX] =
12497 {
125- u4 shorts;
126-
127- // オート変数初期化
128- shorts = 0;
98+ TIMER0_IRQn, //!< Timer0
99+ TIMER1_IRQn, //!< Timer1
100+ TIMER2_IRQn, //!< Timer2
101+ TIMER3_IRQn, //!< Timer3
102+ TIMER4_IRQn, //!< Timer4
103+};
129104
130- // コンペア数(1~4)によって分ける
131- switch (pf_timer_table[id].compares)
132- {
133- case 1:
134- shorts = TIMER_SHORTS_COMPARE0_STOP_Enabled
135- << TIMER_SHORTS_COMPARE0_STOP_Pos;
136- break;
137-
138- case 2:
139- shorts = TIMER_SHORTS_COMPARE1_STOP_Enabled
140- << TIMER_SHORTS_COMPARE1_STOP_Pos;
141- break;
142-
143- case 3:
144- shorts = TIMER_SHORTS_COMPARE2_STOP_Enabled
145- << TIMER_SHORTS_COMPARE2_STOP_Pos;
146- break;
147-
148- case 4:
149- shorts = TIMER_SHORTS_COMPARE3_STOP_Enabled
150- << TIMER_SHORTS_COMPARE3_STOP_Pos;
151- break;
152-
153- default:
154- break;
155- }
105+//! @brief Timer動作情報構造体
106+typedef struct PF_TIMER_STATUS_Tag
107+{
108+ PF_TIMER_CALLBACK callback; //!< コールバック関数
109+ u4 cc[4]; //!< コンペア値
110+ BOOL running; //!< 動作中フラグ
111+} PF_TIMER_STATUS;
156112
157- return shorts;
158-}
113+//! @brief Timer動作情報テーブル
114+static PF_TIMER_STATUS pf_timer_status[PF_TIMER_ID_MAX];
159115
160116 //! @brief INTENSETレジスタへの設定値を得る
161117 //! @param [in] id TimerのID
@@ -194,51 +150,6 @@ static u4 pf_timer_get_intenset(PF_TIMER_ID id)
194150 return intenset;
195151 }
196152
197-//! @brief 割り込み番号を得る
198-//! @param [in] id TimerのID
199-//! @return 割り込み番号
200-static IRQn_Type pf_timer_get_irq(PF_TIMER_ID id)
201-{
202- IRQn_Type irq;
203-
204- // オート変数初期化
205- irq = TIMER0_IRQn;
206-
207- switch (pf_timer_table[id].channel)
208- {
209- // TIMER0
210- case 0:
211- irq = TIMER0_IRQn;
212- break;
213-
214- // TIMER1
215- case 1:
216- irq = TIMER1_IRQn;
217- break;
218-
219- // TIMER2
220- case 2:
221- irq = TIMER2_IRQn;
222- break;
223-
224- // TIMER3
225- case 3:
226- irq = TIMER3_IRQn;
227- break;
228-
229- // TIMER4
230- case 4:
231- irq = TIMER4_IRQn;
232- break;
233-
234- // 設定エラー
235- default:
236- break;
237- }
238-
239- return irq;
240-}
241-
242153 //! @brief Timer初期化(単一のID)
243154 //! @param [in] id TimerのID
244155 static void pf_timer_init_id(PF_TIMER_ID id)
@@ -250,18 +161,18 @@ static void pf_timer_init_id(PF_TIMER_ID id)
250161
251162 // タイマ停止
252163 pf_timer_table[id].dev->TASKS_STOP = TIMER_TASKS_STOP_TASKS_STOP_Trigger
253- << TIMER_TASKS_STOP_TASKS_STOP_Pos;
164+ << TIMER_TASKS_STOP_TASKS_STOP_Pos;
254165
255166 // イベントのショートカット
256167 if (PF_TIMER_ACTION_INTERVAL == pf_timer_table[id].action)
257168 {
258169 // COMPARE[i]に達したらCLEAR
259- pf_timer_table[id].dev->SHORTS = pf_timer_get_shorts_clear(id);
170+ pf_timer_table[id].dev->SHORTS = pf_timer_clear_table[pf_timer_table[id].compares];
260171 }
261172 else
262173 {
263174 // COMPARE[i]に達したらSTOP
264- pf_timer_table[id].dev->SHORTS = pf_timer_get_shorts_stop(id);
175+ pf_timer_table[id].dev->SHORTS = pf_timer_stop_table[pf_timer_table[id].compares];
265176 }
266177
267178 // 割り込み有効
@@ -271,11 +182,10 @@ static void pf_timer_init_id(PF_TIMER_ID id)
271182 pf_timer_table[id].dev->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos;
272183
273184 // BITMODE(32bit幅固定)
274- pf_timer_table[id].dev->BITMODE = TIMER_BITMODE_BITMODE_32Bit
275- << TIMER_BITMODE_BITMODE_Pos;
185+ pf_timer_table[id].dev->BITMODE = TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos;
276186
277187 // PRESCALER(1/16固定)クロックソースはPCLK1MHzとなり1[us]ごとにカウントアップする
278- pf_timer_table[id].dev->PRESCALER = 0x00000004U;
188+ pf_timer_table[id].dev->PRESCALER = 4U;
279189
280190 // CC[0]設定
281191 if (pf_timer_table[id].compares >= 1)
@@ -310,7 +220,7 @@ static void pf_timer_init_id(PF_TIMER_ID id)
310220 pf_timer_status[id].running = FALSE;
311221
312222 // 割り込み設定
313- irq = pf_timer_get_irq(id);
223+ irq = pf_timer_to_irq[id];
314224 NVIC_SetPriority(irq, pf_timer_table[id].priority);
315225 NVIC_ClearPendingIRQ(irq);
316226 NVIC_EnableIRQ(irq);
@@ -320,16 +230,16 @@ static void pf_timer_init_id(PF_TIMER_ID id)
320230 //! @remarks プラットフォーム初期化処理から呼び出すこと
321231 void pf_timer_init(void)
322232 {
323- u4 id;
233+ PF_TIMER_ID id;
324234
325235 // オート変数初期化
326236 id = 0;
327237
328238 // すべてのIDをループ
329- for (id = 0; id < (u4)PF_TIMER_ID_MAX; id++)
239+ for (id = 0; id < PF_TIMER_ID_MAX; id++)
330240 {
331241 // 1つのIDを初期化
332- pf_timer_init_id((PF_TIMER_ID)id);
242+ pf_timer_init_id(id);
333243 }
334244 }
335245
@@ -342,15 +252,13 @@ void pf_timer_start(PF_TIMER_ID id)
342252 {
343253 // 開始に先立って、クリア
344254 pf_timer_table[id].dev->TASKS_CLEAR =
345- TIMER_TASKS_CLEAR_TASKS_CLEAR_Trigger
346- << TIMER_TASKS_CLEAR_TASKS_CLEAR_Pos;
255+ TIMER_TASKS_CLEAR_TASKS_CLEAR_Trigger << TIMER_TASKS_CLEAR_TASKS_CLEAR_Pos;
347256
348257 // 開始
349258 pf_timer_table[id].dev->TASKS_START =
350- TIMER_TASKS_START_TASKS_START_Trigger
351- << TIMER_TASKS_START_TASKS_START_Pos;
259+ TIMER_TASKS_START_TASKS_START_Trigger << TIMER_TASKS_START_TASKS_START_Pos;
352260
353- // 動作中フラグセット
261+ // 動作中フラグセット(割り込み干渉を考慮する必要はない)
354262 pf_timer_status[id].running = TRUE;
355263 }
356264 }
@@ -364,9 +272,9 @@ void pf_timer_stop(PF_TIMER_ID id)
364272 {
365273 // 停止
366274 pf_timer_table[id].dev->TASKS_STOP = TIMER_TASKS_STOP_TASKS_STOP_Trigger
367- << TIMER_TASKS_STOP_TASKS_STOP_Pos;
275+ << TIMER_TASKS_STOP_TASKS_STOP_Pos;
368276
369- // 動作中フラグクリア
277+ // 動作中フラグクリア(割り込み干渉を考慮する必要はない)
370278 pf_timer_status[id].running = FALSE;
371279 }
372280 }
@@ -388,7 +296,7 @@ void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func)
388296 if (id < PF_TIMER_ID_MAX)
389297 {
390298 // IDに対応したIRQを取得
391- irq = pf_timer_get_irq(id);
299+ irq = pf_timer_to_irq[id];
392300
393301 // 割り込み禁止
394302 enable = NVIC_GetEnableIRQ(irq);
@@ -421,7 +329,7 @@ void pf_timer_cc(PF_TIMER_ID id, u4 *cc)
421329 if ((id < PF_TIMER_ID_MAX) && (NULL != cc))
422330 {
423331 // IDに対応したIRQを取得
424- irq = pf_timer_get_irq(id);
332+ irq = pf_timer_to_irq[id];
425333
426334 // 割り込み禁止
427335 enable = NVIC_GetEnableIRQ(irq);
@@ -434,8 +342,7 @@ void pf_timer_cc(PF_TIMER_ID id, u4 *cc)
434342 if (pf_timer_status[id].cc[loop] != cc[loop])
435343 {
436344 pf_timer_status[id].cc[loop] = cc[loop];
437- pf_timer_table[id].dev->CC[loop] =
438- pf_timer_status[id].cc[loop];
345+ pf_timer_table[id].dev->CC[loop] = pf_timer_status[id].cc[loop];
439346 }
440347 }
441348
@@ -452,34 +359,31 @@ void pf_timer_cc(PF_TIMER_ID id, u4 *cc)
452359 static void pf_timer_isr(u4 channel)
453360 {
454361 PF_TIMER_ID id;
455- u4 loop;
456362 u4 compare;
457363 u4 mask;
458364 u4 generated;
459365 u4 clear;
460366
461367 // オート変数初期化
462- id = PF_TIMER_ID_MAX;
463- loop = 0;
368+ id = 0;
464369 compare = 0;
465370 mask = TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Msk;
466371 generated = TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Generated
467- << TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos;
372+ << TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos;
468373 clear = TIMER_EVENTS_COMPARE_EVENTS_COMPARE_NotGenerated
469- << TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos;
374+ << TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos;
470375
471376 // チャネル番号からIDを特定する
472- for (loop = 0; loop < (u4)PF_TIMER_ID_MAX; loop++)
377+ for (id = 0; id < PF_TIMER_ID_MAX; id++)
473378 {
474379 if (channel == pf_timer_table[id].channel)
475380 {
476- id = (PF_TIMER_ID)loop;
477381 break;
478382 }
479383 }
480384
481385 // IDが見つかった場合のみ処理
482- if (id != PF_TIMER_ID_MAX)
386+ if (id < PF_TIMER_ID_MAX)
483387 {
484388 // EVENTS_COMPARE[3]レジスタからコンペア情報を作成
485389 compare <<= 1;
--- a/nRFHello/src/pf/pf_uart.c
+++ b/nRFHello/src/pf/pf_uart.c
@@ -39,36 +39,24 @@
3939 //! @brief 受信除外文字(この文字は受信できない)
4040 #define PF_UART_EMPTY_CODE ((u1)0xFFU)
4141
42-//! @brief UARTエラー情報構造体
43-typedef struct PF_UART_ERROR_Tag
44-{
45- u4 overrun_count; //!< オーバーランエラー発生回数
46- u4 parity_count; //!< パリティエラー発生回数
47- u4 framing_count; //!< フレーミングエラー発生回数
48- u4 brk_count; //!< ブレーク条件発生回数
49-} PF_UART_ERROR;
50-
51-//! @brief UARTエラー情報本体
52-static PF_UART_ERROR pf_uart_error;
53-
5442 //! @brief UARTバッファ管理構造体
5543 typedef struct PF_UART_BUF_Tag
5644 {
57- u4 read_pos; //!< 読み取り位置
58- u4 write_pos; //!< 書き込み位置
59- u4 valid_bytes; //!< 有効バイト数
60- u4 overrun_count; //!< オーバーラン発生回数
61- u4 uart_process_count; //!< UART動作カウント
62- u4 uart_read_bytes; //!< 現在のUARTバッファから読み出したバイト数
63- u1 buf[PF_UART_BUF_BYTES]; //!< リングバッファ
45+ u4 read_pos; //!< 読み取り位置
46+ u4 write_pos; //!< 書き込み位置
47+ u4 valid_bytes; //!< 有効バイト数
48+ u4 overrun_count; //!< オーバーラン発生回数
49+ u4 uart_process_count; //!< UART動作カウント
50+ u4 uart_read_bytes; //!< 現在のUARTバッファから読み出したバイト数
51+ u1 buf[PF_UART_BUF_BYTES]; //!< リングバッファ
6452 } PF_UART_BUF;
6553
6654 //! @brief UARTバッファのID
6755 typedef enum PF_UART_BUF_ID_Tag
6856 {
69- PF_UART_BUF_ID_TXD = 0, //!< 送信バッファ
70- PF_UART_BUF_ID_RXD, //!< 受信バッファ
71- PF_UART_BUF_ID_MAX, //!< (IDの個数を表す)
57+ PF_UART_BUF_ID_TXD = 0, //!< 送信バッファ
58+ PF_UART_BUF_ID_RXD, //!< 受信バッファ
59+ PF_UART_BUF_ID_MAX, //!< (IDの個数を表す)
7260 } PF_UART_BUF_ID;
7361
7462 //! @brief UARTバッファ本体
@@ -77,6 +65,9 @@ static PF_UART_BUF pf_uart_buf[PF_UART_BUF_ID_MAX];
7765 //! @brief DMAバッファ本体
7866 static u1 pf_uart_dma[PF_UART_BUF_BYTES];
7967
68+//! @brief UARTエラー情報本体
69+static PF_UART_ERROR pf_uart_rxderr;
70+
8071 //! @brief UARTバッファ初期化
8172 //! @param [in] id UARTバッファのID
8273 static void pf_uart_init_buf(PF_UART_BUF_ID id)
@@ -104,6 +95,15 @@ static void pf_uart_init_dma(void)
10495 }
10596 }
10697
98+//! @brief UARTエラー情報初期化
99+static void pf_uart_init_error(void)
100+{
101+ pf_uart_rxderr.overrun = 0;
102+ pf_uart_rxderr.parity = 0;
103+ pf_uart_rxderr.framing = 0;
104+ pf_uart_rxderr.brk = 0;
105+}
106+
107107 //! @brief UART送信ポーリング
108108 //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される
109109 static void pf_uart_poll_txd(void)
@@ -121,7 +121,7 @@ static void pf_uart_poll_txd(void)
121121 {
122122 // バッファをまたぐか?
123123 txd_bytes = sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf)
124- - pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos;
124+ - pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos;
125125 if (pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes < txd_bytes)
126126 {
127127 // バッファをまたがない(valid_bytesの方が小さい)
@@ -130,19 +130,18 @@ static void pf_uart_poll_txd(void)
130130
131131 // 送信指示
132132 NRF_UARTE0->TXD.PTR =
133- (u4)&(pf_uart_buf[PF_UART_BUF_ID_TXD].buf[pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos]);
133+ (u4)&(pf_uart_buf[PF_UART_BUF_ID_TXD].buf[pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos]);
134134 NRF_UARTE0->TXD.MAXCNT = txd_bytes;
135135 NRF_UARTE0->TASKS_STARTTX =
136- UARTE_TASKS_STARTTX_TASKS_STARTTX_Trigger
137- << UARTE_TASKS_STARTTX_TASKS_STARTTX_Pos;
136+ UARTE_TASKS_STARTTX_TASKS_STARTTX_Trigger << UARTE_TASKS_STARTTX_TASKS_STARTTX_Pos;
138137
139138 // 1回のUART送信を予約した
140139 pf_uart_buf[PF_UART_BUF_ID_TXD].uart_process_count++;
141140
142141 // read_posを進める
143142 pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos += txd_bytes;
144- pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos &=
145- (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf) - 1);
143+ pf_uart_buf[PF_UART_BUF_ID_TXD].read_pos &= (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf)
144+ - 1);
146145
147146 // valid_bytesを減らす
148147 pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes -= txd_bytes;
@@ -154,21 +153,20 @@ static void pf_uart_poll_txd(void)
154153 //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される
155154 static void pf_uart_poll_rxd(void)
156155 {
157- while (PF_UART_EMPTY_CODE
158- != pf_uart_dma[pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes])
156+ while (PF_UART_EMPTY_CODE != pf_uart_dma[pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes])
159157 {
160158 // 現在の読み取り位置をバッファに挿入する
161159 if (pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes
162- <= sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf))
160+ <= sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf))
163161 {
164162 // データ転送
165163 pf_uart_buf[PF_UART_BUF_ID_RXD].buf[pf_uart_buf[PF_UART_BUF_ID_RXD].write_pos] =
166- pf_uart_dma[pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes];
164+ pf_uart_dma[pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes];
167165
168166 // write_posを進める
169167 pf_uart_buf[PF_UART_BUF_ID_RXD].write_pos++;
170168 pf_uart_buf[PF_UART_BUF_ID_RXD].write_pos &=
171- (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
169+ (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
172170
173171 // valid_bytesをインクリメント
174172 pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes++;
@@ -181,12 +179,12 @@ static void pf_uart_poll_rxd(void)
181179
182180 // このDMAバッファを受信除外文字に復元する
183181 pf_uart_dma[pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes] =
184- PF_UART_EMPTY_CODE;
182+ PF_UART_EMPTY_CODE;
185183
186184 // UARTバッファから読み出したバイト数を進める
187185 pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes++;
188186 pf_uart_buf[PF_UART_BUF_ID_RXD].uart_read_bytes &=
189- (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
187+ (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
190188 }
191189 }
192190
@@ -197,22 +195,22 @@ void pf_uart_init(void)
197195 {
198196 // UART無効化
199197 NRF_UARTE0->ENABLE =
200- UARTE_ENABLE_ENABLE_Disabled << UARTE_ENABLE_ENABLE_Pos;
198+ UARTE_ENABLE_ENABLE_Disabled << UARTE_ENABLE_ENABLE_Pos;
201199
202200 // バッファ初期化
203201 pf_uart_init_buf(PF_UART_BUF_ID_TXD);
204202 pf_uart_init_buf(PF_UART_BUF_ID_RXD);
205203 pf_uart_init_dma();
204+ pf_uart_init_error();
206205
207206 // イベントのショートカット(ENDRXと同時にSTARTRXを行う)
208- NRF_UARTE0->SHORTS = UARTE_SHORTS_ENDRX_STARTRX_Enabled
209- << UARTE_SHORTS_ENDRX_STARTRX_Pos;
207+ NRF_UARTE0->SHORTS = UARTE_SHORTS_ENDRX_STARTRX_Enabled << UARTE_SHORTS_ENDRX_STARTRX_Pos;
210208
211209 // 割り込み有効化
212210 NRF_UARTE0->INTEN = (UARTE_INTEN_ENDRX_Enabled << UARTE_INTEN_ENDRX_Pos)
213- | (UARTE_INTEN_ENDTX_Enabled << UARTE_INTEN_ENDTX_Pos)
214- | (UARTE_INTEN_ERROR_Enabled << UARTE_INTEN_ERROR_Pos)
215- | (UARTE_INTEN_RXSTARTED_Enabled << UARTE_INTEN_RXSTARTED_Pos);
211+ | (UARTE_INTEN_ENDTX_Enabled << UARTE_INTEN_ENDTX_Pos)
212+ | (UARTE_INTEN_ERROR_Enabled << UARTE_INTEN_ERROR_Pos)
213+ | (UARTE_INTEN_RXSTARTED_Enabled << UARTE_INTEN_RXSTARTED_Pos);
216214
217215 // 割り込み設定
218216 NVIC_SetPriority(UARTE0_UART0_IRQn, PF_INTERRUPT_PRI_UART);
@@ -220,40 +218,35 @@ void pf_uart_init(void)
220218 NVIC_EnableIRQ(UARTE0_UART0_IRQn);
221219
222220 // 受信エラーをすべてクリア
223- NRF_UARTE0->ERRORSRC = (UARTE_ERRORSRC_OVERRUN_NotPresent
224- << UARTE_ERRORSRC_OVERRUN_Pos)
225- | (UARTE_ERRORSRC_PARITY_NotPresent << UARTE_ERRORSRC_PARITY_Pos)
226- | (UARTE_ERRORSRC_FRAMING_NotPresent << UARTE_ERRORSRC_FRAMING_Pos)
227- | (UARTE_ERRORSRC_BREAK_NotPresent << UARTE_ERRORSRC_BREAK_Pos);
221+ NRF_UARTE0->ERRORSRC = (UARTE_ERRORSRC_OVERRUN_NotPresent << UARTE_ERRORSRC_OVERRUN_Pos)
222+ | (UARTE_ERRORSRC_PARITY_NotPresent << UARTE_ERRORSRC_PARITY_Pos)
223+ | (UARTE_ERRORSRC_FRAMING_NotPresent << UARTE_ERRORSRC_FRAMING_Pos)
224+ | (UARTE_ERRORSRC_BREAK_NotPresent << UARTE_ERRORSRC_BREAK_Pos);
228225
229226 // RTSピン設定(使用しない)
230- NRF_UARTE0->PSEL.RTS |= (UARTE_PSEL_RTS_CONNECT_Disconnected
231- << UARTE_PSEL_RTS_CONNECT_Pos);
227+ NRF_UARTE0->PSEL.RTS |= (UARTE_PSEL_RTS_CONNECT_Disconnected << UARTE_PSEL_RTS_CONNECT_Pos);
232228
233229 // TXDピン設定(pf_gpioで管理しているポート番号・ピン番号に接続する)
234- NRF_UARTE0->PSEL.TXD = (pf_gpio_get_pin(PF_GPIO_ID_UART_TXD)
235- << UARTE_PSEL_TXD_PIN_Pos)
236- | (pf_gpio_get_port(PF_GPIO_ID_UART_TXD) << UARTE_PSEL_TXD_PORT_Pos)
237- | (UARTE_PSEL_TXD_CONNECT_Connected << UARTE_PSEL_TXD_CONNECT_Pos);
230+ NRF_UARTE0->PSEL.TXD = (pf_gpio_get_pin(PF_GPIO_ID_UART_TXD) << UARTE_PSEL_TXD_PIN_Pos)
231+ | (pf_gpio_get_port(PF_GPIO_ID_UART_TXD) << UARTE_PSEL_TXD_PORT_Pos)
232+ | (UARTE_PSEL_TXD_CONNECT_Connected << UARTE_PSEL_TXD_CONNECT_Pos);
238233
239234 // CTSピン設定(使用しない)
240- NRF_UARTE0->PSEL.CTS |= (UARTE_PSEL_CTS_CONNECT_Disconnected
241- << UARTE_PSEL_CTS_CONNECT_Pos);
235+ NRF_UARTE0->PSEL.CTS |= (UARTE_PSEL_CTS_CONNECT_Disconnected << UARTE_PSEL_CTS_CONNECT_Pos);
242236
243237 // RXDピン設定(pf_gpioで管理しているポート番号・ピン番号に接続する)
244- NRF_UARTE0->PSEL.RXD = (pf_gpio_get_pin(PF_GPIO_ID_UART_RXD)
245- << UARTE_PSEL_RXD_PIN_Pos)
246- | (pf_gpio_get_port(PF_GPIO_ID_UART_RXD) << UARTE_PSEL_RXD_PORT_Pos)
247- | (UARTE_PSEL_RXD_CONNECT_Connected << UARTE_PSEL_RXD_CONNECT_Pos);
238+ NRF_UARTE0->PSEL.RXD = (pf_gpio_get_pin(PF_GPIO_ID_UART_RXD) << UARTE_PSEL_RXD_PIN_Pos)
239+ | (pf_gpio_get_port(PF_GPIO_ID_UART_RXD) << UARTE_PSEL_RXD_PORT_Pos)
240+ | (UARTE_PSEL_RXD_CONNECT_Connected << UARTE_PSEL_RXD_CONNECT_Pos);
248241
249242 // ボーレート115200bps(実際のボーレートは115108bps、誤差-0.08%)
250- NRF_UARTE0->BAUDRATE = UARTE_BAUDRATE_BAUDRATE_Baud115200;
243+ NRF_UARTE0->BAUDRATE = UARTE_BAUDRATE_BAUDRATE_Baud115200 << UARTE_BAUDRATE_BAUDRATE_Pos;
251244
252245 // ハードウェアフロー無し、パリティ無し、ストップビット1bit
253246 NRF_UARTE0->CONFIG = (UARTE_CONFIG_HWFC_Disabled << UARTE_CONFIG_HWFC_Pos)
254- | (UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos)
255- | (UARTE_CONFIG_STOP_One << UARTE_CONFIG_STOP_Pos)
256- | (UARTE_CONFIG_PARITYTYPE_Even << UARTE_CONFIG_PARITYTYPE_Pos);
247+ | (UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos)
248+ | (UARTE_CONFIG_STOP_One << UARTE_CONFIG_STOP_Pos)
249+ | (UARTE_CONFIG_PARITYTYPE_Even << UARTE_CONFIG_PARITYTYPE_Pos);
257250
258251 // UART有効化
259252 NRF_UARTE0->ENABLE = UARTE_ENABLE_ENABLE_Enabled << UARTE_ENABLE_ENABLE_Pos;
@@ -262,14 +255,14 @@ void pf_uart_init(void)
262255 NRF_UARTE0->RXD.PTR = (u4)pf_uart_dma;
263256 NRF_UARTE0->RXD.MAXCNT = sizeof(pf_uart_dma);
264257 NRF_UARTE0->TASKS_STARTRX = UART_TASKS_STARTRX_TASKS_STARTRX_Trigger
265- << UART_TASKS_STARTRX_TASKS_STARTRX_Pos;
258+ << UART_TASKS_STARTRX_TASKS_STARTRX_Pos;
266259
267260 // 1回のUART受信を予約した
268261 pf_uart_buf[PF_UART_BUF_ID_RXD].uart_process_count++;
269262 }
270263
271264 //! @brief UART定期タスク
272-//! @remarks 定期タスク(出力系)処理から呼び出すこと
265+//! @remarks プラットフォーム定期タスク(入力系)処理から呼び出すこと
273266 void pf_uart_task(void)
274267 {
275268 u4 enable;
@@ -309,16 +302,17 @@ void pf_uart_send(const u1 *buf, u4 bytes)
309302 {
310303 // 送信バッファが一杯?
311304 if (pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes
312- < sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf))
305+ < sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf))
313306 {
314307 // 送信バッファへ1バイト挿入
315- pf_uart_buf[PF_UART_BUF_ID_TXD].buf[pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos] = *buf;
308+ pf_uart_buf[PF_UART_BUF_ID_TXD].buf[pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos] =
309+ *buf;
316310 buf++;
317311
318312 // write_posを進める
319313 pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos++;
320314 pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos &=
321- (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf) - 1);
315+ (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf) - 1);
322316
323317 // valid_bytesをインクリメント
324318 pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes++;
@@ -360,8 +354,7 @@ u4 pf_uart_recv(u1 *buf, u4 bytes)
360354 enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_UART);
361355
362356 // 全てのバイト数を処理し終わるまで
363- while ((recv < bytes)
364- && (pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes > 0))
357+ while ((recv < bytes) && (pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes > 0))
365358 {
366359 // 受信バッファへ1バイト転送
367360 *buf = pf_uart_buf[PF_UART_BUF_ID_RXD].buf[pf_uart_buf[PF_UART_BUF_ID_RXD].read_pos];
@@ -369,8 +362,8 @@ u4 pf_uart_recv(u1 *buf, u4 bytes)
369362
370363 // read_posを進める
371364 pf_uart_buf[PF_UART_BUF_ID_RXD].read_pos++;
372- pf_uart_buf[PF_UART_BUF_ID_RXD].read_pos &=
373- (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
365+ pf_uart_buf[PF_UART_BUF_ID_RXD].read_pos &= (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf)
366+ - 1);
374367
375368 // valid_bytesをデクリメント
376369 pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes--;
@@ -386,6 +379,39 @@ u4 pf_uart_recv(u1 *buf, u4 bytes)
386379 return recv;
387380 }
388381
382+//! @brief UARTエラー情報取得
383+//! @param [out] error エラー情報構造体へのポインタ
384+//! @remarks プラットフォーム内部のエラー情報はクリアされる
385+void pf_uart_error(PF_UART_ERROR *error)
386+{
387+ u4 enable;
388+
389+ // オート変数初期化
390+ enable = 0;
391+
392+ // パラメータチェック
393+ if (NULL != error)
394+ {
395+ // UART割り込み禁止
396+ enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_UART);
397+
398+ // エラー情報を転送
399+ error->overrun = pf_uart_rxderr.overrun;
400+ error->parity = pf_uart_rxderr.parity;
401+ error->framing = pf_uart_rxderr.framing;
402+ error->brk = pf_uart_rxderr.brk;
403+
404+ // プラットフォーム内部のエラー情報をクリア
405+ pf_uart_rxderr.overrun = 0;
406+ pf_uart_rxderr.parity = 0;
407+ pf_uart_rxderr.framing = 0;
408+ pf_uart_rxderr.brk = 0;
409+
410+ // UART割り込み復元
411+ pf_interrupt_local_restore(PF_INTERRUPT_PRI_UART, enable);
412+ }
413+}
414+
389415 //! @brief UART1文字出力
390416 //! @param [in] ch 送信する文字(0xFF以外)
391417 void pf_uart_putc(u1 ch)
@@ -455,11 +481,10 @@ void pf_uart_log(const char *format, ...)
455481 pf_systick_time(&timebuf);
456482
457483 // SysTick時刻をフォーマット
458- pf_uart_log_time(buf, "%05d,%03d,%03d,", timebuf.sec, timebuf.ms,
459- timebuf.us);
484+ pf_uart_log_time(buf, "%05d,%03d,%03d,", timebuf.sec, timebuf.ms, timebuf.us);
460485
461486 // 本体のフォーマット
462- bytes = (u4) vsnprintf(&buf[14], sizeof(buf) - 16, format, ap);
487+ bytes = (u4)vsnprintf(&buf[14], sizeof(buf) - 16, format, ap);
463488 bytes += 14;
464489
465490 // 末尾に改行文字があるか?
@@ -484,7 +509,7 @@ void pf_uart_log(const char *format, ...)
484509
485510 //! @brief UART割り込みハンドラ(ENDTX)
486511 //! @attention データ競合(割り込み干渉)に注意する
487-static void pf_uart_intr_endtx(void)
512+static void pf_uart_isr_endtx(void)
488513 {
489514 // 1回のUART送信が完了した
490515 pf_uart_buf[PF_UART_BUF_ID_TXD].uart_process_count--;
@@ -496,13 +521,13 @@ static void pf_uart_intr_endtx(void)
496521 if (0 == pf_uart_buf[PF_UART_BUF_ID_TXD].uart_process_count)
497522 {
498523 NRF_UARTE0->TASKS_STOPTX = UART_TASKS_STOPTX_TASKS_STOPTX_Trigger
499- << UART_TASKS_STOPTX_TASKS_STOPTX_Pos;
524+ << UART_TASKS_STOPTX_TASKS_STOPTX_Pos;
500525 }
501526 }
502527
503528 //! @brief UART割り込みハンドラ(ERROR)
504529 //! @attention データ競合(割り込み干渉)に注意する
505-static void pf_uart_intr_error(void)
530+static void pf_uart_isr_error(void)
506531 {
507532 u4 overrun;
508533 u4 parity;
@@ -519,34 +544,34 @@ static void pf_uart_intr_error(void)
519544 if (overrun == (NRF_UARTE0->ERRORSRC & overrun))
520545 {
521546 NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_OVERRUN_Msk);
522- pf_uart_error.overrun_count++;
547+ pf_uart_rxderr.overrun++;
523548 }
524549
525550 // パリティエラー
526551 if (parity == (NRF_UARTE0->ERRORSRC & parity))
527552 {
528553 NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_PARITY_Msk);
529- pf_uart_error.parity_count++;
554+ pf_uart_rxderr.parity++;
530555 }
531556
532557 // フレーミングエラー
533558 if (framing == (NRF_UARTE0->ERRORSRC & framing))
534559 {
535560 NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_FRAMING_Msk);
536- pf_uart_error.framing_count++;
561+ pf_uart_rxderr.framing++;
537562 }
538563
539564 // ブレーク信号受信
540565 if (brk == (NRF_UARTE0->ERRORSRC & brk))
541566 {
542567 NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_BREAK_Msk);
543- pf_uart_error.brk_count++;
568+ pf_uart_rxderr.brk++;
544569 }
545570 }
546571
547572 //! @brief UART割り込みハンドラ(RXSTARTED)
548573 //! @attention データ競合(割り込み干渉)に注意する
549-static void pf_uart_intr_rxstarted(void)
574+static void pf_uart_isr_rxstarted(void)
550575 {
551576 // 受信バッファを再セットできるか?
552577 if (pf_uart_buf[PF_UART_BUF_ID_RXD].uart_process_count < 2)
@@ -561,10 +586,10 @@ static void pf_uart_intr_rxstarted(void)
561586
562587 //! @brief UART割り込みハンドラ(ENDRX)
563588 //! @attention データ競合(割り込み干渉)に注意する
564-static void pf_uart_intr_endrx(void)
589+static void pf_uart_isr_endrx(void)
565590 {
566591 // 受信バッファの再セット
567- pf_uart_intr_rxstarted();
592+ pf_uart_isr_rxstarted();
568593
569594 // 1回のUART受信が終了した
570595 pf_uart_buf[PF_UART_BUF_ID_RXD].uart_process_count--;
@@ -578,40 +603,39 @@ static void pf_uart_intr_endrx(void)
578603 void UARTE0_UART0_IRQHandler(void)
579604 {
580605 // ENDRX
581- if ((UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Generated
582- << UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos) == NRF_UARTE0->EVENTS_ENDRX)
606+ if ((UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Generated << UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos)
607+ == NRF_UARTE0->EVENTS_ENDRX)
583608 {
584609 NRF_UARTE0->EVENTS_ENDRX = UARTE_EVENTS_ENDRX_EVENTS_ENDRX_NotGenerated
585- << UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos;
586- pf_uart_intr_endrx();
610+ << UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos;
611+ pf_uart_isr_endrx();
587612 }
588613
589614 // ENDTX
590- if ((UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Generated
591- << UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos) == NRF_UARTE0->EVENTS_ENDTX)
615+ if ((UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Generated << UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos)
616+ == NRF_UARTE0->EVENTS_ENDTX)
592617 {
593618 NRF_UARTE0->EVENTS_ENDTX = UARTE_EVENTS_ENDTX_EVENTS_ENDTX_NotGenerated
594- << UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos;
595- pf_uart_intr_endtx();
619+ << UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos;
620+ pf_uart_isr_endtx();
596621 }
597622
598623 // ERROR
599- if ((UARTE_EVENTS_ERROR_EVENTS_ERROR_Generated
600- << UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos) == NRF_UARTE0->EVENTS_ERROR)
624+ if ((UARTE_EVENTS_ERROR_EVENTS_ERROR_Generated << UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos)
625+ == NRF_UARTE0->EVENTS_ERROR)
601626 {
602627 NRF_UARTE0->EVENTS_ERROR = UARTE_EVENTS_ERROR_EVENTS_ERROR_NotGenerated
603- << UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos;
604- pf_uart_intr_error();
628+ << UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos;
629+ pf_uart_isr_error();
605630 }
606631
607632 // RXSTATRED
608633 if ((UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Generated
609- << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos)
610- == NRF_UARTE0->EVENTS_RXSTARTED)
634+ << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos) == NRF_UARTE0->EVENTS_RXSTARTED)
611635 {
612636 NRF_UARTE0->EVENTS_RXSTARTED =
613637 UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_NotGenerated
614- << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos;
615- pf_uart_intr_rxstarted();
638+ << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos;
639+ pf_uart_isr_rxstarted();
616640 }
617641 }