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