出力ポートを,オープンドレインまたはプッシュプルに設定するグローバル関数. このライブラリを登録した際のプログラム: Demo_SetOutputPortType. Global functions for setting the output port bit open-drain or push-pull.

Dependents:   Demo_SetOutputPortType Mbed2_ConnectTestAll

Revision:
2:faa854cf5f0e
Parent:
1:670919fefe1c
Child:
3:ff33bd585670
--- a/SetOutputPortType.hpp	Fri Sep 04 12:01:35 2015 +0000
+++ b/SetOutputPortType.hpp	Fri Oct 21 07:54:41 2016 +0000
@@ -5,13 +5,13 @@
 //      SetPushPull()       プッシュプルに設定 (Set push-pull)
 // Nucleo 用(For Nucleo)
 //
-// "PA_0", "PB_0", "PC_0" などの定義は下記のヘッダ・ファイルを参照のこと
+// "PA_0", "PB_0", "PC_0" などの定義は Nucleo-F401 の場合下記のヘッダ・ファイルを参照のこと
 // "....TARGET_NUCLEO_F401RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F401RE/PinNames.h"
 //
-//      PinName型変数の上位4ビット:ポート番号(0 = A, 1 = B, 2 = C)
+//      PinName型変数の上位4ビット:ポート番号(0 = A, 1 = B, ・・・・・)
 //      PinName型変数の下位4ビット:ピン番号(0 ~ 15)
 //
-// 2015/09/04, Copyright (c) 2015 MIKAMI, Naoki
+// 2016/10/21, Copyright (c) 2016 MIKAMI, Naoki
 //---------------------------------------------------------------------------------------
 
 #include "mbed.h"
@@ -21,26 +21,19 @@
     // 一つの出力ポートをオープンドレインに設定する
     void SetOpenDrain(PinName pin)
     {
-        // ポート A, B, C 以外は設定できないようにしている
-        MBED_ASSERT(pin <= PC_15);
-    
-        uint16_t bit = 1 << (pin & 0xF);    // bit position
-        switch (pin & 0xF0)
-        {
-            case PA_0 : GPIOA->OTYPER |= bit; break;
-            case PB_0 : GPIOB->OTYPER |= bit; break;
-            case PC_0 : GPIOC->OTYPER |= bit; break;
-        }
+        uint32_t address = (STM_PORT(pin) << 10) + GPIOA_BASE;
+        ((GPIO_TypeDef *)address)->OTYPER |= 1 << STM_PIN(pin);
     }
-    
+
     // 複数の出力ポートをオープンドレインに設定する
     void SetOpenDrain(PinName p0, PinName p1, PinName p2 = NC, PinName p3 = NC,
                       PinName p4 = NC, PinName p5 = NC, PinName p6 = NC, PinName p7 = NC,
                       PinName p8 = NC, PinName p9 = NC, PinName p10 = NC, PinName p11 = NC,
                       PinName p12 = NC, PinName p13 = NC, PinName p14 = NC, PinName p15 = NC)
     {
-        PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
-        
+        PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7,
+                            p8, p9, p10, p11, p12, p13, p14, p15};
+
         for (int n=0; n<16; n++)
         {
             if (pins[n] == NC) break;
@@ -51,16 +44,8 @@
     // 一つの出力ポートをプッシュプルに設定する
     void SetPushPull(PinName pin)
     {
-        // ポート A, B, C 以外は設定できないようにしている
-        MBED_ASSERT(pin <= PC_15);
-    
-        uint16_t bit = 1 << (pin & 0xF);    // bit position
-        switch (pin & 0xF0)
-        {
-            case PA_0 : GPIOA->OTYPER &= ~bit; break;
-            case PB_0 : GPIOB->OTYPER &= ~bit; break;
-            case PC_0 : GPIOC->OTYPER &= ~bit; break;
-        }
+        uint32_t address = (STM_PORT(pin) << 10) + GPIOA_BASE;
+        ((GPIO_TypeDef *)address)->OTYPER &= ~(1 << STM_PIN(pin));
     }
 
     // 複数の出力ポートをプッシュプルに設定する
@@ -69,8 +54,9 @@
                      PinName p8 = NC, PinName p9 = NC, PinName p10 = NC, PinName p11 = NC,
                      PinName p12 = NC, PinName p13 = NC, PinName p14 = NC, PinName p15 = NC)
     {
-        PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
-        
+        PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7,
+                            p8, p9, p10, p11, p12, p13, p14, p15};
+
         for (int n=0; n<16; n++)
         {
             if (pins[n] == NC) break;