這幾天看了下 mbed 的源碼,給上層應(yīng)用調(diào)用的接口封裝的還是不錯的。代碼質(zhì)量比較高,注釋也很詳細(xì),文檔和例程比較全。但是驅(qū)動層的程序全是 C 語言編寫的,代碼質(zhì)量就沒有那么高了,注釋比較少而且不規(guī)范,比較懷疑 mbed 的穩(wěn)定性。mbed 的實時內(nèi)核是用的 RTX5 ,文件系統(tǒng)用的 FatFs ,還有一些開源的協(xié)議棧,整套系統(tǒng)比較繁雜。mbed 框架是為物聯(lián)網(wǎng)設(shè)備開發(fā)的,工業(yè)控制級別的產(chǎn)品可以考慮用 RTE 框架。RTE 框架目前驅(qū)動層程序還不太完善,有好多需要自己去實現(xiàn),可能在過一段時間會好一些吧??傊锫?lián)網(wǎng)產(chǎn)品可以用 mbed ,工業(yè)控制產(chǎn)品可以用 RTE 。這幾天封裝了 EXTI ,距離整套系統(tǒng)可以產(chǎn)生生產(chǎn)力還有很長的距離要走,我也不知道整個系統(tǒng)會成什么樣子,我能堅持多久,不管了先做再說。在這里分享我的 STM32F4 C++ 封裝之旅。今天分享《STM32F4 C++ 封裝庫 之 EXTI》,直接上代碼了~
stm32f4xx_xexTI.h 文件
/**
******************************************************************************
* \file stm32f4xx_xexTI.h
* \author XinLi
* \version v1.0
* \date 20-March-2018
* \brief Header file for external interrupt/event controller module.
******************************************************************************
* \attention
*
* Copyright © 2018 XinLi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
******************************************************************************
*/
#ifndef STM32F4XX_XEXTI_H
#define STM32F4XX_XEXTI_H
#include "stm32f4xx_ll_exti.h"
/*! External interrupt/event controller module. */
class XExti
{
public:
/*! Enumerate of EXTI lines. */
enum ExtiLine
{
Line0 = LL_EXTI_LINE_0, /*!< EXTI line 0. */
Line1 = LL_EXTI_LINE_1, /*!< EXTI line 1. */
Line2 = LL_EXTI_LINE_2, /*!< EXTI line 2. */
Line3 = LL_EXTI_LINE_3, /*!< EXTI line 3. */
Line4 = LL_EXTI_LINE_4, /*!< EXTI line 4. */
Line5 = LL_EXTI_LINE_5, /*!< EXTI line 5. */
Line6 = LL_EXTI_LINE_6, /*!< EXTI line 6. */
Line7 = LL_EXTI_LINE_7, /*!< EXTI line 7. */
Line8 = LL_EXTI_LINE_8, /*!< EXTI line 8. */
Line9 = LL_EXTI_LINE_9, /*!< EXTI line 9. */
Line10 = LL_EXTI_LINE_10, /*!< EXTI line 10. */
Line11 = LL_EXTI_LINE_11, /*!< EXTI line 11. */
Line12 = LL_EXTI_LINE_12, /*!< EXTI line 12. */
Line13 = LL_EXTI_LINE_13, /*!< EXTI line 13. */
Line14 = LL_EXTI_LINE_14, /*!< EXTI line 14. */
Line15 = LL_EXTI_LINE_15, /*!< EXTI line 15. */
#ifdef LL_EXTI_LINE_16
Line16 = LL_EXTI_LINE_16, /*!< EXTI line 16. */
#endif
#ifdef LL_EXTI_LINE_17
Line17 = LL_EXTI_LINE_17, /*!< EXTI line 17. */
#endif
#ifdef LL_EXTI_LINE_18
Line18 = LL_EXTI_LINE_18, /*!< EXTI line 18. */
#endif
#ifdef LL_EXTI_LINE_19
Line19 = LL_EXTI_LINE_19, /*!< EXTI line 19. */
#endif
#ifdef LL_EXTI_LINE_20
Line20 = LL_EXTI_LINE_20, /*!< EXTI line 20. */
#endif
#ifdef LL_EXTI_LINE_21
Line21 = LL_EXTI_LINE_21, /*!< EXTI line 21. */
#endif
#ifdef LL_EXTI_LINE_22
Line22 = LL_EXTI_LINE_22, /*!< EXTI line 22. */
#endif
#ifdef LL_EXTI_LINE_23
Line23 = LL_EXTI_LINE_23, /*!< EXTI line 23. */
#endif
#ifdef LL_EXTI_LINE_24
Line24 = LL_EXTI_LINE_24, /*!< EXTI line 24. */
#endif
#ifdef LL_EXTI_LINE_25
Line25 = LL_EXTI_LINE_25, /*!< EXTI line 25. */
#endif
#ifdef LL_EXTI_LINE_26
Line26 = LL_EXTI_LINE_26, /*!< EXTI line 26. */
#endif
#ifdef LL_EXTI_LINE_27
Line27 = LL_EXTI_LINE_27, /*!< EXTI line 27. */
#endif
#ifdef LL_EXTI_LINE_28
Line28 = LL_EXTI_LINE_28, /*!< EXTI line 28. */
#endif
#ifdef LL_EXTI_LINE_29
Line29 = LL_EXTI_LINE_29, /*!< EXTI line 29. */
#endif
#ifdef LL_EXTI_LINE_30
Line30 = LL_EXTI_LINE_30, /*!< EXTI line 30. */
#endif
#ifdef LL_EXTI_LINE_31
Line31 = LL_EXTI_LINE_31, /*!< EXTI line 31. */
#endif
};
/*! Enumerate of EXTI modes. */
enum ExtiMode
{
ModeInterrupt = LL_EXTI_MODE_IT, /*!< EXTI interrupt mode. */
ModeEvent = LL_EXTI_MODE_EVENT, /*!< EXTI event mode. */
ModeInterruptEvent = LL_EXTI_MODE_IT_EVENT, /*!< EXTI interrupt and event mode. */
};
/*! Enumerate of EXTI triggers. */
enum ExtiTrigger
{
TriggerNone = LL_EXTI_TRIGGER_NONE, /*!< EXTI none trigger. */
TriggerRising = LL_EXTI_TRIGGER_RISING, /*!< EXTI rising trigger. */
TriggerFalling = LL_EXTI_TRIGGER_FALLING, /*!< EXTI falling trigger. */
TriggerRisingFalling = LL_EXTI_TRIGGER_RISING_FALLING, /*!< EXTI rising and falling trigger. */
};
XExti(ExtiLine line, ExtiMode mode, ExtiTrigger trigger = TriggerNone);
virtual ~XExti();
void setLine(ExtiLine line);
ExtiLine getLine() const;
void setMode(ExtiMode mode);
ExtiMode getMode() const;
void setTrigger(ExtiTrigger trigger);
ExtiTrigger getTrigger() const;
void setFlag();
void clearFlag();
bool isFlagSet() const;
bool open();
void close();
bool isOpen() const;
private:
ExtiLine line;
ExtiMode mode;
ExtiTrigger trigger;
bool openFlag;
XExti(const XExti &) = delete;
XExti & operator = (const XExti &) = delete;
};
#endif // STM32F4XX_XEXTI_H
stm32f4xx_xexti.cpp 文件
/**
******************************************************************************
* \file stm32f4xx_xexti.cpp
* \author XinLi
* \version v1.0
* \date 20-March-2018
* \brief External interrupt/event controller module driver.
******************************************************************************
* \attention
*
* Copyright © 2018 XinLi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
******************************************************************************
*/