いろいろなテクニック.Nucleo と DISCO-F746 用.

Dependencies:   Array_Matrix mbed

PeripheralAddress.hpp

Committer:
MikamiUitOpen
Date:
2019-04-10
Revision:
1:bbb9f0c3e523
Parent:
0:bb939e0bc6e2

File content as of revision 1:bbb9f0c3e523:

//-----------------------------------------------------------------
//  mbed で定義されているピンの名前に対応するペリフェラルのアドレスを取得
//      SPI, TIM, GPIO, ADC の場合
//
//  2017/10/14 修正:mbed rev.153 用に修正
//  2019/04/10 Mbed rev.172 でも問題ないことを確認
//
//  2019/04/10, Copyright (c) 2019 MIKAMI, Naoki
//-----------------------------------------------------------------
//      デバイスは PeripheralPins.h の中で以下のように定義されている
/*
#ifndef MBED_PERIPHERALPINS_H
#define MBED_PERIPHERALPINS_H

#include "pinmap.h"
#include "PeripheralNames.h"

// ADC
extern const PinMap PinMap_ADC[];

// DAC
extern const PinMap PinMap_DAC[];

// I2C
extern const PinMap PinMap_I2C_SDA[];
extern const PinMap PinMap_I2C_SCL[];

// PWM
extern const PinMap PinMap_PWM[];

// SERIAL
extern const PinMap PinMap_UART_TX[];
extern const PinMap PinMap_UART_RX[];
extern const PinMap PinMap_UART_RTS[];
extern const PinMap PinMap_UART_CTS[];

// SPI
extern const PinMap PinMap_SPI_MOSI[];
extern const PinMap PinMap_SPI_MISO[];
extern const PinMap PinMap_SPI_SCLK[];
extern const PinMap PinMap_SPI_SSEL[];

// CAN
extern const PinMap PinMap_CAN_RD[];
extern const PinMap PinMap_CAN_TD[];
*/

//  関数 pinmap_peripheral() は "bitmap.h" の中で定義されている
//------------------------------------------------------------------

#include "mbed.h"
#include "PeripheralPins.h"     // pinmap_peripheral() を使う場合に必要
/*
// この方法は mbed ライブラリの リビジョン 129 からは使えない
class AddressSPI : public SPI
{
public:
    AddressSPI(PinName mosi, PinName miso = NC, PinName sclk = NC)
        : SPI(mosi, miso, sclk) {}
    uint32_t GetAddress() { return _spi.spi; }
};
*/
class AddressSPI
{
public:
    AddressSPI(PinName mosi, PinName miso = NC, PinName sclk = NC)
        : address_(pinmap_peripheral(mosi, PinMap_SPI_MOSI)) {}
    uint32_t GetAddress() { return address_; }
private:
    uint32_t address_;
};


class AddressTIM : public PwmOut
{
public:
    AddressTIM(PinName pin) : PwmOut(pin) {}
    uint32_t GetAddress() { return _pwm.pwm; }
};

class AddressDigitalOut : public DigitalOut
{
public:
    AddressDigitalOut(PinName pin) : DigitalOut(pin) {}
    // 以下は mbed のリビジョン 129 までは問題なかった
//    uint32_t GetAddress() { return (uint32_t)gpio.reg_set_clr & 0xFFFFFF00; }
    // mbed のリビジョン 153 で修正,gpio.reg_set_clr ⇒ gpio.reg_set 
    uint32_t GetAddress() { return (uint32_t)gpio.reg_set & 0xFFFFFF00; }
};

void PeripheralAddress()
{
#if defined(STM32F4)
    AddressSPI x1(D4, NC);
    printf("SPI1/3, D4:    0x%08X\r\n", x1.GetAddress());
    printf("上の表示されるアドレスは SPI1 のもの\r\n");
    printf("SPI,    D4:    0x%08X\r\n", pinmap_peripheral(D4, PinMap_SPI_MOSI));

    // 次の printf() 文のように機能がピン名と異なる場合(D4 は MISO ではない),実行時エラーが
    // ターミナルに表示され,プログラムが終了する
    //printf("SPI3,  D4:    0x%08X\r\n", pinmap_peripheral(D4, PinMap_SPI_MISO));
    SPI mySpi(D4, NC, D3);
    printf("    GPIOB->AFR[0]: 0x%08X\r\n", GPIOB->AFR[0]);
#endif  // STM32F4

//#ifdef __STM32F746xx_H
#ifdef STM32F7
    // PE_6 は DISCO-F746 では使われていない
//    AddressSPI x11(PE_6, NC);
//    printf("SPI,  PE_6:  0x%08X\r\n", x11.GetAddress());
    AddressSPI x11(D7, NC);
    printf("SPI,  D3:    0x%08X\r\n", x11.GetAddress());
#endif  // STM32F7
    
    AddressTIM x2(D12);
    printf("PWM3,   D12:   0x%08X\r\n", x2.GetAddress());
    printf("PWM1,   D8:    0x%08X\r\n", pinmap_peripheral(D8, PinMap_PWM));

    AddressDigitalOut x3(D6);
    printf("GPIOB,  D6:    0x%08X\r\n", x3.GetAddress());

    PinName adc = A0;
    ADCName addresAdc = (ADCName)pinmap_peripheral(adc, PinMap_ADC);
    printf("ADC,   A0:    0x%08X\r\n", addresAdc);
    printf("ADC,   A1:    0x%08X\r\n", pinmap_peripheral(A1, PinMap_ADC));
    printf("ADC,   A2:    0x%08X\r\n", pinmap_peripheral(A2, PinMap_ADC));
}