前回作成したLチカClassをHALに対応させる

前回 https://ioloa.com/?p=157 このページでLチカをしました。

前回はSTM32G4+LLという構成でLチカをしていますが、
STにはLLに非対応なマイコンもあります。

そこで今回は、GPIOCtrl.hppとGPIOCtrl.cppをほんの僅かに変更して、
STM32H7+HALで全ての機能が動くようにします。

以下、既にSTM32H7のプロジェクトがCubeMXを用いて吐かれてる状態から書きます。

①前回のソース
これが前回のソースです。

/*
 * GPIOCtrl.hpp
 *
 *  Created on: Sep 8, 2019
 *      Author: Nakamura(Yutaka)
 */

#ifndef GPIOCTRL_HPP_
#define GPIOCTRL_HPP_

#include "gpio.h"
#include "stm32g4xx_hal.h"

class GPIOCtrl {
public:
	enum GPIOStatus {
		GPIO_OFF = 0,
		GPIO_ON = 1,
	};

private:
	GPIO_TypeDef *mGPIOx;
	uint32_t mPinMask;
	GPIOStatus mGPIOStatus;
public:
	GPIOCtrl( GPIO_TypeDef *pGPIOx, uint32_t pPinMask );
	virtual ~GPIOCtrl();
	void ON();
	void OFF();
	void Toggle();
};

#endif /* GPIOCTRL_HPP_ */
/*
 * GPIOCtrl.cpp
 *
 *  Created on: Sep 8, 2019
 *      Author: Nakamura(Yutaka)
 */

#include "GPIOCtrl.hpp"

GPIOCtrl::GPIOCtrl( GPIO_TypeDef *pGPIOx, uint32_t pPinMask)
:mGPIOx(pGPIOx), mPinMask(pPinMask), mGPIOStatus(GPIO_OFF) {
	OFF();
}

GPIOCtrl::~GPIOCtrl() {
}

void GPIOCtrl::OFF() {
	mGPIOStatus = GPIO_OFF;
	LL_GPIO_ResetOutputPin(mGPIOx, mPinMask);
}

void GPIOCtrl::ON() {
	mGPIOStatus = GPIO_ON;
	LL_GPIO_SetOutputPin(mGPIOx, mPinMask);
}

void GPIOCtrl::Toggle() {
	if(mGPIOStatus) {
		OFF();
	} else {
		ON();
	}
}

②次のように変更する
以下のように変更します。

/*
 * GPIOCtrl.hpp
 *
 *  Created on: Sep 8, 2019
 *      Author: Nakamura(Yutaka)
 */

#ifndef GPIOCTRL_HPP_
#define GPIOCTRL_HPP_

#include "gpio.h"
//マイコンを変更したので利用するライブラリが変わる
//#include "stm32g4xx_hal.h" 
#include "stm32h7xx_hal.h" 

class GPIOCtrl {
public:
	enum GPIOStatus {
		GPIO_OFF = 0,
		GPIO_ON = 1,
	};

private:
	GPIO_TypeDef *mGPIOx;
	uint32_t mPinMask;
	GPIOStatus mGPIOStatus;
public:
	GPIOCtrl( GPIO_TypeDef *pGPIOx, uint32_t pPinMask );
	virtual ~GPIOCtrl();
	void ON();
	void OFF();
	void Toggle();
};

#endif /* GPIOCTRL_HPP_ */
/*
 * GPIOCtrl.cpp
 *
 *  Created on: Sep 8, 2019
 *      Author: Nakamura(Yutaka)
 */

#include "GPIOCtrl.hpp"

GPIOCtrl::GPIOCtrl( GPIO_TypeDef *pGPIOx, uint32_t pPinMask)
:mGPIOx(pGPIOx), mPinMask(pPinMask), mGPIOStatus(GPIO_OFF) {
	OFF();
}

GPIOCtrl::~GPIOCtrl() {
}

void GPIOCtrl::OFF() {
	mGPIOStatus = GPIO_OFF;
	HAL_GPIO_WritePin(mGPIOx, mPinMask, GPIO_PIN_RESET);
    //LLは用意されていないのでHALを利用する。
	//LL_GPIO_ResetOutputPin(mGPIOx, mPinMask);
}

void GPIOCtrl::ON() {
	mGPIOStatus = GPIO_ON;
	HAL_GPIO_WritePin(mGPIOx, mPinMask, GPIO_PIN_SET);
	//LL_GPIO_SetOutputPin(mGPIOx, mPinMask);
}

void GPIOCtrl::Toggle() {
	if(mGPIOStatus) {
		OFF();
	} else {
		ON();
	}
}

これだけです。
(内容が薄くてすいません。)
このように、システムの中核のClassをすこし変更すれば、
マイコンを変更しても対応できます。

やる気になれば、別のメーカーのマイコンへの移植も容易にできます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です