C言語でBBC micro:bit V2およびDFRobot micro:Maqueenを操作する
Révision | 8dfcf52eb888ed174904faf84211039437528a17 (tree) |
---|---|
l'heure | 2023-09-03 13:58:53 |
Auteur | xm6_original <tanaka_yasushi2008@yaho...> |
Commiter | xm6_original |
電源制御・ボタン制御・LED制御
@@ -45,6 +45,17 @@ | ||
45 | 45 | <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"/> |
46 | 46 | <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.9180516" name="ビルド・コマンド" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" value="make" valueType="string"/> |
47 | 47 | <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"/> | |
48 | 59 | <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"/> |
49 | 60 | <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"/> |
50 | 61 | <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 @@ | ||
73 | 84 | <listOptionValue builtIn="false" value="OS_USE_TRACE_SEMIHOSTING_STDOUT"/> |
74 | 85 | <listOptionValue builtIn="false" value="NRF52833_XXAA"/> |
75 | 86 | </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"/> | |
76 | 91 | <inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.59146624" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/> |
77 | 92 | </tool> |
78 | 93 | <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 @@ | ||
303 | 318 | <storageModule moduleId="cdtBuildSystem" version="4.0.0"> |
304 | 319 | <project id="nRFHello.ilg.gnuarmeclipse.managedbuild.cross.target.elf.758015270" name="実行可能" projectType="ilg.gnuarmeclipse.managedbuild.cross.target.elf"/> |
305 | 320 | </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> | |
315 | 321 | <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> |
316 | 322 | <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> |
317 | 323 | <storageModule moduleId="refreshScope" versionNumber="2"> |
@@ -323,4 +329,16 @@ | ||
323 | 329 | </configuration> |
324 | 330 | </storageModule> |
325 | 331 | <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> | |
326 | 344 | </cproject> |
\ No newline at end of file |
@@ -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 |
@@ -28,8 +28,8 @@ | ||
28 | 28 | #include "pf_types.h" |
29 | 29 | |
30 | 30 | //! @brief Clock初期化 |
31 | -//! @param なし | |
32 | -//! @return なし | |
31 | +//! @details X1(32MHz)から生成される64MHzクリスタルオシレータ(HFXO)を有効にする | |
32 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
33 | 33 | void pf_clock_init(void); |
34 | 34 | |
35 | 35 | #endif // PF_CLOCK_H |
@@ -27,25 +27,82 @@ | ||
27 | 27 | |
28 | 28 | #include "pf_types.h" |
29 | 29 | |
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 | + | |
30 | 79 | //! @brief Display初期化 |
31 | -//! @param なし | |
32 | -//! @return Timer初期化の後で呼び出すこと | |
80 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
81 | +//! @attention GPIO初期化およびTimer初期化の後に呼び出すこと | |
33 | 82 | void pf_display_init(void); |
34 | 83 | |
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); | |
39 | 95 | |
40 | 96 | //! @brief Display停止 |
41 | -//! @param なし | |
42 | -//! @return なし | |
43 | 97 | void pf_display_off(void); |
44 | 98 | |
45 | 99 | //! @brief Display明るさ指定 |
46 | -//! @param 明るさ(5~95) | |
47 | -//! @return なし | |
100 | +//! @param [in] brightness 明るさ(PF_DISPLAY_BRIGHTNESS_MIN~PF_DISPLAY_BRIGHTNESS_MAX) | |
48 | 101 | //! @attention 範囲外の値は設定禁止 |
49 | 102 | void pf_display_brightness(u4 brightness); |
50 | 103 | |
104 | +//! @brief Display表示(電圧低下) | |
105 | +//! @attention これ以降、Display系のAPIは使用できない | |
106 | +void pf_display_powerdown(void); | |
107 | + | |
51 | 108 | #endif // PF_DISPLAY_H |
@@ -42,12 +42,15 @@ typedef enum PF_GPIO_ID_Tag | ||
42 | 42 | PF_GPIO_ID_COL3, //!< Display COL3 |
43 | 43 | PF_GPIO_ID_COL4, //!< Display COL4 |
44 | 44 | 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 | |
46 | 50 | } PF_GPIO_ID; |
47 | 51 | |
48 | 52 | //! @brief GPIO初期化 |
49 | -//! @param なし | |
50 | -//! @return なし | |
53 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
51 | 54 | void pf_gpio_init(void); |
52 | 55 | |
53 | 56 | //! @brief GPIOポート番号を取得 |
@@ -60,10 +63,14 @@ u4 pf_gpio_get_port(PF_GPIO_ID id); | ||
60 | 63 | //! @return GPIOピン番号(0~31) |
61 | 64 | u4 pf_gpio_get_pin(PF_GPIO_ID id); |
62 | 65 | |
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 | + | |
63 | 71 | //! @brief GPIOへ出力 |
64 | 72 | //! @param [in] id GPIOピンのID |
65 | 73 | //! @param [in] level 出力レベル |
66 | -//! @return なし | |
67 | 74 | void pf_gpio_output(PF_GPIO_ID id, BOOL level); |
68 | 75 | |
69 | 76 | #endif // PF_GPIO_H |
@@ -27,22 +27,21 @@ | ||
27 | 27 | |
28 | 28 | #include "pf_types.h" |
29 | 29 | |
30 | -//! @brief 割り込み優先度 | |
30 | +//! @brief 割り込み優先度(最大8レベル。レベル0が最も高く、レベル7が最も低い) | |
31 | 31 | typedef enum PF_INTERRUPT_PRI_Tag |
32 | 32 | { |
33 | 33 | PF_INTERRUPT_PRI_SYSTICK = 0, //!< SysTick |
34 | + PF_INTERRUPT_PRI_POWER, //!< Power | |
34 | 35 | PF_INTERRUPT_PRI_UART, //!< UART |
35 | - PF_INTERRUPT_PRI_DISPLAY_TIMER, //!< ディスプレイタイマ | |
36 | + PF_INTERRUPT_PRI_DISPLAY_TIMER, //!< Display Timer | |
36 | 37 | } PF_INTERRUPT_PRI; |
37 | 38 | |
38 | 39 | //! @brief グローバル割り込み禁止 |
39 | -//! @param なし | |
40 | 40 | //! @return 直前のグローバル割り込み禁止状態(1:割り込み禁止/0:割り込み許可) |
41 | 41 | u4 pf_interrupt_global_disable(void); |
42 | 42 | |
43 | 43 | //! @brief グローバル割り込み復元 |
44 | 44 | //! @param [in] primask pf_interrupt_global_disable()の返り値 |
45 | -//! @return なし | |
46 | 45 | void pf_interrupt_global_restore(u4 primask); |
47 | 46 | |
48 | 47 | //! @brief ローカル割り込み禁止 |
@@ -52,8 +51,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri); | ||
52 | 51 | |
53 | 52 | //! @brief ローカル割り込み復元 |
54 | 53 | //! @param [in] pri 割り込み優先度 |
55 | -//! @param [in] enable pf_interrupt_local_disable(id)の返り値 | |
56 | -//! @return なし | |
54 | +//! @param [in] enable pf_interrupt_local_disable(pri)の返り値 | |
57 | 55 | void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable); |
58 | 56 | |
59 | 57 | #endif // PF_INTERRUPT_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 |
@@ -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 |
@@ -39,30 +39,23 @@ typedef struct PF_SYSTICK_TIME_Tag | ||
39 | 39 | } PF_SYSTICK_TIME; |
40 | 40 | |
41 | 41 | //! @brief SysTick初期化 |
42 | -//! @param なし | |
43 | -//! @return なし | |
42 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
44 | 43 | void pf_systick_init(void); |
45 | 44 | |
46 | 45 | //! @brief 次の制御周期まで待つ |
47 | -//! @param なし | |
48 | -//! @return なし | |
49 | 46 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
50 | 47 | void pf_systick_sync(void); |
51 | 48 | |
52 | 49 | //! @brief SysTick時刻を取得 |
53 | -//! @param [out] timebuf SysTick時刻報構造体へのポインタ | |
54 | -//! @return なし | |
50 | +//! @param [out] timebuf SysTick時刻情報構造体へのポインタ | |
55 | 51 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
56 | 52 | void pf_systick_time(PF_SYSTICK_TIME *timebuf); |
57 | 53 | |
58 | 54 | //! @brief フリーランmsカウンタを取得 |
59 | -//! @param なし | |
60 | 55 | //! @return フリーランmsカウンタ(32bit) |
61 | 56 | u4 pf_systick_freerun(void); |
62 | 57 | |
63 | 58 | //! @brief SysTick割り込みハンドラ |
64 | -//! @param なし | |
65 | -//! @return なし | |
66 | 59 | void SysTick_Handler(void); |
67 | 60 | |
68 | 61 | #endif // PF_SYSTICK_H |
@@ -30,71 +30,57 @@ | ||
30 | 30 | //! @brief us→コンペア値変換 |
31 | 31 | #define MICROSEC_TO_TIMERCC(us) (us) |
32 | 32 | |
33 | +//! @brief Timerコールバック関数 | |
34 | +//! @param [in] eventbit イベントビットパターン | |
35 | +typedef void (*PF_TIMER_CALLBACK)(u4 eventbit); | |
36 | + | |
33 | 37 | //! @brief TimerのID |
34 | 38 | typedef enum PF_TIMER_ID_Tag |
35 | 39 | { |
36 | - PF_TIMER_ID_DISPLAY, //!< ディスプレイタイマ | |
37 | - PF_TIMER_ID_MAX //!< ID最大数 | |
40 | + PF_TIMER_ID_DISPLAY = 0, //!< ディスプレイタイマ | |
41 | + PF_TIMER_ID_MAX //!< (IDの個数を表す) | |
38 | 42 | } PF_TIMER_ID; |
39 | 43 | |
40 | -//! @brief コールバック関数 | |
41 | -typedef void (*PF_TIMER_CALLBACK)(u4 eventbit); | |
42 | - | |
43 | 44 | //! @brief Timer初期化 |
44 | -//! @param なし | |
45 | -//! @return なし | |
45 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
46 | 46 | void pf_timer_init(void); |
47 | 47 | |
48 | 48 | //! @brief Timer開始 |
49 | 49 | //! @param [in] id TimerのID |
50 | -//! @return なし | |
51 | 50 | void pf_timer_start(PF_TIMER_ID id); |
52 | 51 | |
53 | 52 | //! @brief Timer停止 |
54 | 53 | //! @param [in] id TimerのID |
55 | -//! @return なし | |
56 | 54 | void pf_timer_stop(PF_TIMER_ID id); |
57 | 55 | |
58 | 56 | //! @brief Timerコンペアカウンタ設定 |
59 | 57 | //! @param [in] id TimerのID |
60 | -//! @param [in] cc コンペアカウンタ配列へのポインタ | |
61 | -//! @return なし | |
58 | +//! @param [in] cc コンペアカウンタ配列 | |
62 | 59 | void pf_timer_cc(PF_TIMER_ID id, u4 *cc); |
63 | 60 | |
64 | -//! @brief コールバック関数設定 | |
61 | +//! @brief Timerコールバック関数設定 | |
65 | 62 | //! @param [in] id TimerのID |
66 | -//! @param [in] func コールバック関数へのポインタ | |
67 | -//! @return なし | |
68 | -//! @attention コールバック関数は割り込みコンテキストで呼び出される | |
63 | +//! @param [in] func Timerコールバック関数へのポインタ | |
64 | +//! @attention Timerコールバック関数は割り込みコンテキストで呼び出される | |
69 | 65 | void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func); |
70 | 66 | |
71 | 67 | //! @brief Timer0割り込みハンドラ |
72 | -//! @param なし | |
73 | -//! @return なし | |
74 | 68 | //! @attention データ競合(割り込み干渉)に注意する |
75 | 69 | void TIMER0_IRQHandler(void); |
76 | 70 | |
77 | 71 | //! @brief Timer1割り込みハンドラ |
78 | -//! @param なし | |
79 | -//! @return なし | |
80 | 72 | //! @attention データ競合(割り込み干渉)に注意する |
81 | 73 | void TIMER1_IRQHandler(void); |
82 | 74 | |
83 | 75 | //! @brief Timer2割り込みハンドラ |
84 | -//! @param なし | |
85 | -//! @return なし | |
86 | 76 | //! @attention データ競合(割り込み干渉)に注意する |
87 | 77 | void TIMER2_IRQHandler(void); |
88 | 78 | |
89 | 79 | //! @brief Timer3割り込みハンドラ |
90 | -//! @param なし | |
91 | -//! @return なし | |
92 | 80 | //! @attention データ競合(割り込み干渉)に注意する |
93 | 81 | void TIMER3_IRQHandler(void); |
94 | 82 | |
95 | 83 | //! @brief Timer4割り込みハンドラ |
96 | -//! @param なし | |
97 | -//! @return なし | |
98 | 84 | //! @attention データ競合(割り込み干渉)に注意する |
99 | 85 | void TIMER4_IRQHandler(void); |
100 | 86 |
@@ -1,6 +1,26 @@ | ||
1 | 1 | //! @file pf_types.h |
2 | 2 | //! @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. | |
4 | 24 | |
5 | 25 | #ifndef PF_TYPES_H |
6 | 26 | #define PF_TYPES_H |
@@ -22,7 +42,7 @@ typedef _Bool BOOL; | ||
22 | 42 | //! 論理型(FALSE) |
23 | 43 | #define FALSE (0) |
24 | 44 | |
25 | -// NULLポインタ | |
45 | +//! NULLポインタ | |
26 | 46 | #ifndef NULL |
27 | 47 | #define NULL ((void*)0) |
28 | 48 | #endif // NULL |
@@ -28,31 +28,39 @@ | ||
28 | 28 | #include "pf_types.h" |
29 | 29 | |
30 | 30 | //! @brief UART初期化 |
31 | -//! @param なし | |
32 | -//! @return なし | |
31 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
33 | 32 | //! @attention GPIO初期化の後で呼び出すこと |
34 | 33 | void pf_uart_init(void); |
35 | 34 | |
36 | 35 | //! @brief UART定期タスク |
37 | -//! @param なし | |
38 | -//! @return なし | |
36 | +//! @remarks 定期タスク(出力系)処理から呼び出すこと | |
39 | 37 | void pf_uart_task(void); |
40 | 38 | |
41 | 39 | //! @brief UART送信 |
42 | 40 | //! @param [in] buf 送信バッファへのポインタ |
43 | 41 | //! @param [in] bytes 送信バイト数 |
44 | -//! @return なし | |
45 | 42 | void pf_uart_send(const u1 *buf, u4 bytes); |
46 | 43 | |
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形式の書式指定文字列(末尾の改行はあってもなくてもよい) | |
50 | 60 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
51 | 61 | void pf_uart_log(const char *format, ...); |
52 | 62 | |
53 | 63 | //! @brief UART割り込みハンドラ |
54 | -//! @param なし | |
55 | -//! @return なし | |
56 | 64 | //! @attention データ競合(割り込み干渉)に注意する |
57 | 65 | void UARTE0_UART0_IRQHandler(void); |
58 | 66 |
@@ -29,96 +29,112 @@ | ||
29 | 29 | #include "pf_timer.h" |
30 | 30 | #include "pf_uart.h" |
31 | 31 | #include "pf_display.h" |
32 | +#include "pf_power.h" | |
33 | +#include "pf_button.h" | |
34 | +#include "pf_led.h" | |
32 | 35 | |
33 | - | |
34 | -static void greetings(void) | |
36 | +//! @brief プラットフォーム初期化 | |
37 | +//! @attention 初期化順序に注意する | |
38 | +static void pf_init(void) | |
35 | 39 | { |
36 | - u4 brightness; | |
37 | - u4 loop; | |
38 | - u4 freerun[2]; | |
40 | + // Phase1: クロックをHFXO(外部発振子)に切り替える | |
41 | + pf_clock_init(); | |
39 | 42 | |
40 | - freerun[0] = pf_systick_freerun(); | |
43 | + // Phase2: 低位モジュールを初期化する | |
44 | + pf_gpio_init(); | |
45 | + pf_systick_init(); | |
46 | + pf_timer_init(); | |
41 | 47 | |
48 | + // Phase3: 中位モジュール(低位モジュールに依存するモジュール)を初期化する | |
49 | + pf_uart_init(); | |
50 | + pf_display_init(); | |
42 | 51 | |
43 | - // オート変数初期化 | |
44 | - loop = 0; | |
45 | - brightness = 5; | |
52 | + // Phase4: その他のモジュールを初期化する | |
53 | + pf_power_init(); | |
54 | + pf_button_init(); | |
55 | + pf_led_init(); | |
56 | +} | |
46 | 57 | |
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 | +} | |
50 | 63 | |
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 | +} | |
55 | 69 | |
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); | |
59 | 80 | |
60 | - // 500ms待機 | |
61 | - for (loop = 0; loop < 50; loop++) | |
81 | + if (button_now[0] != button_prev[0]) | |
62 | 82 | { |
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 | + } | |
64 | 98 | } |
65 | 99 | |
66 | - // 5になるまで下げる | |
67 | - while (brightness >= 5) | |
100 | + if (button_now[1] != button_prev[1]) | |
68 | 101 | { |
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 | + } | |
73 | 112 | } |
74 | 113 | |
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]; | |
81 | 116 | } |
82 | 117 | |
118 | +//! @brief メインプログラム | |
119 | +//! @remarks マイコンリセット後、startup.cの_start()に制御が移り、その後main()が呼び出される | |
83 | 120 | int main(void) |
84 | 121 | { |
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(); | |
106 | 124 | |
125 | + // 無限ループ | |
107 | 126 | while (1) |
108 | 127 | { |
128 | + // 制御周期まで待つ | |
109 | 129 | pf_systick_sync(); |
110 | - pf_uart_task(); | |
111 | 130 | |
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(); | |
122 | 136 | |
137 | + // 定期タスク(出力系) | |
138 | + pf_output_task(); | |
123 | 139 | } |
124 | 140 | } |
@@ -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 | +} |
@@ -28,8 +28,8 @@ | ||
28 | 28 | #include "pf_clock.h" |
29 | 29 | |
30 | 30 | //! @brief Clock初期化 |
31 | -//! @param なし | |
32 | -//! @return なし | |
31 | +//! @details X1(32MHz)から生成される64MHzクリスタルオシレータ(HFXO)を有効にする | |
32 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
33 | 33 | void pf_clock_init(void) |
34 | 34 | { |
35 | 35 | // X1クロック(32MHz)有効イベントをクリア |
@@ -28,13 +28,7 @@ | ||
28 | 28 | #include "pf_timer.h" |
29 | 29 | #include "pf_display.h" |
30 | 30 | |
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テーブル | |
38 | 32 | static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] = |
39 | 33 | { |
40 | 34 | PF_GPIO_ID_ROW1, //!< ROW1 |
@@ -44,7 +38,7 @@ static const PF_GPIO_ID pf_display_row_to_id[PF_DISPLAY_ROW_MAX] = | ||
44 | 38 | PF_GPIO_ID_ROW5, //!< ROW5 |
45 | 39 | }; |
46 | 40 | |
47 | -// @brief 列→GPIO IDテーブル | |
41 | +//! @brief 列→GPIO IDテーブル | |
48 | 42 | static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] = |
49 | 43 | { |
50 | 44 | PF_GPIO_ID_COL1, //!< COL1 |
@@ -57,9 +51,9 @@ static const PF_GPIO_ID pf_display_col_to_id[PF_DISPLAY_COL_MAX] = | ||
57 | 51 | //! @brief Display情報構造体 |
58 | 52 | typedef struct PF_DISPLAY_INFO_Tag |
59 | 53 | { |
60 | - char ch; //!< 表示キャラクタ | |
61 | 54 | BOOL active; //!< アクティブフラグ |
62 | 55 | BOOL on; //!< 表示ON/OFFフラグ |
56 | + BOOL force; //!< 強制固定フラグ | |
63 | 57 | u4 row; //!< 現在の行(0~4) |
64 | 58 | BOOL cols[PF_DISPLAY_ROW_MAX][PF_DISPLAY_COL_MAX]; //!< 列の設定情報 |
65 | 59 | } PF_DISPLAY_INFO; |
@@ -67,7 +61,7 @@ typedef struct PF_DISPLAY_INFO_Tag | ||
67 | 61 | //! @brief Display情報 |
68 | 62 | static PF_DISPLAY_INFO pf_display_info; |
69 | 63 | |
70 | -//! @brief micro:bit標準フォント(pendolino3) | |
64 | +//! @brief micro:bit標準フォント(pendolino3) from codal-core(BitmapFont.cpp) | |
71 | 65 | static const u1 pf_display_pendolino3[96][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MAX] = |
72 | 66 | { |
73 | 67 | // 0x20( ) |
@@ -925,19 +919,211 @@ static const u1 pf_display_pendolino3[96][PF_DISPLAY_ROW_MAX * PF_DISPLAY_COL_MA | ||
925 | 919 | 0, 0, 0, 0, 0, |
926 | 920 | }, |
927 | 921 | |
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 | |
929 | 936 | { |
930 | 937 | 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, | |
931 | 957 | 0, 0, 0, 0, 0, |
932 | 958 | 1, 0, 0, 0, 1, |
933 | 959 | 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, | |
934 | 1085 | 0, 0, 0, 0, 0, |
935 | 1086 | }, |
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 | + }, | |
936 | 1123 | }; |
937 | 1124 | |
938 | 1125 | //! @brief Timerコールバック |
939 | -//! @param イベントビット(bit0:消灯タイミング bit1:点灯タイミング) | |
940 | -//! @return なし | |
1126 | +//! @param [in] eventbit イベントビットパターン(bit0:消灯タイミング bit1:点灯タイミング) | |
941 | 1127 | //! @attention Timer割り込みコンテキストで実行される |
942 | 1128 | static void pf_display_callback(u4 eventbit) |
943 | 1129 | { |
@@ -975,7 +1161,7 @@ static void pf_display_callback(u4 eventbit) | ||
975 | 1161 | pf_display_info.row = 0; |
976 | 1162 | } |
977 | 1163 | |
978 | - // row(GPIO ID)を再取得 | |
1164 | + // row(GPIOピンのID)を再取得 | |
979 | 1165 | row = pf_display_row_to_id[pf_display_info.row]; |
980 | 1166 | } |
981 | 1167 |
@@ -1008,8 +1194,8 @@ static void pf_display_callback(u4 eventbit) | ||
1008 | 1194 | } |
1009 | 1195 | |
1010 | 1196 | //! @brief Display初期化 |
1011 | -//! @param なし | |
1012 | -//! @return GPIO初期化およびTimer初期化の後に呼び出すこと | |
1197 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
1198 | +//! @attention GPIO初期化およびTimer初期化の後に呼び出すこと | |
1013 | 1199 | void pf_display_init(void) |
1014 | 1200 | { |
1015 | 1201 | u4 row; |
@@ -1020,9 +1206,9 @@ void pf_display_init(void) | ||
1020 | 1206 | col = 0; |
1021 | 1207 | |
1022 | 1208 | // Display情報初期化 |
1023 | - pf_display_info.ch = ' '; | |
1024 | 1209 | pf_display_info.active = FALSE; |
1025 | 1210 | pf_display_info.on = FALSE; |
1211 | + pf_display_info.force = FALSE; | |
1026 | 1212 | pf_display_info.row = 0; |
1027 | 1213 | |
1028 | 1214 | // Display情報初期化(行) |
@@ -1043,23 +1229,16 @@ void pf_display_init(void) | ||
1043 | 1229 | pf_timer_start(PF_TIMER_ID_DISPLAY); |
1044 | 1230 | } |
1045 | 1231 | |
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) | |
1050 | 1235 | { |
1051 | 1236 | const u1 *font; |
1052 | - u4 enable; | |
1053 | 1237 | u4 offset; |
1054 | - u4 row; | |
1055 | - u4 col; | |
1056 | 1238 | |
1057 | 1239 | // オート変数初期化 |
1058 | 1240 | font = &pf_display_pendolino3[0][0]; |
1059 | - enable = 0; | |
1060 | 1241 | offset = 0; |
1061 | - row = 0; | |
1062 | - col = 0; | |
1063 | 1242 | |
1064 | 1243 | // 範囲内であれば、pendolino3フォントを使用する |
1065 | 1244 | offset = (u4)ch; |
@@ -1070,41 +1249,87 @@ void pf_display_on(char ch) | ||
1070 | 1249 | } |
1071 | 1250 | else |
1072 | 1251 | { |
1073 | - // 範囲外の場合、Happyマークを使用する | |
1252 | + // 範囲外の場合、スペースを表示する | |
1074 | 1253 | } |
1075 | 1254 | |
1076 | - // 割り込み禁止 | |
1077 | - enable = pf_interrupt_local_disable(PF_INTERRUPT_PRI_DISPLAY_TIMER); | |
1255 | + // Display表示(イメージ)と共通 | |
1256 | + pf_display_image(font); | |
1257 | +} | |
1078 | 1258 | |
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]; | |
1081 | 1267 | |
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 | |
1084 | 1274 | { |
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) | |
1087 | 1300 | { |
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++) | |
1094 | 1309 | { |
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 | + } | |
1096 | 1324 | } |
1097 | - font++; | |
1325 | + | |
1326 | + // 割り込み復元 | |
1327 | + pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable); | |
1098 | 1328 | } |
1099 | 1329 | } |
1100 | - | |
1101 | - // 割り込み復元 | |
1102 | - pf_interrupt_local_restore(PF_INTERRUPT_PRI_DISPLAY_TIMER, enable); | |
1103 | 1330 | } |
1104 | 1331 | |
1105 | 1332 | //! @brief Display停止 |
1106 | -//! @param なし | |
1107 | -//! @return なし | |
1108 | 1333 | void pf_display_off(void) |
1109 | 1334 | { |
1110 | 1335 | u4 enable; |
@@ -1112,19 +1337,22 @@ void pf_display_off(void) | ||
1112 | 1337 | // オート変数初期化 |
1113 | 1338 | enable = 0; |
1114 | 1339 | |
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); | |
1117 | 1345 | |
1118 | - // ワークを設定 | |
1119 | - pf_display_info.on = FALSE; | |
1346 | + // ワークを設定 | |
1347 | + pf_display_info.on = FALSE; | |
1120 | 1348 | |
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 | + } | |
1123 | 1352 | } |
1124 | 1353 | |
1125 | 1354 | //! @brief Display明るさ指定 |
1126 | -//! @param 明るさ(5~95) | |
1127 | -//! @return なし | |
1355 | +//! @param [in] brightness 明るさ(PF_DISPLAY_BRIGHTNESS_MIN~PF_DISPLAY_BRIGHTNESS_MAX) | |
1128 | 1356 | //! @attention 範囲外の値は設定禁止 |
1129 | 1357 | void pf_display_brightness(u4 brightness) |
1130 | 1358 | { |
@@ -1135,13 +1363,34 @@ void pf_display_brightness(u4 brightness) | ||
1135 | 1363 | cc[1] = MICROSEC_TO_TIMERCC(1000); |
1136 | 1364 | |
1137 | 1365 | // パラメータチェック |
1138 | - if ((brightness >= 5) && (brightness <= 95)) | |
1366 | + if ((brightness >= PF_DISPLAY_BRIGHTNESS_MIN) | |
1367 | + && (brightness <= PF_DISPLAY_BRIGHTNESS_MAX)) | |
1139 | 1368 | { |
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); | |
1142 | 1374 | |
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 | + } | |
1145 | 1378 | } |
1146 | 1379 | } |
1147 | 1380 | |
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 | +} |
@@ -61,7 +61,7 @@ typedef enum PF_GPIO_DRIVE_Tag | ||
61 | 61 | PF_GPIO_DRIVE_H0D1 = 0x0700, //!< '0':高駆動/'1':未接続 |
62 | 62 | } PF_GPIO_DRIVE; |
63 | 63 | |
64 | -//! @brief GPIOピンの設定情報構造体 | |
64 | +//! @brief GPIOピン設定情報構造体 | |
65 | 65 | typedef struct PF_GPIO_INFO_Tag |
66 | 66 | { |
67 | 67 | u4 port; //!< ポート(0~1) |
@@ -73,7 +73,8 @@ typedef struct PF_GPIO_INFO_Tag | ||
73 | 73 | PF_GPIO_DRIVE drive; //!< 駆動特性 |
74 | 74 | } PF_GPIO_INFO; |
75 | 75 | |
76 | -//! @brief GPIOピンの設定情報テーブル | |
76 | +//! @brief GPIOピン設定情報テーブル | |
77 | +//! @todo 未使用ピンをすべてプルアップ有効の入力にするよう設定すること | |
77 | 78 | const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] = |
78 | 79 | { |
79 | 80 | // PF_GPIO_ID_UART_TXD |
@@ -208,6 +209,50 @@ const PF_GPIO_INFO pf_gpio_table[PF_GPIO_ID_MAX] = | ||
208 | 209 | PF_GPIO_PULL_NONE, // プルアップ・プルダウン |
209 | 210 | PF_GPIO_DRIVE_H0H1, // 駆動特性 |
210 | 211 | }, |
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 | + }, | |
211 | 256 | }; |
212 | 257 | |
213 | 258 | //! @brief GPIOデバイス取得 |
@@ -235,7 +280,6 @@ static NRF_GPIO_Type* pf_gpio_get_dev(PF_GPIO_ID id) | ||
235 | 280 | |
236 | 281 | //! @brief GPIO初期化(単一のID) |
237 | 282 | //! @param [in] id GPIOピンのID |
238 | -//! @return なし | |
239 | 283 | static void pf_gpio_init_id(PF_GPIO_ID id) |
240 | 284 | { |
241 | 285 | NRF_GPIO_Type *dev; |
@@ -261,8 +305,7 @@ static void pf_gpio_init_id(PF_GPIO_ID id) | ||
261 | 305 | } |
262 | 306 | |
263 | 307 | //! @brief GPIO初期化 |
264 | -//! @param なし | |
265 | -//! @return なし | |
308 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
266 | 309 | void pf_gpio_init(void) |
267 | 310 | { |
268 | 311 | u4 id; |
@@ -274,7 +317,7 @@ void pf_gpio_init(void) | ||
274 | 317 | for (id = 0; id < (u4)PF_GPIO_ID_MAX; id++) |
275 | 318 | { |
276 | 319 | // 1つのIDを初期化 |
277 | - pf_gpio_init_id((PF_GPIO_ID) id); | |
320 | + pf_gpio_init_id((PF_GPIO_ID)id); | |
278 | 321 | } |
279 | 322 | } |
280 | 323 |
@@ -316,10 +359,48 @@ u4 pf_gpio_get_pin(PF_GPIO_ID id) | ||
316 | 359 | return pin; |
317 | 360 | } |
318 | 361 | |
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 | + | |
319 | 401 | //! @brief GPIOへ出力 |
320 | 402 | //! @param [in] id GPIOピンのID |
321 | 403 | //! @param [in] level 出力レベル |
322 | -//! @return なし | |
323 | 404 | void pf_gpio_output(PF_GPIO_ID id, BOOL level) |
324 | 405 | { |
325 | 406 | NRF_GPIO_Type *dev; |
@@ -27,7 +27,6 @@ | ||
27 | 27 | #include "pf_interrupt.h" |
28 | 28 | |
29 | 29 | //! @brief グローバル割り込み禁止 |
30 | -//! @param なし | |
31 | 30 | //! @return 直前のグローバル割り込み禁止状態(1:割り込み禁止/0:割り込み許可) |
32 | 31 | u4 pf_interrupt_global_disable(void) |
33 | 32 | { |
@@ -44,7 +43,6 @@ u4 pf_interrupt_global_disable(void) | ||
44 | 43 | |
45 | 44 | //! @brief グローバル割り込み復元 |
46 | 45 | //! @param [in] primask pf_interrupt_global_disable()の返り値 |
47 | -//! @return なし | |
48 | 46 | void pf_interrupt_global_restore(u4 primask) |
49 | 47 | { |
50 | 48 | // 直前の割り込み禁止状態が割り込み許可の場合のみ |
@@ -68,6 +66,11 @@ static u4 pf_interrupt_get_irq(PF_INTERRUPT_PRI pri) | ||
68 | 66 | // 割り込み優先度から割り込み番号を取得 |
69 | 67 | switch (pri) |
70 | 68 | { |
69 | + // POWER | |
70 | + case PF_INTERRUPT_PRI_POWER: | |
71 | + irq = POWER_CLOCK_IRQn; | |
72 | + break; | |
73 | + | |
71 | 74 | // UART |
72 | 75 | case PF_INTERRUPT_PRI_UART: |
73 | 76 | irq = UARTE0_UART0_IRQn; |
@@ -97,7 +100,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri) | ||
97 | 100 | enable = 0; |
98 | 101 | irq = UARTE1_IRQn; |
99 | 102 | |
100 | - // SysTickは別制御 | |
103 | + // SysTickは別制御(NVICで割り込み許可/割り込み禁止を管理していないため) | |
101 | 104 | if (PF_INTERRUPT_PRI_SYSTICK == pri) |
102 | 105 | { |
103 | 106 | enable = pf_interrupt_global_disable(); |
@@ -120,8 +123,7 @@ u4 pf_interrupt_local_disable(PF_INTERRUPT_PRI pri) | ||
120 | 123 | |
121 | 124 | //! @brief ローカル割り込み復元 |
122 | 125 | //! @param [in] pri 割り込み優先度 |
123 | -//! @param [in] enable pf_interrupt_local_disable(id)の返り値 | |
124 | -//! @return なし | |
126 | +//! @param [in] enable pf_interrupt_local_disable(pri)の返り値 | |
125 | 127 | void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable) |
126 | 128 | { |
127 | 129 | IRQn_Type irq; |
@@ -129,7 +131,7 @@ void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable) | ||
129 | 131 | // オート変数初期化 |
130 | 132 | irq = UARTE1_IRQn; |
131 | 133 | |
132 | - // SysTickは別制御 | |
134 | + // SysTickは別制御(NVICで割り込み許可/割り込み禁止を管理していないため) | |
133 | 135 | if (PF_INTERRUPT_PRI_SYSTICK == pri) |
134 | 136 | { |
135 | 137 | pf_interrupt_global_restore(enable); |
@@ -142,6 +144,7 @@ void pf_interrupt_local_restore(PF_INTERRUPT_PRI pri, u4 enable) | ||
142 | 144 | // 特定できた場合のみ、割り込み復元を行う |
143 | 145 | if (UARTE1_IRQn != irq) |
144 | 146 | { |
147 | + // 直前の割り込み禁止状態が割り込み許可の場合のみ | |
145 | 148 | if (0 != enable) |
146 | 149 | { |
147 | 150 | NVIC_EnableIRQ(irq); |
@@ -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 | +} |
@@ -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 | +} |
@@ -27,15 +27,14 @@ | ||
27 | 27 | #include "pf_interrupt.h" |
28 | 28 | #include "pf_systick.h" |
29 | 29 | |
30 | -//! @brief msカウンタ(フリーラン) | |
30 | +//! @brief フリーランカウンタ[ms] | |
31 | 31 | static volatile u4 pf_systick_freerun_ms; |
32 | 32 | |
33 | 33 | //! @brief 制御周期カウンタ[ms] |
34 | 34 | static u4 pf_systick_sync_ms; |
35 | 35 | |
36 | 36 | //! @brief SysTick初期化 |
37 | -//! @param なし | |
38 | -//! @return なし | |
37 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
39 | 38 | void pf_systick_init(void) |
40 | 39 | { |
41 | 40 | // SysTickタイマを停止 |
@@ -59,18 +58,14 @@ void pf_systick_init(void) | ||
59 | 58 | // ・SysClockタイマ動作 |
60 | 59 | // ・割り込みモードを指定 |
61 | 60 | // ・クロックソースとしてプロセッサクロックを指定 |
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; | |
66 | 63 | |
67 | 64 | // 制御周期カウンタをクリア |
68 | 65 | pf_systick_sync_ms = 0; |
69 | 66 | } |
70 | 67 | |
71 | 68 | //! @brief 次の制御周期まで待つ |
72 | -//! @param なし | |
73 | -//! @return なし | |
74 | 69 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
75 | 70 | void pf_systick_sync(void) |
76 | 71 | { |
@@ -100,8 +95,7 @@ void pf_systick_sync(void) | ||
100 | 95 | } |
101 | 96 | |
102 | 97 | //! @brief SysTick時刻を取得 |
103 | -//! @param [out] timebuf SysTick時刻報構造体へのポインタ | |
104 | -//! @return なし | |
98 | +//! @param [out] timebuf SysTick時刻情報構造体へのポインタ | |
105 | 99 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
106 | 100 | void pf_systick_time(PF_SYSTICK_TIME *timebuf) |
107 | 101 | { |
@@ -171,7 +165,6 @@ void pf_systick_time(PF_SYSTICK_TIME *timebuf) | ||
171 | 165 | } |
172 | 166 | |
173 | 167 | //! @brief フリーランmsカウンタを取得 |
174 | -//! @param なし | |
175 | 168 | //! @return フリーランmsカウンタ(32bit) |
176 | 169 | u4 pf_systick_freerun(void) |
177 | 170 | { |
@@ -195,8 +188,6 @@ u4 pf_systick_freerun(void) | ||
195 | 188 | } |
196 | 189 | |
197 | 190 | //! @brief SysTick割り込みハンドラ |
198 | -//! @param なし | |
199 | -//! @return なし | |
200 | 191 | void SysTick_Handler(void) |
201 | 192 | { |
202 | 193 | // 49日と17時間2分47.295秒でラップアラウンドする |
@@ -71,7 +71,7 @@ typedef struct PF_TIMER_OPERATION_Tag | ||
71 | 71 | { |
72 | 72 | PF_TIMER_CALLBACK callback; //!< コールバック関数 |
73 | 73 | u4 cc[4]; //!< コンペア値 |
74 | - BOOL running; //!< 動作中 | |
74 | + BOOL running; //!< 動作中フラグ | |
75 | 75 | } PF_TIMER_OPERATION; |
76 | 76 | |
77 | 77 | //! @brief Timer動作情報テーブル |
@@ -241,7 +241,6 @@ static IRQn_Type pf_timer_get_irq(PF_TIMER_ID id) | ||
241 | 241 | |
242 | 242 | //! @brief Timer初期化(単一のID) |
243 | 243 | //! @param [in] id TimerのID |
244 | -//! @return なし | |
245 | 244 | static void pf_timer_init_id(PF_TIMER_ID id) |
246 | 245 | { |
247 | 246 | IRQn_Type irq; |
@@ -318,8 +317,7 @@ static void pf_timer_init_id(PF_TIMER_ID id) | ||
318 | 317 | } |
319 | 318 | |
320 | 319 | //! @brief Timer初期化 |
321 | -//! @param なし | |
322 | -//! @return なし | |
320 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
323 | 321 | void pf_timer_init(void) |
324 | 322 | { |
325 | 323 | u4 id; |
@@ -337,7 +335,6 @@ void pf_timer_init(void) | ||
337 | 335 | |
338 | 336 | //! @brief Timer開始 |
339 | 337 | //! @param [in] id TimerのID |
340 | -//! @return なし | |
341 | 338 | void pf_timer_start(PF_TIMER_ID id) |
342 | 339 | { |
343 | 340 | // IDチェック |
@@ -360,7 +357,6 @@ void pf_timer_start(PF_TIMER_ID id) | ||
360 | 357 | |
361 | 358 | //! @brief Timer停止 |
362 | 359 | //! @param [in] id TimerのID |
363 | -//! @return なし | |
364 | 360 | void pf_timer_stop(PF_TIMER_ID id) |
365 | 361 | { |
366 | 362 | // IDチェック |
@@ -375,11 +371,10 @@ void pf_timer_stop(PF_TIMER_ID id) | ||
375 | 371 | } |
376 | 372 | } |
377 | 373 | |
378 | -//! @brief コールバック関数設定 | |
374 | +//! @brief Timerコールバック関数設定 | |
379 | 375 | //! @param [in] id TimerのID |
380 | -//! @param [in] func コールバック関数へのポインタ | |
381 | -//! @return なし | |
382 | -//! @attention コールバック関数は割り込みコンテキストで呼び出される | |
376 | +//! @param [in] func Timerコールバック関数へのポインタ | |
377 | +//! @attention Timerコールバック関数は割り込みコンテキストで呼び出される | |
383 | 378 | void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func) |
384 | 379 | { |
385 | 380 | IRQn_Type irq; |
@@ -412,8 +407,7 @@ void pf_timer_callback(PF_TIMER_ID id, PF_TIMER_CALLBACK func) | ||
412 | 407 | |
413 | 408 | //! @brief Timerコンペアカウンタ設定 |
414 | 409 | //! @param [in] id TimerのID |
415 | -//! @param [in] cc コンペアカウンタ配列へのポインタ | |
416 | -//! @return なし | |
410 | +//! @param [in] cc コンペアカウンタ配列 | |
417 | 411 | void pf_timer_cc(PF_TIMER_ID id, u4 *cc) |
418 | 412 | { |
419 | 413 | IRQn_Type irq; |
@@ -454,8 +448,7 @@ void pf_timer_cc(PF_TIMER_ID id, u4 *cc) | ||
454 | 448 | } |
455 | 449 | |
456 | 450 | //! @brief 共通割り込みハンドラ |
457 | -//! @param [in] cahannel Timerチャネル(0~4) | |
458 | -//! @return なし | |
451 | +//! @param [in] channel Timerチャネル(0~4) | |
459 | 452 | static void pf_timer_isr(u4 channel) |
460 | 453 | { |
461 | 454 | PF_TIMER_ID id; |
@@ -520,7 +513,7 @@ static void pf_timer_isr(u4 channel) | ||
520 | 513 | pf_timer_table[id].dev->EVENTS_COMPARE[0] = clear; |
521 | 514 | } |
522 | 515 | |
523 | - // コールバック関数が登録されていれば、呼び出す | |
516 | + // Timerコールバック関数が登録されていれば、呼び出す | |
524 | 517 | if (NULL != pf_timer_status[id].callback) |
525 | 518 | { |
526 | 519 | pf_timer_status[id].callback(compare); |
@@ -529,8 +522,6 @@ static void pf_timer_isr(u4 channel) | ||
529 | 522 | } |
530 | 523 | |
531 | 524 | //! @brief Timer0割り込みハンドラ |
532 | -//! @param なし | |
533 | -//! @return なし | |
534 | 525 | //! @attention データ競合(割り込み干渉)に注意する |
535 | 526 | void TIMER0_IRQHandler(void) |
536 | 527 | { |
@@ -538,8 +529,6 @@ void TIMER0_IRQHandler(void) | ||
538 | 529 | } |
539 | 530 | |
540 | 531 | //! @brief Timer1割り込みハンドラ |
541 | -//! @param なし | |
542 | -//! @return なし | |
543 | 532 | //! @attention データ競合(割り込み干渉)に注意する |
544 | 533 | void TIMER1_IRQHandler(void) |
545 | 534 | { |
@@ -547,8 +536,6 @@ void TIMER1_IRQHandler(void) | ||
547 | 536 | } |
548 | 537 | |
549 | 538 | //! @brief Timer2割り込みハンドラ |
550 | -//! @param なし | |
551 | -//! @return なし | |
552 | 539 | //! @attention データ競合(割り込み干渉)に注意する |
553 | 540 | void TIMER2_IRQHandler(void) |
554 | 541 | { |
@@ -556,8 +543,6 @@ void TIMER2_IRQHandler(void) | ||
556 | 543 | } |
557 | 544 | |
558 | 545 | //! @brief Timer3割り込みハンドラ |
559 | -//! @param なし | |
560 | -//! @return なし | |
561 | 546 | //! @attention データ競合(割り込み干渉)に注意する |
562 | 547 | void TIMER3_IRQHandler(void) |
563 | 548 | { |
@@ -565,8 +550,6 @@ void TIMER3_IRQHandler(void) | ||
565 | 550 | } |
566 | 551 | |
567 | 552 | //! @brief Timer4割り込みハンドラ |
568 | -//! @param なし | |
569 | -//! @return なし | |
570 | 553 | //! @attention データ競合(割り込み干渉)に注意する |
571 | 554 | void TIMER4_IRQHandler(void) |
572 | 555 | { |
@@ -34,12 +34,12 @@ | ||
34 | 34 | #include "pf_uart.h" |
35 | 35 | |
36 | 36 | //! @brief バッファサイズ(2の倍数とすること) |
37 | -#define PF_UART_BUF_BYTES 0x1000 | |
37 | +#define PF_UART_BUF_BYTES (0x1000) | |
38 | 38 | |
39 | 39 | //! @brief 受信除外文字(この文字は受信できない) |
40 | 40 | #define PF_UART_EMPTY_CODE ((u1)0xFFU) |
41 | 41 | |
42 | -//! @brief エラー情報構造体 | |
42 | +//! @brief UARTエラー情報構造体 | |
43 | 43 | typedef struct PF_UART_ERROR_Tag |
44 | 44 | { |
45 | 45 | u4 overrun_count; //!< オーバーランエラー発生回数 |
@@ -48,10 +48,10 @@ typedef struct PF_UART_ERROR_Tag | ||
48 | 48 | u4 brk_count; //!< ブレーク条件発生回数 |
49 | 49 | } PF_UART_ERROR; |
50 | 50 | |
51 | -//! @brief エラー情報本体 | |
51 | +//! @brief UARTエラー情報本体 | |
52 | 52 | static PF_UART_ERROR pf_uart_error; |
53 | 53 | |
54 | -//! @brief バッファ管理構造体 | |
54 | +//! @brief UARTバッファ管理構造体 | |
55 | 55 | typedef struct PF_UART_BUF_Tag |
56 | 56 | { |
57 | 57 | u4 read_pos; //!< 読み取り位置 |
@@ -63,23 +63,22 @@ typedef struct PF_UART_BUF_Tag | ||
63 | 63 | u1 buf[PF_UART_BUF_BYTES]; //!< リングバッファ |
64 | 64 | } PF_UART_BUF; |
65 | 65 | |
66 | -//! @brief バッファID | |
66 | +//! @brief UARTバッファのID | |
67 | 67 | typedef enum PF_UART_BUF_ID_Tag |
68 | 68 | { |
69 | 69 | PF_UART_BUF_ID_TXD = 0, //!< 送信バッファ |
70 | 70 | PF_UART_BUF_ID_RXD, //!< 受信バッファ |
71 | - PF_UART_BUF_ID_MAX, //!< ID最大数 | |
71 | + PF_UART_BUF_ID_MAX, //!< (IDの個数を表す) | |
72 | 72 | } PF_UART_BUF_ID; |
73 | 73 | |
74 | -//! @brief バッファ本体 | |
74 | +//! @brief UARTバッファ本体 | |
75 | 75 | static PF_UART_BUF pf_uart_buf[PF_UART_BUF_ID_MAX]; |
76 | 76 | |
77 | 77 | //! @brief DMAバッファ本体 |
78 | 78 | static u1 pf_uart_dma[PF_UART_BUF_BYTES]; |
79 | 79 | |
80 | -//! @brief バッファ初期化 | |
81 | -//! @param なし | |
82 | -//! @return なし | |
80 | +//! @brief UARTバッファ初期化 | |
81 | +//! @param [in] id UARTバッファのID | |
83 | 82 | static void pf_uart_init_buf(PF_UART_BUF_ID id) |
84 | 83 | { |
85 | 84 | pf_uart_buf[id].read_pos = 0; |
@@ -91,8 +90,6 @@ static void pf_uart_init_buf(PF_UART_BUF_ID id) | ||
91 | 90 | } |
92 | 91 | |
93 | 92 | //! @brief DMAバッファ初期化 |
94 | -//! @param なし | |
95 | -//! @return なし | |
96 | 93 | static void pf_uart_init_dma(void) |
97 | 94 | { |
98 | 95 | u4 loop; |
@@ -108,8 +105,6 @@ static void pf_uart_init_dma(void) | ||
108 | 105 | } |
109 | 106 | |
110 | 107 | //! @brief UART送信ポーリング |
111 | -//! @param なし | |
112 | -//! @return なし | |
113 | 108 | //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される |
114 | 109 | static void pf_uart_poll_txd(void) |
115 | 110 | { |
@@ -156,8 +151,6 @@ static void pf_uart_poll_txd(void) | ||
156 | 151 | } |
157 | 152 | |
158 | 153 | //! @brief UART受信ポーリング |
159 | -//! @param なし | |
160 | -//! @return なし | |
161 | 154 | //! @attention 通常コンテキストと、割り込みコンテキストの双方から呼び出される |
162 | 155 | static void pf_uart_poll_rxd(void) |
163 | 156 | { |
@@ -177,7 +170,7 @@ static void pf_uart_poll_rxd(void) | ||
177 | 170 | pf_uart_buf[PF_UART_BUF_ID_RXD].write_pos &= |
178 | 171 | (sizeof(pf_uart_buf[PF_UART_BUF_ID_RXD].buf) - 1); |
179 | 172 | |
180 | - // valid_bytesのカウントアップ | |
173 | + // valid_bytesをインクリメント | |
181 | 174 | pf_uart_buf[PF_UART_BUF_ID_RXD].valid_bytes++; |
182 | 175 | } |
183 | 176 | else |
@@ -198,8 +191,7 @@ static void pf_uart_poll_rxd(void) | ||
198 | 191 | } |
199 | 192 | |
200 | 193 | //! @brief UART初期化 |
201 | -//! @param なし | |
202 | -//! @return なし | |
194 | +//! @remarks プラットフォーム初期化処理から呼び出すこと | |
203 | 195 | //! @attention GPIO初期化の後で呼び出すこと |
204 | 196 | void pf_uart_init(void) |
205 | 197 | { |
@@ -220,8 +212,7 @@ void pf_uart_init(void) | ||
220 | 212 | NRF_UARTE0->INTEN = (UARTE_INTEN_ENDRX_Enabled << UARTE_INTEN_ENDRX_Pos) |
221 | 213 | | (UARTE_INTEN_ENDTX_Enabled << UARTE_INTEN_ENDTX_Pos) |
222 | 214 | | (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); | |
225 | 216 | |
226 | 217 | // 割り込み設定 |
227 | 218 | NVIC_SetPriority(UARTE0_UART0_IRQn, PF_INTERRUPT_PRI_UART); |
@@ -278,8 +269,7 @@ void pf_uart_init(void) | ||
278 | 269 | } |
279 | 270 | |
280 | 271 | //! @brief UART定期タスク |
281 | -//! @param なし | |
282 | -//! @return なし | |
272 | +//! @remarks 定期タスク(出力系)処理から呼び出すこと | |
283 | 273 | void pf_uart_task(void) |
284 | 274 | { |
285 | 275 | u4 enable; |
@@ -301,7 +291,6 @@ void pf_uart_task(void) | ||
301 | 291 | //! @brief UART送信 |
302 | 292 | //! @param [in] buf 送信バッファへのポインタ |
303 | 293 | //! @param [in] bytes 送信バイト数 |
304 | -//! @return なし | |
305 | 294 | void pf_uart_send(const u1 *buf, u4 bytes) |
306 | 295 | { |
307 | 296 | u4 enable; |
@@ -331,7 +320,7 @@ void pf_uart_send(const u1 *buf, u4 bytes) | ||
331 | 320 | pf_uart_buf[PF_UART_BUF_ID_TXD].write_pos &= |
332 | 321 | (sizeof(pf_uart_buf[PF_UART_BUF_ID_TXD].buf) - 1); |
333 | 322 | |
334 | - // valid_bytesのカウントアップ | |
323 | + // valid_bytesをインクリメント | |
335 | 324 | pf_uart_buf[PF_UART_BUF_ID_TXD].valid_bytes++; |
336 | 325 | } |
337 | 326 | else |
@@ -351,10 +340,83 @@ void pf_uart_send(const u1 *buf, u4 bytes) | ||
351 | 340 | } |
352 | 341 | } |
353 | 342 | |
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 | + | |
354 | 417 | //! @brief システム時間のフォーマット |
355 | 418 | //! @param [out] buf 格納バッファ |
356 | 419 | //! @param [in] format printf形式の書式指定文字列 |
357 | -//! @return なし | |
358 | 420 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
359 | 421 | static void pf_uart_log_time(char *buf, const char *format, ...) |
360 | 422 | { |
@@ -370,9 +432,8 @@ static void pf_uart_log_time(char *buf, const char *format, ...) | ||
370 | 432 | va_end(ap); |
371 | 433 | } |
372 | 434 | |
373 | -//! @brief UARTログ | |
374 | -//! @param [in] format printf形式の書式指定文字列(末尾の改行は不要) | |
375 | -//! @return なし | |
435 | +//! @brief UARTログ出力 | |
436 | +//! @param [in] format printf形式の書式指定文字列(末尾の改行はあってもなくてもよい) | |
376 | 437 | //! @attention グローバル割り込み禁止状態で呼び出さないこと |
377 | 438 | void pf_uart_log(const char *format, ...) |
378 | 439 | { |
@@ -398,9 +459,16 @@ void pf_uart_log(const char *format, ...) | ||
398 | 459 | timebuf.us); |
399 | 460 | |
400 | 461 | // 本体のフォーマット |
401 | - bytes = (u4)vsnprintf(&buf[14], sizeof(buf) - 16, format, ap); | |
462 | + bytes = (u4) vsnprintf(&buf[14], sizeof(buf) - 16, format, ap); | |
402 | 463 | bytes += 14; |
403 | 464 | |
465 | + // 末尾に改行文字があるか? | |
466 | + if (buf[bytes - 1] == '\n') | |
467 | + { | |
468 | + // 改行文字を削る | |
469 | + bytes--; | |
470 | + } | |
471 | + | |
404 | 472 | // 改行文字を追加 |
405 | 473 | buf[bytes] = '\r'; |
406 | 474 | bytes++; |
@@ -414,22 +482,7 @@ void pf_uart_log(const char *format, ...) | ||
414 | 482 | va_end(ap); |
415 | 483 | } |
416 | 484 | |
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 | - | |
430 | 485 | //! @brief UART割り込みハンドラ(ENDTX) |
431 | -//! @param なし | |
432 | -//! @return なし | |
433 | 486 | //! @attention データ競合(割り込み干渉)に注意する |
434 | 487 | static void pf_uart_intr_endtx(void) |
435 | 488 | { |
@@ -448,8 +501,6 @@ static void pf_uart_intr_endtx(void) | ||
448 | 501 | } |
449 | 502 | |
450 | 503 | //! @brief UART割り込みハンドラ(ERROR) |
451 | -//! @param なし | |
452 | -//! @return なし | |
453 | 504 | //! @attention データ競合(割り込み干渉)に注意する |
454 | 505 | static void pf_uart_intr_error(void) |
455 | 506 | { |
@@ -485,7 +536,7 @@ static void pf_uart_intr_error(void) | ||
485 | 536 | pf_uart_error.framing_count++; |
486 | 537 | } |
487 | 538 | |
488 | - // ブレーク条件 | |
539 | + // ブレーク信号受信 | |
489 | 540 | if (brk == (NRF_UARTE0->ERRORSRC & brk)) |
490 | 541 | { |
491 | 542 | NRF_UARTE0->ERRORSRC &= (u4)(~UART_ERRORSRC_BREAK_Msk); |
@@ -494,8 +545,6 @@ static void pf_uart_intr_error(void) | ||
494 | 545 | } |
495 | 546 | |
496 | 547 | //! @brief UART割り込みハンドラ(RXSTARTED) |
497 | -//! @param なし | |
498 | -//! @return なし | |
499 | 548 | //! @attention データ競合(割り込み干渉)に注意する |
500 | 549 | static void pf_uart_intr_rxstarted(void) |
501 | 550 | { |
@@ -510,9 +559,21 @@ static void pf_uart_intr_rxstarted(void) | ||
510 | 559 | } |
511 | 560 | } |
512 | 561 | |
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 | + | |
513 | 576 | //! @brief UART割り込みハンドラ |
514 | -//! @param なし | |
515 | -//! @return なし | |
516 | 577 | //! @attention データ競合(割り込み干渉)に注意する |
517 | 578 | void UARTE0_UART0_IRQHandler(void) |
518 | 579 | { |
@@ -549,21 +610,8 @@ void UARTE0_UART0_IRQHandler(void) | ||
549 | 610 | == NRF_UARTE0->EVENTS_RXSTARTED) |
550 | 611 | { |
551 | 612 | 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; | |
554 | 615 | pf_uart_intr_rxstarted(); |
555 | 616 | } |
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 | - } | |
569 | 617 | } |
@@ -33,6 +33,9 @@ NOTICE: This file has been modified by Nordic Semiconductor ASA. | ||
33 | 33 | |
34 | 34 | #define __SYSTEM_CLOCK_64M (64000000UL) |
35 | 35 | |
36 | +// for -Wmissing-prototypes | |
37 | +void nvmc_wait(void); | |
38 | +void nvmc_config(uint32_t mode); | |
36 | 39 | |
37 | 40 | #if defined ( __CC_ARM ) |
38 | 41 | uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_64M; |