• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

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

Révision8dfcf52eb888ed174904faf84211039437528a17 (tree)
l'heure2023-09-03 13:58:53
Auteurxm6_original <tanaka_yasushi2008@yaho...>
Commiterxm6_original

Message de Log

電源制御・ボタン制御・LED制御

Change Summary

Modification

--- a/nRFHello/.cproject
+++ b/nRFHello/.cproject
@@ -45,6 +45,17 @@
4545 <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.2069855853" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size" value="size" valueType="string"/>
4646 <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.9180516" name="ビルド・コマンド" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" value="make" valueType="string"/>
4747 <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.395227066" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm" value="rm" valueType="string"/>
48+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.uninitialized.1297170663" name="Warn on uninitialized variables (-Wuninitialised)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.uninitialized" value="true" valueType="boolean"/>
49+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.missingdeclaration.1331044978" name="Warn on undeclared global function (-Wmissing-declaration)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.missingdeclaration" value="true" valueType="boolean"/>
50+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.conversion.234902104" name="Warn on implicit conversions (-Wconversion)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.conversion" value="true" valueType="boolean"/>
51+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.pointerarith.641784776" name="Warn if pointer arithmetic (-Wpointer-arith)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.pointerarith" value="true" valueType="boolean"/>
52+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.floatequal.725876922" name="Warn if floats are compared as equal (-Wfloat-equal)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.floatequal" value="true" valueType="boolean"/>
53+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.padded.1689325083" name="Warn if padding is included (-Wpadded)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.padded" value="false" valueType="boolean"/>
54+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.shadow.1003176111" name="Warn if shadowed variable (-Wshadow)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.shadow" value="true" valueType="boolean"/>
55+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.logicalop.1965968147" name="Warn if suspicious logical ops (-Wlogical-op)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.logicalop" value="true" valueType="boolean"/>
56+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.573079419" name="Float ABI" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.hard" valueType="enumerated"/>
57+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.2090413373" name="FPU Type" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.fpv4spd16" valueType="enumerated"/>
58+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.target.other.1988314090" name="Other target flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.target.other" value="" valueType="string"/>
4859 <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1982843270" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
4960 <builder buildPath="${workspace_loc:/nRFHello}/Debug" id="ilg.gnuarmeclipse.managedbuild.cross.builder.2033401582" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make ビルダー" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
5061 <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.421265309" name="GNU Arm Cross Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
@@ -73,6 +84,10 @@
7384 <listOptionValue builtIn="false" value="OS_USE_TRACE_SEMIHOSTING_STDOUT"/>
7485 <listOptionValue builtIn="false" value="NRF52833_XXAA"/>
7586 </option>
87+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.missingprototypes.39027230" name="Warn if a global function has no prototype (-Wmissing-prototypes)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.missingprototypes" useByScannerDiscovery="true" value="true" valueType="boolean"/>
88+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.badfunctioncast.802810021" name="Warn if wrong cast (-Wbad-function-cast)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.badfunctioncast" useByScannerDiscovery="true" value="true" valueType="boolean"/>
89+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.strictprototypes.55888613" name="Warn if a function has no arg type (-Wstrict-prototypes)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.warning.strictprototypes" useByScannerDiscovery="true" value="true" valueType="boolean"/>
90+ <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.otheroptimizations.379956610" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.otheroptimizations" value="-fsingle-precision-constant" valueType="string"/>
7691 <inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.59146624" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
7792 </tool>
7893 <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.894778314" name="GNU Arm Cross C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler">
@@ -303,15 +318,6 @@
303318 <storageModule moduleId="cdtBuildSystem" version="4.0.0">
304319 <project id="nRFHello.ilg.gnuarmeclipse.managedbuild.cross.target.elf.758015270" name="実行可能" projectType="ilg.gnuarmeclipse.managedbuild.cross.target.elf"/>
305320 </storageModule>
306- <storageModule moduleId="scannerConfiguration">
307- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
308- <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1195062602;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.59146624">
309- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
310- </scannerConfigBuildInfo>
311- <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.461201669;ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.461201669.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.466545200;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.1426178694">
312- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
313- </scannerConfigBuildInfo>
314- </storageModule>
315321 <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
316322 <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
317323 <storageModule moduleId="refreshScope" versionNumber="2">
@@ -323,4 +329,16 @@
323329 </configuration>
324330 </storageModule>
325331 <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
332+ <storageModule moduleId="scannerConfiguration">
333+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
334+ <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1195062602;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.59146624">
335+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
336+ </scannerConfigBuildInfo>
337+ <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.461201669;ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.461201669.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.466545200;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.1426178694">
338+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
339+ </scannerConfigBuildInfo>
340+ <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1091905655.;ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.894778314;ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.input.161133683">
341+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
342+ </scannerConfigBuildInfo>
343+ </storageModule>
326344 </cproject>
\ No newline at end of file
--- /dev/null
+++ b/nRFHello/include/pf_button.h
@@ -0,0 +1,52 @@
1+//! @file pf_button.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_BUTTON_H
26+#define PF_BUTTON_H
27+
28+#include "pf_types.h"
29+
30+//! @brief ボタンのID
31+typedef enum PF_BUTTON_ID_Tag
32+{
33+ PF_BUTTON_ID_BUTTON_A, //!< BUTTON A(Display面から見て左側)
34+ PF_BUTTON_ID_BUTTON_B, //!< BUTTON B(Display面から見て右側)
35+ PF_BUTTON_ID_MAX //!< (IDの個数を表す)I
36+} PF_BUTTON_ID;
37+
38+//! @brief ボタン初期化
39+//! @remarks プラットフォーム初期化処理から呼び出すこと
40+void pf_button_init(void);
41+
42+//! @brief ボタン定期タスク
43+//! @remarks 定期タスク(入力系)処理から呼び出すこと
44+void pf_button_task(void);
45+
46+//! @brief ボタンの押下状態を取得
47+//! @details モジュール内部でチャタリング除去処理が行われる
48+//! @param [in] id ボタンのID
49+//! @return 押下状態(TRUE=押されている/FALSE=押されていない)
50+BOOL pf_button_get(PF_BUTTON_ID id);
51+
52+#endif // PF_BUTTON_H
--- a/nRFHello/include/pf_clock.h
+++ b/nRFHello/include/pf_clock.h
@@ -28,8 +28,8 @@
2828 #include "pf_types.h"
2929
3030 //! @brief Clock初期化
31-//! @param なし
32-//! @return なし
31+//! @details X1(32MHz)から生成される64MHzクリスタルオシレータ(HFXO)を有効にする
32+//! @remarks プラットフォーム初期化処理から呼び出すこと
3333 void pf_clock_init(void);
3434
3535 #endif // PF_CLOCK_H
--- a/nRFHello/include/pf_display.h
+++ b/nRFHello/include/pf_display.h
@@ -27,25 +27,82 @@
2727
2828 #include "pf_types.h"
2929
30+//! @brief 行の最大数
31+#define PF_DISPLAY_ROW_MAX 5
32+
33+//! @brief 列の最大数
34+#define PF_DISPLAY_COL_MAX 5
35+
36+//! @brief 明るさの最小値
37+#define PF_DISPLAY_BRIGHTNESS_MIN 4
38+
39+//! @brief 明るさの最大値
40+#define PF_DISPLAY_BRIGHTNESS_MAX 96
41+
42+//! @brief イメージのID
43+typedef enum PF_DISPLAY_ID_Tag
44+{
45+ // デフォルト
46+ PF_DISPLAY_ID_HEART = 0, //!< ハート
47+
48+ // 感情
49+ PF_DISPLAY_ID_HAPPY, //!< HAPPY(嬉しい)
50+ PF_DISPLAY_ID_SMILE, //!< SMILE(笑い)
51+ PF_DISPLAY_ID_SAD, //!< SAD(悲しい)
52+ PF_DISPLAY_ID_CONFUSED, //!< CONFUSED(混乱)
53+ PF_DISPLAY_ID_ANGRY, //!< ANGRY(怒り)
54+
55+ // YES/NO
56+ PF_DISPLAY_ID_YES, //!< YES(チェックマーク)
57+ PF_DISPLAY_ID_NO, //!< NO(×マーク)
58+
59+ // 矢印
60+ PF_DISPLAY_ID_ARROW_N, //!< 矢印(上向き)
61+ PF_DISPLAY_ID_ARROW_NE, //!< 矢印(右上向き)
62+ PF_DISPLAY_ID_ARROW_E, //!< 矢印(右向き)
63+ PF_DISPLAY_ID_ARROW_SE, //!< 矢印(右下向き)
64+ PF_DISPLAY_ID_ARROW_S, //!< 矢印(下向き)
65+ PF_DISPLAY_ID_ARROW_SW, //!< 矢印(左下向き)
66+ PF_DISPLAY_ID_ARROW_W, //!< 矢印(左向き)
67+ PF_DISPLAY_ID_ARROW_NW, //!< 矢印(左上向き)
68+
69+ // その他の図形
70+ PF_DISPALY_ID_TRIANGLE, //!< 三角形
71+ PF_DISPLAY_ID_CHESSBOARD, //!< チェスボード(縞模様)
72+ PF_DISPLAY_ID_DIAMOND, //!< ダイアモンド(菱形)
73+ PF_DISPLAY_ID_SQUARE, //!< 四角形
74+ PF_DISPLAY_ID_MUSIC, //!< 音符
75+
76+ PF_DISPLAY_ID_MAX, //!< (IDの個数を表す)
77+} PF_DISPLAY_ID;
78+
3079 //! @brief Display初期化
31-//! @param なし
32-//! @return Timer初期化の後で呼び出すこと
80+//! @remarks プラットフォーム初期化処理から呼び出すこと
81+//! @attention GPIO初期化およびTimer初期化の後に呼び出すこと
3382 void pf_display_init(void);
3483
35-//! @brief Display表示
36-//! @param [in] ch 文字(0x20~0x7F)
37-//! @return なし
38-void pf_display_on(char ch);
84+//! @brief Display表示(文字)
85+//! @param [in] ch ASCII文字(0x20~0x7F)
86+void pf_display_chr(char ch);
87+
88+//! @brief Display表示(ID)
89+//! @param [in] id イメージのID
90+void pf_display_id(PF_DISPLAY_ID id);
91+
92+//! @brief Display表示(イメージ)
93+//! @param [in] image イメージへのポインタ(0=OFF/1=ON)
94+void pf_display_image(const u1 *image);
3995
4096 //! @brief Display停止
41-//! @param なし
42-//! @return なし
4397 void pf_display_off(void);
4498
4599 //! @brief Display明るさ指定
46-//! @param 明るさ(5~95)
47-//! @return なし
100+//! @param [in] brightness 明るさ(PF_DISPLAY_BRIGHTNESS_MIN~PF_DISPLAY_BRIGHTNESS_MAX)
48101 //! @attention 範囲外の値は設定禁止
49102 void pf_display_brightness(u4 brightness);
50103
104+//! @brief Display表示(電圧低下)
105+//! @attention これ以降、Display系のAPIは使用できない
106+void pf_display_powerdown(void);
107+
51108 #endif // PF_DISPLAY_H
--- a/nRFHello/include/pf_gpio.h
+++ b/nRFHello/include/pf_gpio.h
@@ -42,12 +42,15 @@ typedef enum PF_GPIO_ID_Tag
4242 PF_GPIO_ID_COL3, //!< Display COL3
4343 PF_GPIO_ID_COL4, //!< Display COL4
4444 PF_GPIO_ID_COL5, //!< Display COL5
45- PF_GPIO_ID_MAX //!< ID最大数
45+ PF_GPIO_ID_BUTTON_A, //!< BUTTON A
46+ PF_GPIO_ID_BUTTON_B, //!< BUTTON B
47+ PF_GPIO_ID_MAQUEEN_LED_L, //!< MAQUEEN LED L
48+ PF_GPIO_ID_MAQUEEN_LED_R, //!< MAQUEEN LED R
49+ PF_GPIO_ID_MAX //!< (IDの個数を表す)I
4650 } PF_GPIO_ID;
4751
4852 //! @brief GPIO初期化
49-//! @param なし
50-//! @return なし
53+//! @remarks プラットフォーム初期化処理から呼び出すこと
5154 void pf_gpio_init(void);
5255
5356 //! @brief GPIOポート番号を取得
@@ -60,10 +63,14 @@ u4 pf_gpio_get_port(PF_GPIO_ID id);
6063 //! @return GPIOピン番号(0~31)
6164 u4 pf_gpio_get_pin(PF_GPIO_ID id);
6265
66+//! @brief GPIOから入力
67+//! @param [in] id GPIOピンのID
68+//! @result 入力レベル(TRUE='H'レベル/FALSE='L'レベル)
69+BOOL pf_gpio_input(PF_GPIO_ID id);
70+
6371 //! @brief GPIOへ出力
6472 //! @param [in] id GPIOピンのID
6573 //! @param [in] level 出力レベル
66-//! @return なし
6774 void pf_gpio_output(PF_GPIO_ID id, BOOL level);
6875
6976 #endif // PF_GPIO_H
--- a/nRFHello/include/pf_interrupt.h
+++ b/nRFHello/include/pf_interrupt.h
@@ -27,22 +27,21 @@
2727
2828 #include "pf_types.h"
2929
30-//! @brief 割り込み優先度
30+//! @brief 割り込み優先度(最大8レベル。レベル0が最も高く、レベル7が最も低い)
3131 typedef enum PF_INTERRUPT_PRI_Tag
3232 {
3333 PF_INTERRUPT_PRI_SYSTICK = 0, //!< SysTick
34+ PF_INTERRUPT_PRI_POWER, //!< Power
3435 PF_INTERRUPT_PRI_UART, //!< UART
35- PF_INTERRUPT_PRI_DISPLAY_TIMER, //!< ディスプレイタイマ
36+ PF_INTERRUPT_PRI_DISPLAY_TIMER, //!< Display Timer
3637 } PF_INTERRUPT_PRI;
3738
3839 //! @brief グローバル割り込み禁止
39-//! @param なし
4040 //! @return 直前のグローバル割り込み禁止状態(1:割り込み禁止/0:割り込み許可)
4141 u4 pf_interrupt_global_disable(void);
4242
4343 //! @brief グローバル割り込み復元
4444 //! @param [in] primask pf_interrupt_global_disable()の返り値
45-//! @return なし
4645 void pf_interrupt_global_restore(u4 primask);
4746
4847 //! @brief ローカル割り込み禁止
@@ -52,8 +51,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri);
5251
5352 //! @brief ローカル割り込み復元
5453 //! @param [in] pri 割り込み優先度
55-//! @param [in] enable pf_interrupt_local_disable(id)の返り値
56-//! @return なし
54+//! @param [in] enable pf_interrupt_local_disable(pri)の返り値
5755 void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable);
5856
5957 #endif // PF_INTERRUPT_H
--- /dev/null
+++ b/nRFHello/include/pf_led.h
@@ -0,0 +1,47 @@
1+//! @file pf_led.h
2+//! @brief プラットフォーム(LED)ヘッダファイル
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_LED_H
26+#define PF_LED_H
27+
28+#include "pf_types.h"
29+
30+//! @brief LEDのID
31+typedef enum PF_LED_ID_Tag
32+{
33+ PF_LED_ID_MAQUEEN_L, //!< micro:Maqueenの左側赤色LED
34+ PF_LED_ID_MAQUEEN_R, //!< micro:Maqueenの右側赤色LED
35+ PF_LED_ID_MAX //!< (IDの個数を表す)
36+} PF_LED_ID;
37+
38+//! @brief LED初期化
39+//! @remarks プラットフォーム初期化処理から呼び出すこと
40+void pf_led_init(void);
41+
42+//! @brief LED制御
43+//! @param [in] id LEDのID
44+//! @param [in] ctrl LED制御情報(TRUE=LED点灯/FALSE=LED消灯)
45+void pf_led_ctrl(PF_LED_ID id, BOOL ctrl);
46+
47+#endif // PF_LED_H
--- /dev/null
+++ b/nRFHello/include/pf_power.h
@@ -0,0 +1,39 @@
1+//! @file pf_power.h
2+//! @brief プラットフォーム(Power)ヘッダファイル
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_POWER_H
26+#define PF_POWER_H
27+
28+#include "pf_types.h"
29+
30+//! @brief Power初期化
31+//! @remarks プラットフォーム初期化処理から呼び出すこと
32+//! @attention Display初期化の後で呼び出すこと
33+void pf_power_init(void);
34+
35+//! @brief Power割り込みハンドラ
36+//! @attention 割り込み発生以降、Displayの動作が×固定になる
37+void POWER_CLOCK_IRQHandler(void);
38+
39+#endif // PF_POWER_H
--- a/nRFHello/include/pf_systick.h
+++ b/nRFHello/include/pf_systick.h
@@ -39,30 +39,23 @@ typedef struct PF_SYSTICK_TIME_Tag
3939 } PF_SYSTICK_TIME;
4040
4141 //! @brief SysTick初期化
42-//! @param なし
43-//! @return なし
42+//! @remarks プラットフォーム初期化処理から呼び出すこと
4443 void pf_systick_init(void);
4544
4645 //! @brief 次の制御周期まで待つ
47-//! @param なし
48-//! @return なし
4946 //! @attention グローバル割り込み禁止状態で呼び出さないこと
5047 void pf_systick_sync(void);
5148
5249 //! @brief SysTick時刻を取得
53-//! @param [out] timebuf SysTick時刻報構造体へのポインタ
54-//! @return なし
50+//! @param [out] timebuf SysTick時刻情報構造体へのポインタ
5551 //! @attention グローバル割り込み禁止状態で呼び出さないこと
5652 void pf_systick_time(PF_SYSTICK_TIME *timebuf);
5753
5854 //! @brief フリーランmsカウンタを取得
59-//! @param なし
6055 //! @return フリーランmsカウンタ(32bit)
6156 u4 pf_systick_freerun(void);
6257
6358 //! @brief SysTick割り込みハンドラ
64-//! @param なし
65-//! @return なし
6659 void SysTick_Handler(void);
6760
6861 #endif // PF_SYSTICK_H
--- a/nRFHello/include/pf_timer.h
+++ b/nRFHello/include/pf_timer.h
@@ -30,71 +30,57 @@
3030 //! @brief us→コンペア値変換
3131 #define MICROSEC_TO_TIMERCC(us) (us)
3232
33+//! @brief Timerコールバック関数
34+//! @param [in] eventbit イベントビットパターン
35+typedef void (*PF_TIMER_CALLBACK)(u4 eventbit);
36+
3337 //! @brief TimerのID
3438 typedef enum PF_TIMER_ID_Tag
3539 {
36- PF_TIMER_ID_DISPLAY, //!< ディスプレイタイマ
37- PF_TIMER_ID_MAX //!< ID最大数
40+ PF_TIMER_ID_DISPLAY = 0, //!< ディスプレイタイマ
41+ PF_TIMER_ID_MAX //!< (IDの個数を表す)
3842 } PF_TIMER_ID;
3943
40-//! @brief コールバック関数
41-typedef void (*PF_TIMER_CALLBACK)(u4 eventbit);
42-
4344 //! @brief Timer初期化
44-//! @param なし
45-//! @return なし
45+//! @remarks プラットフォーム初期化処理から呼び出すこと
4646 void pf_timer_init(void);
4747
4848 //! @brief Timer開始
4949 //! @param [in] id TimerのID
50-//! @return なし
5150 void pf_timer_start(PF_TIMER_ID id);
5251
5352 //! @brief Timer停止
5453 //! @param [in] id TimerのID
55-//! @return なし
5654 void pf_timer_stop(PF_TIMER_ID id);
5755
5856 //! @brief Timerコンペアカウンタ設定
5957 //! @param [in] id TimerのID
60-//! @param [in] cc コンペアカウンタ配列へのポインタ
61-//! @return なし
58+//! @param [in] cc コンペアカウンタ配列
6259 void pf_timer_cc(PF_TIMER_ID id, u4 *cc);
6360
64-//! @brief コールバック関数設定
61+//! @brief Timerコールバック関数設定
6562 //! @param [in] id TimerのID
66-//! @param [in] func コールバック関数へのポインタ
67-//! @return なし
68-//! @attention コールバック関数は割り込みコンテキストで呼び出される
63+//! @param [in] func Timerコールバック関数へのポインタ
64+//! @attention Timerコールバック関数は割り込みコンテキストで呼び出される
6965 void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func);
7066
7167 //! @brief Timer0割り込みハンドラ
72-//! @param なし
73-//! @return なし
7468 //! @attention データ競合(割り込み干渉)に注意する
7569 void TIMER0_IRQHandler(void);
7670
7771 //! @brief Timer1割り込みハンドラ
78-//! @param なし
79-//! @return なし
8072 //! @attention データ競合(割り込み干渉)に注意する
8173 void TIMER1_IRQHandler(void);
8274
8375 //! @brief Timer2割り込みハンドラ
84-//! @param なし
85-//! @return なし
8676 //! @attention データ競合(割り込み干渉)に注意する
8777 void TIMER2_IRQHandler(void);
8878
8979 //! @brief Timer3割り込みハンドラ
90-//! @param なし
91-//! @return なし
9280 //! @attention データ競合(割り込み干渉)に注意する
9381 void TIMER3_IRQHandler(void);
9482
9583 //! @brief Timer4割り込みハンドラ
96-//! @param なし
97-//! @return なし
9884 //! @attention データ競合(割り込み干渉)に注意する
9985 void TIMER4_IRQHandler(void);
10086
--- a/nRFHello/include/pf_types.h
+++ b/nRFHello/include/pf_types.h
@@ -1,6 +1,26 @@
11 //! @file pf_types.h
22 //! @brief プラットフォーム 標準型定義ファイル
3-//! @author Yasushi Tanaka
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.
424
525 #ifndef PF_TYPES_H
626 #define PF_TYPES_H
@@ -22,7 +42,7 @@ typedef _Bool BOOL;
2242 //! 論理型(FALSE)
2343 #define FALSE (0)
2444
25-// NULLポインタ
45+//! NULLポインタ
2646 #ifndef NULL
2747 #define NULL ((void*)0)
2848 #endif // NULL
--- a/nRFHello/include/pf_uart.h
+++ b/nRFHello/include/pf_uart.h
@@ -28,31 +28,39 @@
2828 #include "pf_types.h"
2929
3030 //! @brief UART初期化
31-//! @param なし
32-//! @return なし
31+//! @remarks プラットフォーム初期化処理から呼び出すこと
3332 //! @attention GPIO初期化の後で呼び出すこと
3433 void pf_uart_init(void);
3534
3635 //! @brief UART定期タスク
37-//! @param なし
38-//! @return なし
36+//! @remarks 定期タスク(出力系)処理から呼び出すこと
3937 void pf_uart_task(void);
4038
4139 //! @brief UART送信
4240 //! @param [in] buf 送信バッファへのポインタ
4341 //! @param [in] bytes 送信バイト数
44-//! @return なし
4542 void pf_uart_send(const u1 *buf, u4 bytes);
4643
47-//! @brief UARTログ
48-//! @param [in] format printf形式の書式指定文字列(末尾の改行は不要)
49-//! @return なし
44+//! @brief UART受信
45+//! @param [out] buf 受信バッファへのポインタ
46+//! @param [in] bytes 受信バッファの最大数
47+//! @return 受信したバイト数
48+u4 pf_uart_recv(u1 *buf, u4 bytes);
49+
50+//! @brief UART1文字出力
51+//! @param [in] ch 送信する文字(0xFF以外)
52+void pf_uart_putc(u1 ch);
53+
54+//! @brief UART1文字入力
55+//! @return 受信した文字(受信していない場合、0xFF)
56+u1 pf_uart_getc(void);
57+
58+//! @brief UARTログ出力
59+//! @param [in] format printf形式の書式指定文字列(末尾の改行はあってもなくてもよい)
5060 //! @attention グローバル割り込み禁止状態で呼び出さないこと
5161 void pf_uart_log(const char *format, ...);
5262
5363 //! @brief UART割り込みハンドラ
54-//! @param なし
55-//! @return なし
5664 //! @attention データ競合(割り込み干渉)に注意する
5765 void UARTE0_UART0_IRQHandler(void);
5866
--- a/nRFHello/src/main.c
+++ b/nRFHello/src/main.c
@@ -29,96 +29,112 @@
2929 #include "pf_timer.h"
3030 #include "pf_uart.h"
3131 #include "pf_display.h"
32+#include "pf_power.h"
33+#include "pf_button.h"
34+#include "pf_led.h"
3235
33-
34-static void greetings(void)
36+//! @brief プラットフォーム初期化
37+//! @attention 初期化順序に注意する
38+static void pf_init(void)
3539 {
36- u4 brightness;
37- u4 loop;
38- u4 freerun[2];
40+ // Phase1: クロックをHFXO(外部発振子)に切り替える
41+ pf_clock_init();
3942
40- freerun[0] = pf_systick_freerun();
43+ // Phase2: 低位モジュールを初期化する
44+ pf_gpio_init();
45+ pf_systick_init();
46+ pf_timer_init();
4147
48+ // Phase3: 中位モジュール(低位モジュールに依存するモジュール)を初期化する
49+ pf_uart_init();
50+ pf_display_init();
4251
43- // オート変数初期化
44- loop = 0;
45- brightness = 5;
52+ // Phase4: その他のモジュールを初期化する
53+ pf_power_init();
54+ pf_button_init();
55+ pf_led_init();
56+}
4657
47- // 初期表示
48- pf_display_brightness(brightness);
49- pf_display_on(0x7F);
58+//! @brief 定期タスク(入力系)
59+static void pf_input_task(void)
60+{
61+ pf_button_task();
62+}
5063
51- // 95になるまで上げる
52- while (brightness <= 95)
53- {
54- pf_systick_sync();
64+//! @brief 定期タスク(出力系)
65+static void pf_output_task(void)
66+{
67+ pf_uart_task();
68+}
5569
56- pf_display_brightness(brightness);
57- brightness += 4;
58- }
70+static BOOL button_prev[2];
71+static PF_DISPLAY_ID display_id;
72+
73+//! @brief アプリケーションタスク
74+static void app_task(void)
75+{
76+ BOOL button_now[2];
77+
78+ button_now[0] = pf_button_get(PF_BUTTON_ID_BUTTON_A);
79+ button_now[1] = pf_button_get(PF_BUTTON_ID_BUTTON_B);
5980
60- // 500ms待機
61- for (loop = 0; loop < 50; loop++)
81+ if (button_now[0] != button_prev[0])
6282 {
63- pf_systick_sync();
83+ if (button_now[0])
84+ {
85+ pf_uart_log("Button A: OFF -> ON");
86+ pf_display_id(display_id);
87+
88+ display_id++;
89+ if (display_id >= PF_DISPLAY_ID_MAX)
90+ {
91+ display_id = 0;
92+ }
93+ }
94+ else
95+ {
96+ pf_uart_log("Button A: ON -> OFF\n");
97+ }
6498 }
6599
66- // 5になるまで下げる
67- while (brightness >= 5)
100+ if (button_now[1] != button_prev[1])
68101 {
69- pf_systick_sync();
70-
71- pf_display_brightness(brightness);
72- brightness -= 4;
102+ if (button_now[1])
103+ {
104+ pf_uart_log("Button B: OFF -> ON");
105+ pf_led_ctrl(PF_LED_ID_MAQUEEN_L, TRUE);
106+ }
107+ else
108+ {
109+ pf_uart_log("Button B: ON -> OFF\n");
110+ pf_led_ctrl(PF_LED_ID_MAQUEEN_L, FALSE);
111+ }
73112 }
74113
75- // 表示なし
76- pf_display_off();
77-
78- freerun[1] = pf_systick_freerun();
79- pf_uart_log("Time = %u", freerun[1] - freerun[0]);
80- pf_uart_log("Brightness = %u", brightness);
114+ button_prev[0] = button_now[0];
115+ button_prev[1] = button_now[1];
81116 }
82117
118+//! @brief メインプログラム
119+//! @remarks マイコンリセット後、startup.cの_start()に制御が移り、その後main()が呼び出される
83120 int main(void)
84121 {
85- PF_SYSTICK_TIME timebuf;
86- u4 sec;
87-
88- sec = 0;
89-
90- pf_clock_init();
91- pf_gpio_init();
92- pf_systick_init();
93- pf_timer_init();
94- pf_uart_init();
95- pf_display_init();
96-
97-// // Right LED on Maqueen (P12)
98-// NRF_P0->PIN_CNF[12] = GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos;
99-// NRF_P0->OUTCLR = 1 << 12;
100-//
101-// // LEFT LED on Maqueen (P8)
102-// NRF_P0->PIN_CNF[10] = GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos;
103-// NRF_P0->OUTCLR = 1 << 10;
104-
105- greetings();
122+ // プラットフォーム初期化
123+ pf_init();
106124
125+ // 無限ループ
107126 while (1)
108127 {
128+ // 制御周期まで待つ
109129 pf_systick_sync();
110- pf_uart_task();
111130
112- pf_systick_time(&timebuf);
113- if (timebuf.sec == sec)
114- {
115- continue;
116- }
117- sec = timebuf.sec;
118- if (sec == 5)
119- {
120- pf_display_off();
121- }
131+ // 定期タスク(入力系)
132+ pf_input_task();
133+
134+ // 定期タスク(アプリケーション)
135+ app_task();
122136
137+ // 定期タスク(出力系)
138+ pf_output_task();
123139 }
124140 }
--- /dev/null
+++ b/nRFHello/src/pf/pf_button.c
@@ -0,0 +1,177 @@
1+//! @file pf_button.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_button.h"
28+
29+//! @brief チャタリング防止のためのフィルタ段数(最低2段以上にすること)
30+#define PF_BUTTON_FILTER_MAX (3)
31+
32+//! @brief ボタン情報構造体
33+typedef struct PF_BUTTON_INFO_Tag
34+{
35+ PF_GPIO_ID gpio; //!< GPIOピンのID
36+ BOOL prev[PF_BUTTON_FILTER_MAX]; //!< 過去データ
37+ BOOL now; //!< 現在データ
38+} PF_BUTTON_INFO;
39+
40+//! @brief ボタン情報テーブル
41+static PF_BUTTON_INFO pf_button_info[PF_BUTTON_ID_MAX];
42+
43+//! @brief ボタン初期化(単一のID)
44+//! @param [in] id ボタンのID
45+static void pf_button_init_id(PF_BUTTON_ID id)
46+{
47+ u4 loop;
48+
49+ // オート変数初期化
50+ loop = 0;
51+
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+
64+ // 過去データをすべてFALSE(押されていない)に初期化
65+ for (loop = 0; loop < PF_BUTTON_FILTER_MAX; loop++)
66+ {
67+ pf_button_info[id].prev[loop] = FALSE;
68+ }
69+
70+ // 現在データをFALSE(押されていない)に初期化
71+ pf_button_info[id].now = FALSE;
72+}
73+
74+//! @brief ボタン初期化
75+//! @remarks プラットフォーム初期化処理から呼び出すこと
76+void pf_button_init(void)
77+{
78+ u4 id;
79+
80+ // オート変数初期化
81+ id = 0;
82+
83+ // すべてのIDをループ
84+ for (id = 0; id < (u4)PF_BUTTON_ID_MAX; id++)
85+ {
86+ // 1つのIDを初期化
87+ pf_button_init_id((PF_BUTTON_ID)id);
88+ }
89+}
90+
91+//! @brief ボタン定期タスク(単一のID)
92+//! @param [in] id ボタンのID
93+static void pf_button_task_id(PF_BUTTON_ID id)
94+{
95+ u4 loop;
96+ BOOL result;
97+ BOOL now;
98+
99+ // オート変数初期化
100+ loop = 0;
101+ result = FALSE;
102+ now = FALSE;
103+
104+ // 現在のボタン押下情報を取得(GPIOからの入力が'L'で押されている)
105+ if (FALSE == pf_gpio_input(pf_button_info[id].gpio))
106+ {
107+ // 押されている
108+ result = TRUE;
109+ }
110+ else
111+ {
112+ // 押されていない
113+ result = FALSE;
114+ }
115+
116+ // prev配列を1つ前へ移動
117+ for (loop = 0; loop < (PF_BUTTON_FILTER_MAX - 1); loop++)
118+ {
119+ pf_button_info[id].prev[loop] = pf_button_info[id].prev[loop + 1];
120+ }
121+
122+ // 最後に要素にresultを格納
123+ pf_button_info[id].prev[PF_BUTTON_FILTER_MAX - 1] = result;
124+
125+ // いったん、現在の状態を'押されている'に設定する
126+ now = TRUE;
127+
128+ // すべてのprevを検索し、一つでも'押されていない'であればFALSE
129+ for (loop = 0; loop < PF_BUTTON_FILTER_MAX; loop++)
130+ {
131+ if (FALSE == pf_button_info[id].prev[loop])
132+ {
133+ now = FALSE;
134+ break;
135+ }
136+ }
137+
138+ // 現在の押下状態を更新
139+ pf_button_info[id].now = now;
140+}
141+
142+//! @brief ボタン定期タスク
143+//! @remarks 定期タスク(入力系)処理から呼び出すこと
144+void pf_button_task(void)
145+{
146+ u4 id;
147+
148+ // オート変数初期化
149+ id = 0;
150+
151+ // すべてのIDをループ
152+ for (id = 0; id < (u4)PF_BUTTON_ID_MAX; id++)
153+ {
154+ // 1つのIDを処理
155+ pf_button_task_id((PF_BUTTON_ID)id);
156+ }
157+}
158+
159+//! @brief ボタンの押下状態を取得
160+//! @details モジュール内部でチャタリング除去処理が行われる
161+//! @param [in] id ボタンのID
162+//! @return 押下状態(TRUE=押されている/FALSE=押されていない)
163+BOOL pf_button_get(PF_BUTTON_ID id)
164+{
165+ BOOL result;
166+
167+ // オート変数初期化
168+ result = FALSE;
169+
170+ // パラメータチェック
171+ if (id < PF_BUTTON_ID_MAX)
172+ {
173+ result = pf_button_info[id].now;
174+ }
175+
176+ return result;
177+}
--- a/nRFHello/src/pf/pf_clock.c
+++ b/nRFHello/src/pf/pf_clock.c
@@ -28,8 +28,8 @@
2828 #include "pf_clock.h"
2929
3030 //! @brief Clock初期化
31-//! @param なし
32-//! @return なし
31+//! @details X1(32MHz)から生成される64MHzクリスタルオシレータ(HFXO)を有効にする
32+//! @remarks プラットフォーム初期化処理から呼び出すこと
3333 void pf_clock_init(void)
3434 {
3535 // X1クロック(32MHz)有効イベントをクリア
--- a/nRFHello/src/pf/pf_display.c
+++ b/nRFHello/src/pf/pf_display.c
@@ -28,13 +28,7 @@
2828 #include "pf_timer.h"
2929 #include "pf_display.h"
3030
31-//! @brief 行の最大数
32-#define PF_DISPLAY_ROW_MAX 5
33-
34-//! @brief 列の最大数
35-#define PF_DISPLAY_COL_MAX 5
36-
37-// @brief 行→GPIO IDテーブル
31+//! @brief 行→GPIO IDテーブル
3832 static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] =
3933 {
4034 PF_GPIO_ID_ROW1, //!< ROW1
@@ -44,7 +38,7 @@ static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] =
4438 PF_GPIO_ID_ROW5, //!< ROW5
4539 };
4640
47-// @brief 列→GPIO IDテーブル
41+//! @brief 列→GPIO IDテーブル
4842 static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] =
4943 {
5044 PF_GPIO_ID_COL1, //!< COL1
@@ -57,9 +51,9 @@ static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] =
5751 //! @brief Display情報構造体
5852 typedef struct PF_DISPLAY_INFO_Tag
5953 {
60- char ch; //!< 表示キャラクタ
6154 BOOL active; //!< アクティブフラグ
6255 BOOL on; //!< 表示ON/OFFフラグ
56+ BOOL force; //!< 強制固定フラグ
6357 u4 row; //!< 現在の行(0~4)
6458 BOOL cols[PF_DISPLAY_ROW_MAX][PF_DISPLAY_COL_MAX]; //!< 列の設定情報
6559 } PF_DISPLAY_INFO;
@@ -67,7 +61,7 @@ typedef struct PF_DISPLAY_INFO_Tag
6761 //! @brief Display情報
6862 static PF_DISPLAY_INFO pf_display_info;
6963
70-//! @brief micro:bit標準フォント(pendolino3)
64+//! @brief micro:bit標準フォント(pendolino3) from codal-core(BitmapFont.cpp)
7165 static const u1 pf_display_pendolino3[96][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MAX] =
7266 {
7367 // 0x20( )
@@ -925,19 +919,211 @@ static const u1 pf_display_pendolino3[96][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MA
925919 0, 0, 0, 0, 0,
926920 },
927921
928- // 0x7F(DEL→HAPPYマーク)
922+ // 0x7F(DEL)
923+ {
924+ 0, 0, 0, 0, 0,
925+ 1, 0, 1, 1, 1,
926+ 0, 0, 0, 0, 0,
927+ 0, 0, 0, 0, 0,
928+ 0, 0, 0, 0, 0,
929+ },
930+};
931+
932+//! @brief 追加フォント(PF_DISPLAY_ID) from microPython(microbitconstimage.cpp)
933+static const u1 pf_display_font[PF_DISPLAY_ID_MAX][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MAX] =
934+{
935+ // PF_DISPLAY_ID_HEART
929936 {
930937 0, 1, 0, 1, 0,
938+ 1, 1, 1, 1, 1,
939+ 1, 1, 1, 1, 1,
940+ 0, 1, 1, 1, 0,
941+ 0, 0, 1, 0, 0,
942+ },
943+
944+ // PF_DISPLAY_ID_HAPPY
945+ {
946+ 0, 0, 0, 0, 0,
947+ 0, 1, 0, 1, 0,
948+ 0, 0, 0, 0, 0,
949+ 1, 0, 0, 0, 1,
950+ 0, 1, 1, 1, 0,
951+ },
952+
953+ // PF_DISPLAY_ID_SMILE
954+ {
955+ 0, 0, 0, 0, 0,
956+ 0, 0, 0, 0, 0,
931957 0, 0, 0, 0, 0,
932958 1, 0, 0, 0, 1,
933959 0, 1, 1, 1, 0,
960+ },
961+
962+ // PF_DISPLAY_ID_SAD
963+ {
964+ 0, 0, 0, 0, 0,
965+ 0, 1, 0, 1, 0,
966+ 0, 0, 0, 0, 0,
967+ 0, 1, 1, 1, 0,
968+ 1, 0, 0, 0, 1,
969+ },
970+
971+ // PF_DISPLAY_ID_CONFUSED
972+ {
973+ 0, 0, 0, 0, 0,
974+ 0, 1, 0, 1, 0,
975+ 0, 0, 0, 0, 0,
976+ 0, 1, 0, 1, 0,
977+ 1, 0, 1, 0, 1,
978+ },
979+
980+ // PF_DISPALY_ID_ANGRY
981+ {
982+ 1, 0, 0, 0, 1,
983+ 0, 1, 0, 1, 0,
984+ 0, 0, 0, 0, 0,
985+ 1, 1, 1, 1, 1,
986+ 1, 0, 1, 0, 1,
987+ },
988+
989+ // PF_DISPLAY_ID_YES
990+ {
991+ 0, 0, 0, 0, 0,
992+ 0, 0, 0, 0, 1,
993+ 0, 0, 0, 1, 0,
994+ 1, 0, 1, 0, 0,
995+ 0, 1, 0, 0, 0,
996+ },
997+
998+ // PF_DISPLAY_ID_NO
999+ {
1000+ 1, 0, 0, 0, 1,
1001+ 0, 1, 0, 1, 0,
1002+ 0, 0, 1, 0, 0,
1003+ 0, 1, 0, 1, 0,
1004+ 1, 0, 0, 0, 1,
1005+ },
1006+
1007+ // PF_DISPLAY_ID_ARROW_N
1008+ {
1009+ 0, 0, 1, 0, 0,
1010+ 0, 1, 1, 1, 0,
1011+ 1, 0, 1, 0, 1,
1012+ 0, 0, 1, 0, 0,
1013+ 0, 0, 1, 0, 0,
1014+ },
1015+
1016+ // PF_DISPLAY_ID_ARROW_NE
1017+ {
1018+ 0, 0, 1, 1, 1,
1019+ 0, 0, 0, 1, 1,
1020+ 0, 0, 1, 0, 1,
1021+ 0, 1, 0, 0, 0,
1022+ 1, 0, 0, 0, 0,
1023+ },
1024+
1025+ // PF_DISPLAY_ID_ARROW_E
1026+ {
1027+ 0, 0, 1, 0, 0,
1028+ 0, 0, 0, 1, 0,
1029+ 1, 1, 1, 1, 1,
1030+ 0, 0, 0, 1, 0,
1031+ 0, 0, 1, 0, 0,
1032+ },
1033+
1034+ // PF_DISPLAY_ID_ARROW_SE
1035+ {
1036+ 1, 0, 0, 0, 0,
1037+ 0, 1, 0, 0, 0,
1038+ 0, 0, 1, 0, 1,
1039+ 0, 0, 0, 1, 1,
1040+ 0, 0, 1, 1, 1,
1041+ },
1042+
1043+ // PF_DISPLAY_ID_ARROW_S
1044+ {
1045+ 0, 0, 1, 0, 0,
1046+ 0, 0, 1, 0, 0,
1047+ 1, 0, 1, 0, 1,
1048+ 0, 1, 1, 1, 0,
1049+ 0, 0, 1, 0, 0,
1050+ },
1051+
1052+ // PF_DISPLAY_ID_ARROW_SW
1053+ {
1054+ 0, 0, 0, 0, 1,
1055+ 0, 0, 0, 1, 0,
1056+ 1, 0, 1, 0, 0,
1057+ 1, 1, 0, 0, 0,
1058+ 1, 1, 1, 0, 0,
1059+ },
1060+
1061+ // PF_DISPLAY_ID_ARROW_W
1062+ {
1063+ 0, 0, 1, 0, 0,
1064+ 0, 1, 0, 0, 0,
1065+ 1, 1, 1, 1, 1,
1066+ 0, 1, 0, 0, 0,
1067+ 0, 0, 1, 0, 0,
1068+ },
1069+
1070+ // PF_DISPLAY_ID_ARROW_NW
1071+ {
1072+ 1, 1, 1, 0, 0,
1073+ 1, 1, 0, 0, 0,
1074+ 1, 0, 1, 0, 0,
1075+ 0, 0, 0, 1, 0,
1076+ 0, 0, 0, 0, 1,
1077+ },
1078+
1079+ // PF_DISPLAY_ID_TRIANGLE
1080+ {
1081+ 0, 0, 0, 0, 0,
1082+ 0, 0, 1, 0, 0,
1083+ 0, 1, 0, 1, 0,
1084+ 1, 1, 1, 1, 1,
9341085 0, 0, 0, 0, 0,
9351086 },
1087+
1088+ // PF_DISPLAY_ID_CHESSBOARD
1089+ {
1090+ 0, 1, 0, 1, 0,
1091+ 1, 0, 1, 0, 1,
1092+ 0, 1, 0, 1, 0,
1093+ 1, 0, 1, 0, 1,
1094+ 0, 1, 0, 1, 0,
1095+ },
1096+
1097+ // PF_DISPLAY_ID_DIAMOND
1098+ {
1099+ 0, 0, 1, 0, 0,
1100+ 0, 1, 0, 1, 0,
1101+ 1, 0, 0, 0, 1,
1102+ 0, 1, 0, 1, 0,
1103+ 0, 0, 1, 0, 0,
1104+ },
1105+
1106+ // PF_DISPLAY_ID_SQUARE
1107+ {
1108+ 1, 1, 1, 1, 1,
1109+ 1, 0, 0, 0, 1,
1110+ 1, 0, 0, 0, 1,
1111+ 1, 0, 0, 0, 1,
1112+ 1, 1, 1, 1, 1,
1113+ },
1114+
1115+ // PF_DISPLAY_ID_MUSIC
1116+ {
1117+ 0, 0, 1, 0, 0,
1118+ 0, 0, 1, 1, 0,
1119+ 0, 0, 1, 0, 1,
1120+ 1, 1, 1, 0, 0,
1121+ 1, 1, 1, 0, 0,
1122+ },
9361123 };
9371124
9381125 //! @brief Timerコールバック
939-//! @param イベントビット(bit0:消灯タイミング bit1:点灯タイミング)
940-//! @return なし
1126+//! @param [in] eventbit イベントビットパターン(bit0:消灯タイミング bit1:点灯タイミング)
9411127 //! @attention Timer割り込みコンテキストで実行される
9421128 static void pf_display_callback(u4 eventbit)
9431129 {
@@ -975,7 +1161,7 @@ static void pf_display_callback(u4 eventbit)
9751161 pf_display_info.row = 0;
9761162 }
9771163
978- // row(GPIO ID)を再取得
1164+ // row(GPIOピンのID)を再取得
9791165 row = pf_display_row_to_id[pf_display_info.row];
9801166 }
9811167
@@ -1008,8 +1194,8 @@ static void pf_display_callback(u4 eventbit)
10081194 }
10091195
10101196 //! @brief Display初期化
1011-//! @param なし
1012-//! @return GPIO初期化およびTimer初期化の後に呼び出すこと
1197+//! @remarks プラットフォーム初期化処理から呼び出すこと
1198+//! @attention GPIO初期化およびTimer初期化の後に呼び出すこと
10131199 void pf_display_init(void)
10141200 {
10151201 u4 row;
@@ -1020,9 +1206,9 @@ void pf_display_init(void)
10201206 col = 0;
10211207
10221208 // Display情報初期化
1023- pf_display_info.ch = ' ';
10241209 pf_display_info.active = FALSE;
10251210 pf_display_info.on = FALSE;
1211+ pf_display_info.force = FALSE;
10261212 pf_display_info.row = 0;
10271213
10281214 // Display情報初期化(行)
@@ -1043,23 +1229,16 @@ void pf_display_init(void)
10431229 pf_timer_start(PF_TIMER_ID_DISPLAY);
10441230 }
10451231
1046-//! @brief Display表示
1047-//! @param [in] ch 文字(0x20~0x7F)
1048-//! @return なし
1049-void pf_display_on(char ch)
1232+//! @brief Display表示(文字)
1233+//! @param [in] ch ASCII文字(0x20~0x7F)
1234+void pf_display_chr(char ch)
10501235 {
10511236 const u1 *font;
1052- u4 enable;
10531237 u4 offset;
1054- u4 row;
1055- u4 col;
10561238
10571239 // オート変数初期化
10581240 font = &pf_display_pendolino3[0][0];
1059- enable = 0;
10601241 offset = 0;
1061- row = 0;
1062- col = 0;
10631242
10641243 // 範囲内であれば、pendolino3フォントを使用する
10651244 offset = (u4)ch;
@@ -1070,41 +1249,87 @@ void pf_display_on(char ch)
10701249 }
10711250 else
10721251 {
1073- // 範囲外の場合、Happyマークを使用する
1252+ // 範囲外の場合、スペースを表示する
10741253 }
10751254
1076- // 割り込み禁止
1077- enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_DISPLAY_TIMER);
1255+ // Display表示(イメージ)と共通
1256+ pf_display_image(font);
1257+}
10781258
1079- // ワークを設定
1080- pf_display_info.on = TRUE;
1259+//! @brief Display表示(ID)
1260+//! @param [in] id イメージのID
1261+void pf_display_id(PF_DISPLAY_ID id)
1262+{
1263+ const u1 *font;
1264+
1265+ // オート変数初期化
1266+ font = &pf_display_font[0][0];
10811267
1082- // 行ループ
1083- for (row = 0; row < 5; row++)
1268+ // 範囲内であれば、追加フォントを使用する
1269+ if (id < PF_DISPLAY_ID_MAX)
1270+ {
1271+ font = &pf_display_font[id][0];
1272+ }
1273+ else
10841274 {
1085- // 列ループ
1086- for (col = 0; col<5; col++)
1275+ // 範囲外の場合、ハートを表示する
1276+ }
1277+
1278+ // Display表示(イメージ)と共通
1279+ pf_display_image(font);
1280+}
1281+
1282+//! @brief Display表示(イメージ)
1283+//! @param [in] image イメージへのポインタ(0=OFF/1=ON)
1284+void pf_display_image(const u1 *image)
1285+{
1286+ u4 enable;
1287+ u4 row;
1288+ u4 col;
1289+
1290+ // オート変数初期化
1291+ enable = 0;
1292+ row = 0;
1293+ col = 0;
1294+
1295+ // パラメータチェック
1296+ if (NULL != image)
1297+ {
1298+ // 強制フラグチェック
1299+ if (FALSE == pf_display_info.force)
10871300 {
1088- // 点灯の場合はFALSE、消灯の場合はTRUEをセット
1089- if (0 == *font)
1090- {
1091- pf_display_info.cols[row][col] = TRUE;
1092- }
1093- else
1301+ // 割り込み禁止
1302+ enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_DISPLAY_TIMER);
1303+
1304+ // ワークを設定
1305+ pf_display_info.on = TRUE;
1306+
1307+ // 行ループ
1308+ for (row = 0; row < PF_DISPLAY_ROW_MAX; row++)
10941309 {
1095- pf_display_info.cols[row][col] = FALSE;
1310+ // 列ループ
1311+ for (col = 0; col < PF_DISPLAY_COL_MAX; col++)
1312+ {
1313+ // 点灯の場合はFALSE、消灯の場合はTRUEをセット
1314+ if (0 == *image)
1315+ {
1316+ pf_display_info.cols[row][col] = TRUE;
1317+ }
1318+ else
1319+ {
1320+ pf_display_info.cols[row][col] = FALSE;
1321+ }
1322+ image++;
1323+ }
10961324 }
1097- font++;
1325+
1326+ // 割り込み復元
1327+ pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable);
10981328 }
10991329 }
1100-
1101- // 割り込み復元
1102- pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable);
11031330 }
11041331
11051332 //! @brief Display停止
1106-//! @param なし
1107-//! @return なし
11081333 void pf_display_off(void)
11091334 {
11101335 u4 enable;
@@ -1112,19 +1337,22 @@ void pf_display_off(void)
11121337 // オート変数初期化
11131338 enable = 0;
11141339
1115- // 割り込み禁止
1116- enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_DISPLAY_TIMER);
1340+ // 強制フラグチェック
1341+ if (FALSE == pf_display_info.force)
1342+ {
1343+ // 割り込み禁止
1344+ enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_DISPLAY_TIMER);
11171345
1118- // ワークを設定
1119- pf_display_info.on = FALSE;
1346+ // ワークを設定
1347+ pf_display_info.on = FALSE;
11201348
1121- // 割り込み復元
1122- pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable);
1349+ // 割り込み復元
1350+ pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable);
1351+ }
11231352 }
11241353
11251354 //! @brief Display明るさ指定
1126-//! @param 明るさ(5~95)
1127-//! @return なし
1355+//! @param [in] brightness 明るさ(PF_DISPLAY_BRIGHTNESS_MIN~PF_DISPLAY_BRIGHTNESS_MAX)
11281356 //! @attention 範囲外の値は設定禁止
11291357 void pf_display_brightness(u4 brightness)
11301358 {
@@ -1135,13 +1363,34 @@ void pf_display_brightness(u4 brightness)
11351363 cc[1] = MICROSEC_TO_TIMERCC(1000);
11361364
11371365 // パラメータチェック
1138- if ((brightness >= 5) && (brightness <= 95))
1366+ if ((brightness >= PF_DISPLAY_BRIGHTNESS_MIN)
1367+ && (brightness <= PF_DISPLAY_BRIGHTNESS_MAX))
11391368 {
1140- // cc[1]は常に1000usとして、cc[0]までの間隔として50usのマージンを設ける
1141- cc[0] = MICROSEC_TO_TIMERCC(brightness * 10);
1369+ // 強制フラグチェック
1370+ if (FALSE == pf_display_info.force)
1371+ {
1372+ // cc[1]は常に1000usとして、cc[0]までの間隔として40usのマージンを設ける
1373+ cc[0] = MICROSEC_TO_TIMERCC(brightness * 10);
11421374
1143- // CC[i]レジスタを変更する
1144- pf_timer_cc(PF_TIMER_ID_DISPLAY, cc);
1375+ // CC[i]レジスタを変更する
1376+ pf_timer_cc(PF_TIMER_ID_DISPLAY, cc);
1377+ }
11451378 }
11461379 }
11471380
1381+//! @brief Display表示(電圧低下)
1382+//! @attention これ以降、Display系のAPIは使用できない
1383+void pf_display_powerdown(void)
1384+{
1385+ // 強制フラグOFF
1386+ pf_display_info.force = FALSE;
1387+
1388+ // ID指定
1389+ pf_display_id(PF_DISPLAY_ID_NO);
1390+
1391+ // 明るさ設定(MINとMAXの中間)
1392+ pf_display_brightness((PF_DISPLAY_BRIGHTNESS_MIN + PF_DISPLAY_BRIGHTNESS_MAX) / 2);
1393+
1394+ // 強制フラグON
1395+ pf_display_info.force = TRUE;
1396+}
--- a/nRFHello/src/pf/pf_gpio.c
+++ b/nRFHello/src/pf/pf_gpio.c
@@ -61,7 +61,7 @@ typedef enum PF_GPIO_DRIVE_Tag
6161 PF_GPIO_DRIVE_H0D1 = 0x0700, //!< '0':高駆動/'1':未接続
6262 } PF_GPIO_DRIVE;
6363
64-//! @brief GPIOピンの設定情報構造体
64+//! @brief GPIOピン設定情報構造体
6565 typedef struct PF_GPIO_INFO_Tag
6666 {
6767 u4 port; //!< ポート(0~1)
@@ -73,7 +73,8 @@ typedef struct PF_GPIO_INFO_Tag
7373 PF_GPIO_DRIVE drive; //!< 駆動特性
7474 } PF_GPIO_INFO;
7575
76-//! @brief GPIOピンの設定情報テーブル
76+//! @brief GPIOピン設定情報テーブル
77+//! @todo 未使用ピンをすべてプルアップ有効の入力にするよう設定すること
7778 const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] =
7879 {
7980 // PF_GPIO_ID_UART_TXD
@@ -208,6 +209,50 @@ const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] =
208209 PF_GPIO_PULL_NONE, // プルアップ・プルダウン
209210 PF_GPIO_DRIVE_H0H1, // 駆動特性
210211 },
212+
213+ // PF_GPIO_ID_BUTTON_A
214+ {
215+ 0, // ポート
216+ 14, // ピン
217+ FALSE, // 初期出力レベル
218+ PF_GPIO_DIR_INPUT, // 入出力方向
219+ PF_GPIO_INBUF_CONNECT, // 入力バッファ
220+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
221+ PF_GPIO_DRIVE_S0S1, // 駆動特性
222+ },
223+
224+ // PF_GPIO_ID_BUTTON_B
225+ {
226+ 0, // ポート
227+ 23, // ピン
228+ FALSE, // 初期出力レベル
229+ PF_GPIO_DIR_INPUT, // 入出力方向
230+ PF_GPIO_INBUF_CONNECT, // 入力バッファ
231+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
232+ PF_GPIO_DRIVE_S0S1, // 駆動特性
233+ },
234+
235+ // PF_GPIO_ID_MAQUEEN_LED_L
236+ {
237+ 0, // ポート
238+ 10, // ピン
239+ FALSE, // 初期出力レベル
240+ PF_GPIO_DIR_OUTPUT, // 入出力方向
241+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
242+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
243+ PF_GPIO_DRIVE_S0S1, // 駆動特性
244+ },
245+
246+ // PF_GPIO_ID_MAQUEEN_LED_R
247+ {
248+ 0, // ポート
249+ 12, // ピン
250+ FALSE, // 初期出力レベル
251+ PF_GPIO_DIR_OUTPUT, // 入出力方向
252+ PF_GPIO_INBUF_DISCONNECT, // 入力バッファ
253+ PF_GPIO_PULL_NONE, // プルアップ・プルダウン
254+ PF_GPIO_DRIVE_S0S1, // 駆動特性
255+ },
211256 };
212257
213258 //! @brief GPIOデバイス取得
@@ -235,7 +280,6 @@ static NRF_GPIO_Type* pf_gpio_get_dev(PF_GPIO_ID id)
235280
236281 //! @brief GPIO初期化(単一のID)
237282 //! @param [in] id GPIOピンのID
238-//! @return なし
239283 static void pf_gpio_init_id(PF_GPIO_ID id)
240284 {
241285 NRF_GPIO_Type *dev;
@@ -261,8 +305,7 @@ static void pf_gpio_init_id(PF_GPIO_ID id)
261305 }
262306
263307 //! @brief GPIO初期化
264-//! @param なし
265-//! @return なし
308+//! @remarks プラットフォーム初期化処理から呼び出すこと
266309 void pf_gpio_init(void)
267310 {
268311 u4 id;
@@ -274,7 +317,7 @@ void pf_gpio_init(void)
274317 for (id = 0; id < (u4)PF_GPIO_ID_MAX; id++)
275318 {
276319 // 1つのIDを初期化
277- pf_gpio_init_id((PF_GPIO_ID) id);
320+ pf_gpio_init_id((PF_GPIO_ID)id);
278321 }
279322 }
280323
@@ -316,10 +359,48 @@ u4 pf_gpio_get_pin(PF_GPIO_ID id)
316359 return pin;
317360 }
318361
362+//! @brief GPIOから入力
363+//! @param [in] id GPIOピンのID
364+//! @result 入力レベル(TRUE='H'レベル/FALSE='L'レベル)
365+BOOL pf_gpio_input(PF_GPIO_ID id)
366+{
367+ NRF_GPIO_Type *dev;
368+ u4 in;
369+ BOOL result;
370+
371+ // オート変数初期化
372+ dev = NULL;
373+ in = 0;
374+ result = FALSE;
375+
376+ // パラメータチェック
377+ if (id < PF_GPIO_ID_MAX)
378+ {
379+ // IDからデバイスを取得
380+ dev = pf_gpio_get_dev(id);
381+
382+ // 当該ピンのみを取り出した情報を取得
383+ in = dev->IN & (1 << pf_gpio_table[id].pin);
384+
385+ // 0で'L'レベル、1で'H'レベル
386+ if (0 == in)
387+ {
388+ // 'L'レベル
389+ result = FALSE;
390+ }
391+ else
392+ {
393+ // 'H'レベル
394+ result = TRUE;
395+ }
396+ }
397+
398+ return result;
399+}
400+
319401 //! @brief GPIOへ出力
320402 //! @param [in] id GPIOピンのID
321403 //! @param [in] level 出力レベル
322-//! @return なし
323404 void pf_gpio_output(PF_GPIO_ID id, BOOL level)
324405 {
325406 NRF_GPIO_Type *dev;
--- a/nRFHello/src/pf/pf_interrupt.c
+++ b/nRFHello/src/pf/pf_interrupt.c
@@ -27,7 +27,6 @@
2727 #include "pf_interrupt.h"
2828
2929 //! @brief グローバル割り込み禁止
30-//! @param なし
3130 //! @return 直前のグローバル割り込み禁止状態(1:割り込み禁止/0:割り込み許可)
3231 u4 pf_interrupt_global_disable(void)
3332 {
@@ -44,7 +43,6 @@ u4 pf_interrupt_global_disable(void)
4443
4544 //! @brief グローバル割り込み復元
4645 //! @param [in] primask pf_interrupt_global_disable()の返り値
47-//! @return なし
4846 void pf_interrupt_global_restore(u4 primask)
4947 {
5048 // 直前の割り込み禁止状態が割り込み許可の場合のみ
@@ -68,6 +66,11 @@ static u4 pf_interrupt_get_irq(PF_INTERRUPT_PRI pri)
6866 // 割り込み優先度から割り込み番号を取得
6967 switch (pri)
7068 {
69+ // POWER
70+ case PF_INTERRUPT_PRI_POWER:
71+ irq = POWER_CLOCK_IRQn;
72+ break;
73+
7174 // UART
7275 case PF_INTERRUPT_PRI_UART:
7376 irq = UARTE0_UART0_IRQn;
@@ -97,7 +100,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri)
97100 enable = 0;
98101 irq = UARTE1_IRQn;
99102
100- // SysTickは別制御
103+ // SysTickは別制御(NVICで割り込み許可/割り込み禁止を管理していないため)
101104 if (PF_INTERRUPT_PRI_SYSTICK == pri)
102105 {
103106 enable = pf_interrupt_global_disable();
@@ -120,8 +123,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri)
120123
121124 //! @brief ローカル割り込み復元
122125 //! @param [in] pri 割り込み優先度
123-//! @param [in] enable pf_interrupt_local_disable(id)の返り値
124-//! @return なし
126+//! @param [in] enable pf_interrupt_local_disable(pri)の返り値
125127 void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable)
126128 {
127129 IRQn_Type irq;
@@ -129,7 +131,7 @@ void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable)
129131 // オート変数初期化
130132 irq = UARTE1_IRQn;
131133
132- // SysTickは別制御
134+ // SysTickは別制御(NVICで割り込み許可/割り込み禁止を管理していないため)
133135 if (PF_INTERRUPT_PRI_SYSTICK == pri)
134136 {
135137 pf_interrupt_global_restore(enable);
@@ -142,6 +144,7 @@ void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable)
142144 // 特定できた場合のみ、割り込み復元を行う
143145 if (UARTE1_IRQn != irq)
144146 {
147+ // 直前の割り込み禁止状態が割り込み許可の場合のみ
145148 if (0 != enable)
146149 {
147150 NVIC_EnableIRQ(irq);
--- /dev/null
+++ b/nRFHello/src/pf/pf_led.c
@@ -0,0 +1,89 @@
1+//! @file pf_led.c
2+//! @brief プラットフォーム(LED)実装ファイル
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_led.h"
28+
29+//! @brief LED→GPIO IDテーブル
30+static const PF_GPIO_ID pf_led_gpio_table[PF_LED_ID_MAX] =
31+{
32+ PF_GPIO_ID_MAQUEEN_LED_L, //!< PF_LED_ID_MAQUEEN_L
33+ PF_GPIO_ID_MAQUEEN_LED_R, //!< PF_LED_ID_MAQUEEN_R
34+};
35+
36+//! @brief LED情報テーブル
37+static BOOL pf_led_info[PF_LED_ID_MAX] =
38+{
39+ FALSE,
40+ FALSE,
41+};
42+
43+//! @brief LED初期化
44+//! @remarks プラットフォーム初期化処理から呼び出すこと
45+void pf_led_init(void)
46+{
47+ u4 loop;
48+ PF_GPIO_ID gpio;
49+
50+ // オート変数初期化
51+ loop = 0;
52+ gpio = PF_GPIO_ID_MAQUEEN_LED_L;
53+
54+ for (loop = 0; loop < (u4)PF_LED_ID_MAX; loop++)
55+ {
56+ // LED消灯(GPIOに対し'H'レベルで点灯、'L'レベルで消灯)
57+ gpio = pf_led_gpio_table[loop];
58+ pf_gpio_output(gpio, FALSE);
59+
60+ // LED情報を更新
61+ pf_led_info[loop] = FALSE;
62+ }
63+}
64+
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)
69+{
70+ PF_GPIO_ID gpio;
71+
72+ // オート変数初期化
73+ gpio = PF_GPIO_ID_MAQUEEN_LED_L;
74+
75+ // パラメータチェック
76+ if (id < PF_LED_ID_MAX)
77+ {
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+ }
88+ }
89+}
--- /dev/null
+++ b/nRFHello/src/pf/pf_power.c
@@ -0,0 +1,151 @@
1+//! @file pf_power.c
2+//! @brief プラットフォーム(Power)実装ファイル
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_interrupt.h"
29+#include "pf_display.h"
30+#include "pf_systick.h"
31+#include "pf_power.h"
32+
33+//! @brief インタフェースMCU初期化待ちのためのデモ(アニメーション)
34+//! @details NRF_POWER->RESETREAS==0の場合に限り呼び出される。所要時間1000msで設計している
35+static void pf_power_greetings(void)
36+{
37+ u4 base;
38+ u4 freerun;
39+ u4 brightness;
40+ u4 target;
41+
42+ // オート変数初期化
43+ base = pf_systick_freerun();
44+ freerun = base;
45+ brightness = PF_DISPLAY_BRIGHTNESS_MIN;
46+ target = brightness;
47+
48+ // 初期表示
49+ pf_display_brightness(brightness);
50+ pf_display_id(PF_DISPLAY_ID_HAPPY);
51+
52+ // 460msループ(輝度を上げる)
53+ while ((u4)(freerun - base)
54+ <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
55+ {
56+ // 目標輝度を算出
57+ target = (u4) (freerun - base);
58+ target /= 5;
59+ target += PF_DISPLAY_BRIGHTNESS_MIN;
60+
61+ // brightnessと異なったら設定
62+ if (target != brightness)
63+ {
64+ pf_display_brightness(target);
65+ brightness = target;
66+ }
67+
68+ // freerunを再取得
69+ freerun = pf_systick_freerun();
70+ }
71+
72+ // baseを加算
73+ base += ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5);
74+
75+ // 80msループ(輝度を保つ)
76+ while ((u4)(freerun - base) <= 80)
77+ {
78+ // freerunを再取得
79+ freerun = pf_systick_freerun();
80+ }
81+
82+ // baseを加算
83+ base += 80;
84+
85+ // 460msループ(輝度を下げる)
86+ while ((u4) (freerun - base)
87+ <= ((PF_DISPLAY_BRIGHTNESS_MAX - PF_DISPLAY_BRIGHTNESS_MIN) * 5))
88+ {
89+ // 目標輝度を算出
90+ target = (u4) (freerun - base);
91+ target /= 5;
92+ target = PF_DISPLAY_BRIGHTNESS_MAX - target;
93+
94+ // brightnessと異なったら設定
95+ if (target != brightness)
96+ {
97+ pf_display_brightness(target);
98+ brightness = target;
99+ }
100+
101+ // freerunを再取得
102+ freerun = pf_systick_freerun();
103+ }
104+
105+ // 表示OFF
106+ pf_display_off();
107+}
108+
109+//! @brief Power初期化
110+//! @remarks プラットフォーム初期化処理から呼び出すこと
111+//! @attention Display初期化の後で呼び出すこと
112+void pf_power_init(void)
113+{
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;
121+
122+ // 電源電圧低下警告(VDD、VDDHとも2.8Vで警告)
123+ NRF_POWER->POFCON = (POWER_POFCON_POF_Enabled << POWER_POFCON_POF_Pos)
124+ | (POWER_POFCON_THRESHOLD_V28 << POWER_POFCON_THRESHOLD_Pos)
125+ | (POWER_POFCON_THRESHOLDVDDH_V28 << POWER_POFCON_THRESHOLDVDDH_Pos);
126+
127+ // 割り込み設定(2)
128+ NVIC_EnableIRQ(POWER_CLOCK_IRQn);
129+
130+ // パワーオンリセットの場合、インタフェースMCUの起動待ちのためのデモを行う
131+ if (0 == NRF_POWER->RESETREAS)
132+ {
133+ pf_power_greetings();
134+ }
135+}
136+
137+//! @brief Power割り込みハンドラ
138+//! @attention 割り込み発生以降、Displayの動作が×固定になる
139+void POWER_CLOCK_IRQHandler(void)
140+{
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;
148+
149+ // ディスプレイ表示
150+ pf_display_powerdown();
151+}
--- a/nRFHello/src/pf/pf_systick.c
+++ b/nRFHello/src/pf/pf_systick.c
@@ -27,15 +27,14 @@
2727 #include "pf_interrupt.h"
2828 #include "pf_systick.h"
2929
30-//! @brief msカウンタ(フリーラン)
30+//! @brief フリーランカウンタ[ms]
3131 static volatile u4 pf_systick_freerun_ms;
3232
3333 //! @brief 制御周期カウンタ[ms]
3434 static u4 pf_systick_sync_ms;
3535
3636 //! @brief SysTick初期化
37-//! @param なし
38-//! @return なし
37+//! @remarks プラットフォーム初期化処理から呼び出すこと
3938 void pf_systick_init(void)
4039 {
4140 // SysTickタイマを停止
@@ -59,18 +58,14 @@ void pf_systick_init(void)
5958 // ・SysClockタイマ動作
6059 // ・割り込みモードを指定
6160 // ・クロックソースとしてプロセッサクロックを指定
62- SysTick->CTRL =
63- SysTick_CTRL_ENABLE_Msk |
64- SysTick_CTRL_TICKINT_Msk |
65- SysTick_CTRL_CLKSOURCE_Msk;
61+ SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk
62+ | SysTick_CTRL_CLKSOURCE_Msk;
6663
6764 // 制御周期カウンタをクリア
6865 pf_systick_sync_ms = 0;
6966 }
7067
7168 //! @brief 次の制御周期まで待つ
72-//! @param なし
73-//! @return なし
7469 //! @attention グローバル割り込み禁止状態で呼び出さないこと
7570 void pf_systick_sync(void)
7671 {
@@ -100,8 +95,7 @@ void pf_systick_sync(void)
10095 }
10196
10297 //! @brief SysTick時刻を取得
103-//! @param [out] timebuf SysTick時刻報構造体へのポインタ
104-//! @return なし
98+//! @param [out] timebuf SysTick時刻情報構造体へのポインタ
10599 //! @attention グローバル割り込み禁止状態で呼び出さないこと
106100 void pf_systick_time(PF_SYSTICK_TIME *timebuf)
107101 {
@@ -171,7 +165,6 @@ void pf_systick_time(PF_SYSTICK_TIME *timebuf)
171165 }
172166
173167 //! @brief フリーランmsカウンタを取得
174-//! @param なし
175168 //! @return フリーランmsカウンタ(32bit)
176169 u4 pf_systick_freerun(void)
177170 {
@@ -195,8 +188,6 @@ u4 pf_systick_freerun(void)
195188 }
196189
197190 //! @brief SysTick割り込みハンドラ
198-//! @param なし
199-//! @return なし
200191 void SysTick_Handler(void)
201192 {
202193 // 49日と17時間2分47.295秒でラップアラウンドする
--- a/nRFHello/src/pf/pf_timer.c
+++ b/nRFHello/src/pf/pf_timer.c
@@ -71,7 +71,7 @@ typedef struct PF_TIMER_OPERATION_Tag
7171 {
7272 PF_TIMER_CALLBACK callback; //!< コールバック関数
7373 u4 cc[4]; //!< コンペア値
74- BOOL running; //!< 動作中
74+ BOOL running; //!< 動作中フラグ
7575 } PF_TIMER_OPERATION;
7676
7777 //! @brief Timer動作情報テーブル
@@ -241,7 +241,6 @@ static IRQn_Type pf_timer_get_irq(PF_TIMER_ID id)
241241
242242 //! @brief Timer初期化(単一のID)
243243 //! @param [in] id TimerのID
244-//! @return なし
245244 static void pf_timer_init_id(PF_TIMER_ID id)
246245 {
247246 IRQn_Type irq;
@@ -318,8 +317,7 @@ static void pf_timer_init_id(PF_TIMER_ID id)
318317 }
319318
320319 //! @brief Timer初期化
321-//! @param なし
322-//! @return なし
320+//! @remarks プラットフォーム初期化処理から呼び出すこと
323321 void pf_timer_init(void)
324322 {
325323 u4 id;
@@ -337,7 +335,6 @@ void pf_timer_init(void)
337335
338336 //! @brief Timer開始
339337 //! @param [in] id TimerのID
340-//! @return なし
341338 void pf_timer_start(PF_TIMER_ID id)
342339 {
343340 // IDチェック
@@ -360,7 +357,6 @@ void pf_timer_start(PF_TIMER_ID id)
360357
361358 //! @brief Timer停止
362359 //! @param [in] id TimerのID
363-//! @return なし
364360 void pf_timer_stop(PF_TIMER_ID id)
365361 {
366362 // IDチェック
@@ -375,11 +371,10 @@ void pf_timer_stop(PF_TIMER_ID id)
375371 }
376372 }
377373
378-//! @brief コールバック関数設定
374+//! @brief Timerコールバック関数設定
379375 //! @param [in] id TimerのID
380-//! @param [in] func コールバック関数へのポインタ
381-//! @return なし
382-//! @attention コールバック関数は割り込みコンテキストで呼び出される
376+//! @param [in] func Timerコールバック関数へのポインタ
377+//! @attention Timerコールバック関数は割り込みコンテキストで呼び出される
383378 void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func)
384379 {
385380 IRQn_Type irq;
@@ -412,8 +407,7 @@ void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func)
412407
413408 //! @brief Timerコンペアカウンタ設定
414409 //! @param [in] id TimerのID
415-//! @param [in] cc コンペアカウンタ配列へのポインタ
416-//! @return なし
410+//! @param [in] cc コンペアカウンタ配列
417411 void pf_timer_cc(PF_TIMER_ID id, u4 *cc)
418412 {
419413 IRQn_Type irq;
@@ -454,8 +448,7 @@ void pf_timer_cc(PF_TIMER_ID id, u4 *cc)
454448 }
455449
456450 //! @brief 共通割り込みハンドラ
457-//! @param [in] cahannel Timerチャネル(0~4)
458-//! @return なし
451+//! @param [in] channel Timerチャネル(0~4)
459452 static void pf_timer_isr(u4 channel)
460453 {
461454 PF_TIMER_ID id;
@@ -520,7 +513,7 @@ static void pf_timer_isr(u4 channel)
520513 pf_timer_table[id].dev->EVENTS_COMPARE[0] = clear;
521514 }
522515
523- // コールバック関数が登録されていれば、呼び出す
516+ // Timerコールバック関数が登録されていれば、呼び出す
524517 if (NULL != pf_timer_status[id].callback)
525518 {
526519 pf_timer_status[id].callback(compare);
@@ -529,8 +522,6 @@ static void pf_timer_isr(u4 channel)
529522 }
530523
531524 //! @brief Timer0割り込みハンドラ
532-//! @param なし
533-//! @return なし
534525 //! @attention データ競合(割り込み干渉)に注意する
535526 void TIMER0_IRQHandler(void)
536527 {
@@ -538,8 +529,6 @@ void TIMER0_IRQHandler(void)
538529 }
539530
540531 //! @brief Timer1割り込みハンドラ
541-//! @param なし
542-//! @return なし
543532 //! @attention データ競合(割り込み干渉)に注意する
544533 void TIMER1_IRQHandler(void)
545534 {
@@ -547,8 +536,6 @@ void TIMER1_IRQHandler(void)
547536 }
548537
549538 //! @brief Timer2割り込みハンドラ
550-//! @param なし
551-//! @return なし
552539 //! @attention データ競合(割り込み干渉)に注意する
553540 void TIMER2_IRQHandler(void)
554541 {
@@ -556,8 +543,6 @@ void TIMER2_IRQHandler(void)
556543 }
557544
558545 //! @brief Timer3割り込みハンドラ
559-//! @param なし
560-//! @return なし
561546 //! @attention データ競合(割り込み干渉)に注意する
562547 void TIMER3_IRQHandler(void)
563548 {
@@ -565,8 +550,6 @@ void TIMER3_IRQHandler(void)
565550 }
566551
567552 //! @brief Timer4割り込みハンドラ
568-//! @param なし
569-//! @return なし
570553 //! @attention データ競合(割り込み干渉)に注意する
571554 void TIMER4_IRQHandler(void)
572555 {
--- a/nRFHello/src/pf/pf_uart.c
+++ b/nRFHello/src/pf/pf_uart.c
@@ -34,12 +34,12 @@
3434 #include "pf_uart.h"
3535
3636 //! @brief バッファサイズ(2の倍数とすること)
37-#define PF_UART_BUF_BYTES 0x1000
37+#define PF_UART_BUF_BYTES (0x1000)
3838
3939 //! @brief 受信除外文字(この文字は受信できない)
4040 #define PF_UART_EMPTY_CODE ((u1)0xFFU)
4141
42-//! @brief エラー情報構造体
42+//! @brief UARTエラー情報構造体
4343 typedef struct PF_UART_ERROR_Tag
4444 {
4545 u4 overrun_count; //!< オーバーランエラー発生回数
@@ -48,10 +48,10 @@ typedef struct PF_UART_ERROR_Tag
4848 u4 brk_count; //!< ブレーク条件発生回数
4949 } PF_UART_ERROR;
5050
51-//! @brief エラー情報本体
51+//! @brief UARTエラー情報本体
5252 static PF_UART_ERROR pf_uart_error;
5353
54-//! @brief バッファ管理構造体
54+//! @brief UARTバッファ管理構造体
5555 typedef struct PF_UART_BUF_Tag
5656 {
5757 u4 read_pos; //!< 読み取り位置
@@ -63,23 +63,22 @@ typedef struct PF_UART_BUF_Tag
6363 u1 buf[PF_UART_BUF_BYTES]; //!< リングバッファ
6464 } PF_UART_BUF;
6565
66-//! @brief バッファID
66+//! @brief UARTバッファのID
6767 typedef enum PF_UART_BUF_ID_Tag
6868 {
6969 PF_UART_BUF_ID_TXD = 0, //!< 送信バッファ
7070 PF_UART_BUF_ID_RXD, //!< 受信バッファ
71- PF_UART_BUF_ID_MAX, //!< ID最大数
71+ PF_UART_BUF_ID_MAX, //!< (IDの個数を表す)
7272 } PF_UART_BUF_ID;
7373
74-//! @brief バッファ本体
74+//! @brief UARTバッファ本体
7575 static PF_UART_BUF pf_uart_buf[PF_UART_BUF_ID_MAX];
7676
7777 //! @brief DMAバッファ本体
7878 static u1 pf_uart_dma[PF_UART_BUF_BYTES];
7979
80-//! @brief バッファ初期化
81-//! @param なし
82-//! @return なし
80+//! @brief UARTバッファ初期化
81+//! @param [in] id UARTバッファのID
8382 static void pf_uart_init_buf(PF_UART_BUF_ID id)
8483 {
8584 pf_uart_buf[id].read_pos = 0;
@@ -91,8 +90,6 @@ static void pf_uart_init_buf(PF_UART_BUF_ID id)
9190 }
9291
9392 //! @brief DMAバッファ初期化
94-//! @param なし
95-//! @return なし
9693 static void pf_uart_init_dma(void)
9794 {
9895 u4 loop;
@@ -108,8 +105,6 @@ static void pf_uart_init_dma(void)
108105 }
109106
110107 //! @brief UART送信ポーリング
111-//! @param なし
112-//! @return なし
113108 //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される
114109 static void pf_uart_poll_txd(void)
115110 {
@@ -156,8 +151,6 @@ static void pf_uart_poll_txd(void)
156151 }
157152
158153 //! @brief UART受信ポーリング
159-//! @param なし
160-//! @return なし
161154 //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される
162155 static void pf_uart_poll_rxd(void)
163156 {
@@ -177,7 +170,7 @@ static void pf_uart_poll_rxd(void)
177170 pf_uart_buf[PF_UART_BUF_ID_RXD].write_pos &=
178171 (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1);
179172
180- // valid_bytesのカウントアップ
173+ // valid_bytesをインクリメント
181174 pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes++;
182175 }
183176 else
@@ -198,8 +191,7 @@ static void pf_uart_poll_rxd(void)
198191 }
199192
200193 //! @brief UART初期化
201-//! @param なし
202-//! @return なし
194+//! @remarks プラットフォーム初期化処理から呼び出すこと
203195 //! @attention GPIO初期化の後で呼び出すこと
204196 void pf_uart_init(void)
205197 {
@@ -220,8 +212,7 @@ void pf_uart_init(void)
220212 NRF_UARTE0->INTEN = (UARTE_INTEN_ENDRX_Enabled << UARTE_INTEN_ENDRX_Pos)
221213 | (UARTE_INTEN_ENDTX_Enabled << UARTE_INTEN_ENDTX_Pos)
222214 | (UARTE_INTEN_ERROR_Enabled << UARTE_INTEN_ERROR_Pos)
223- | (UARTE_INTEN_RXSTARTED_Enabled << UARTE_INTEN_RXSTARTED_Pos)
224- | (UARTE_INTEN_TXSTARTED_Enabled << UARTE_INTEN_TXSTARTED_Pos);
215+ | (UARTE_INTEN_RXSTARTED_Enabled << UARTE_INTEN_RXSTARTED_Pos);
225216
226217 // 割り込み設定
227218 NVIC_SetPriority(UARTE0_UART0_IRQn, PF_INTERRUPT_PRI_UART);
@@ -278,8 +269,7 @@ void pf_uart_init(void)
278269 }
279270
280271 //! @brief UART定期タスク
281-//! @param なし
282-//! @return なし
272+//! @remarks 定期タスク(出力系)処理から呼び出すこと
283273 void pf_uart_task(void)
284274 {
285275 u4 enable;
@@ -301,7 +291,6 @@ void pf_uart_task(void)
301291 //! @brief UART送信
302292 //! @param [in] buf 送信バッファへのポインタ
303293 //! @param [in] bytes 送信バイト数
304-//! @return なし
305294 void pf_uart_send(const u1 *buf, u4 bytes)
306295 {
307296 u4 enable;
@@ -331,7 +320,7 @@ void pf_uart_send(const u1 *buf, u4 bytes)
331320 pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos &=
332321 (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf) - 1);
333322
334- // valid_bytesのカウントアップ
323+ // valid_bytesをインクリメント
335324 pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes++;
336325 }
337326 else
@@ -351,10 +340,83 @@ void pf_uart_send(const u1 *buf, u4 bytes)
351340 }
352341 }
353342
343+//! @brief UART受信
344+//! @param [out] buf 受信バッファへのポインタ
345+//! @param [in] bytes 受信バッファの最大数
346+//! @return 受信したバイト数
347+u4 pf_uart_recv(u1 *buf, u4 bytes)
348+{
349+ u4 enable;
350+ u4 recv;
351+
352+ // オート変数初期化
353+ enable = 0;
354+ recv = 0;
355+
356+ // パラメータチェック
357+ if ((NULL != buf) && (bytes > 0))
358+ {
359+ // UART割り込み禁止
360+ enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_UART);
361+
362+ // 全てのバイト数を処理し終わるまで
363+ while ((recv < bytes)
364+ && (pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes > 0))
365+ {
366+ // 受信バッファへ1バイト転送
367+ *buf = pf_uart_buf[PF_UART_BUF_ID_RXD].buf[pf_uart_buf[PF_UART_BUF_ID_RXD].read_pos];
368+ buf++;
369+
370+ // read_posを進める
371+ 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);
374+
375+ // valid_bytesをデクリメント
376+ pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes--;
377+
378+ // 受信したバイト数をインクリメント
379+ recv++;
380+ }
381+
382+ // UART割り込み復元
383+ pf_interrupt_local_restore(PF_INTERRUPT_PRI_UART, enable);
384+ }
385+
386+ return recv;
387+}
388+
389+//! @brief UART1文字出力
390+//! @param [in] ch 送信する文字(0xFF以外)
391+void pf_uart_putc(u1 ch)
392+{
393+ // 受信除外文字でない場合
394+ if (PF_UART_EMPTY_CODE != ch)
395+ {
396+ // UART送信
397+ pf_uart_send(&ch, 1);
398+ }
399+}
400+
401+//! @brief UART1文字入力
402+//! @return 受信した文字(受信していない場合、0xFF)
403+u1 pf_uart_getc(void)
404+{
405+ u1 ch;
406+
407+ // オート変数初期化
408+ ch = PF_UART_EMPTY_CODE;
409+
410+ // UART受信(戻り値は捨てる)
411+ (void)pf_uart_recv(&ch, 1);
412+
413+ // 受信バッファが空の場合、chは変化しない
414+ return ch;
415+}
416+
354417 //! @brief システム時間のフォーマット
355418 //! @param [out] buf 格納バッファ
356419 //! @param [in] format printf形式の書式指定文字列
357-//! @return なし
358420 //! @attention グローバル割り込み禁止状態で呼び出さないこと
359421 static void pf_uart_log_time(char *buf, const char *format, ...)
360422 {
@@ -370,9 +432,8 @@ static void pf_uart_log_time(char *buf, const char *format, ...)
370432 va_end(ap);
371433 }
372434
373-//! @brief UARTログ
374-//! @param [in] format printf形式の書式指定文字列(末尾の改行は不要)
375-//! @return なし
435+//! @brief UARTログ出力
436+//! @param [in] format printf形式の書式指定文字列(末尾の改行はあってもなくてもよい)
376437 //! @attention グローバル割り込み禁止状態で呼び出さないこと
377438 void pf_uart_log(const char *format, ...)
378439 {
@@ -398,9 +459,16 @@ void pf_uart_log(const char *format, ...)
398459 timebuf.us);
399460
400461 // 本体のフォーマット
401- bytes = (u4)vsnprintf(&buf[14], sizeof(buf) - 16, format, ap);
462+ bytes = (u4) vsnprintf(&buf[14], sizeof(buf) - 16, format, ap);
402463 bytes += 14;
403464
465+ // 末尾に改行文字があるか?
466+ if (buf[bytes - 1] == '\n')
467+ {
468+ // 改行文字を削る
469+ bytes--;
470+ }
471+
404472 // 改行文字を追加
405473 buf[bytes] = '\r';
406474 bytes++;
@@ -414,22 +482,7 @@ void pf_uart_log(const char *format, ...)
414482 va_end(ap);
415483 }
416484
417-//! @brief UART割り込みハンドラ(ENDRX)
418-//! @param なし
419-//! @return なし
420-//! @attention データ競合(割り込み干渉)に注意する
421-static void pf_uart_intr_endrx(void)
422-{
423- // 1回のUART受信が終了した
424- pf_uart_buf[PF_UART_BUF_ID_RXD].uart_process_count--;
425-
426- // 通常コンテキストの動作と同一
427- pf_uart_poll_rxd();
428-}
429-
430485 //! @brief UART割り込みハンドラ(ENDTX)
431-//! @param なし
432-//! @return なし
433486 //! @attention データ競合(割り込み干渉)に注意する
434487 static void pf_uart_intr_endtx(void)
435488 {
@@ -448,8 +501,6 @@ static void pf_uart_intr_endtx(void)
448501 }
449502
450503 //! @brief UART割り込みハンドラ(ERROR)
451-//! @param なし
452-//! @return なし
453504 //! @attention データ競合(割り込み干渉)に注意する
454505 static void pf_uart_intr_error(void)
455506 {
@@ -485,7 +536,7 @@ static void pf_uart_intr_error(void)
485536 pf_uart_error.framing_count++;
486537 }
487538
488- // ブレーク条件
539+ // ブレーク信号受信
489540 if (brk == (NRF_UARTE0->ERRORSRC & brk))
490541 {
491542 NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_BREAK_Msk);
@@ -494,8 +545,6 @@ static void pf_uart_intr_error(void)
494545 }
495546
496547 //! @brief UART割り込みハンドラ(RXSTARTED)
497-//! @param なし
498-//! @return なし
499548 //! @attention データ競合(割り込み干渉)に注意する
500549 static void pf_uart_intr_rxstarted(void)
501550 {
@@ -510,9 +559,21 @@ static void pf_uart_intr_rxstarted(void)
510559 }
511560 }
512561
562+//! @brief UART割り込みハンドラ(ENDRX)
563+//! @attention データ競合(割り込み干渉)に注意する
564+static void pf_uart_intr_endrx(void)
565+{
566+ // 受信バッファの再セット
567+ pf_uart_intr_rxstarted();
568+
569+ // 1回のUART受信が終了した
570+ pf_uart_buf[PF_UART_BUF_ID_RXD].uart_process_count--;
571+
572+ // 通常コンテキストの動作と同一
573+ pf_uart_poll_rxd();
574+}
575+
513576 //! @brief UART割り込みハンドラ
514-//! @param なし
515-//! @return なし
516577 //! @attention データ競合(割り込み干渉)に注意する
517578 void UARTE0_UART0_IRQHandler(void)
518579 {
@@ -549,21 +610,8 @@ void UARTE0_UART0_IRQHandler(void)
549610 == NRF_UARTE0->EVENTS_RXSTARTED)
550611 {
551612 NRF_UARTE0->EVENTS_RXSTARTED =
552- UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_NotGenerated
553- << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos;
613+ UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_NotGenerated
614+ << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos;
554615 pf_uart_intr_rxstarted();
555616 }
556-
557- // TXSTARTED
558- if ((UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Generated
559- << UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos)
560- == NRF_UARTE0->EVENTS_TXSTARTED)
561- {
562- NRF_UARTE0->EVENTS_TXSTARTED =
563- UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_NotGenerated
564- << UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos;
565-
566- // 通常コンテキストの動作と同一
567- pf_uart_poll_txd();
568- }
569617 }
--- a/nRFHello/system/src/cmsis/system_nrf52.c
+++ b/nRFHello/system/src/cmsis/system_nrf52.c
@@ -33,6 +33,9 @@ NOTICE: This file has been modified by Nordic Semiconductor ASA.
3333
3434 #define __SYSTEM_CLOCK_64M (64000000UL)
3535
36+// for -Wmissing-prototypes
37+void nvmc_wait(void);
38+void nvmc_config(uint32_t mode);
3639
3740 #if defined ( __CC_ARM )
3841 uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_64M;