/** ****************************************************************************** * @file plib035_uart.h * * @brief Файл содержит прототипы и компактные inline реализации функций для * UART, а также сопутствующие макроопределения и перечисления * * @author НИИЭТ, Богдан Колбов * ****************************************************************************** * @attention * * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. * *

© 2018 ОАО "НИИЭТ"

****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __PLIB035_UART_H #define __PLIB035_UART_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "plib035.h" /** @addtogroup Peripheral * @{ */ /** @defgroup UART * @brief Драйвер для работы с UART * @{ */ /** @defgroup UART_Exported_Defines Константы * @{ */ /** @defgroup UART_ITSource_Define Источники прерываний UART * @{ */ #define UART_ITSource_RxFIFOLevel UART_IMSC_RXIM_Msk /*!< Порог переполнения буфера приемника */ #define UART_ITSource_TxFIFOLevel UART_IMSC_TXIM_Msk /*!< Порог опустошения буфера передатчика */ #define UART_ITSource_RecieveTimeout UART_IMSC_RTIM_Msk /*!< Таймаут приема данных */ #define UART_ITSource_ErrorFrame UART_IMSC_FEIM_Msk /*!< Ошибка в структуре кадра */ #define UART_ITSource_ErrorParity UART_IMSC_PEIM_Msk /*!< Ошибка контроля четности */ #define UART_ITSource_ErrorBreak UART_IMSC_BEIM_Msk /*!< Разрыв линии */ #define UART_ITSource_ErrorOverflow UART_IMSC_OEIM_Msk /*!< Переполнение буффера приемника */ #define UART_ITSource_TransmitDone UART_IMSC_TDIM_Msk /*!< Окончание передачи в линии */ #define UART_ITSource_All (UART_IMSC_RXIM_Msk | \ UART_IMSC_TXIM_Msk | \ UART_IMSC_RTIM_Msk | \ UART_IMSC_FEIM_Msk | \ UART_IMSC_PEIM_Msk | \ UART_IMSC_BEIM_Msk | \ UART_IMSC_OEIM_Msk | \ UART_IMSC_TDIM_Msk) /*!< Все источники выбраны */ #define IS_UART_IT_SOURCE(VALUE) (((VALUE) & ~UART_ITSource_All) == 0) /** * @} */ /** @defgroup UART_Flag_Define Флаги работы UART * @{ */ #define UART_Flag_Busy UART_FR_BUSY_Msk /*!< Флаг занятости блока UART */ #define UART_Flag_RxFIFOEmpty UART_FR_RXFE_Msk /*!< Флаг пустоты буффера приемника */ #define UART_Flag_TxFIFOFull UART_FR_TXFF_Msk /*!< Флаг заполнения буффера передатчика */ #define UART_Flag_RxFIFOFull UART_FR_RXFF_Msk /*!< Флаг заполнения буффера приемника */ #define UART_Flag_TxFIFOEmpty UART_FR_TXFE_Msk /*!< Флаг пустоты буффера передатчика */ #define UART_Flag_All (UART_FR_BUSY_Msk | \ UART_FR_RXFE_Msk | \ UART_FR_TXFF_Msk | \ UART_FR_RXFF_Msk | \ UART_FR_TXFE_Msk) /*!< Все флаги выбраны */ #define IS_UART_FLAG(VALUE) (((VALUE) & ~UART_Flag_All) == 0) /** * @} */ /** @defgroup UART_Error_Define Ошибки приемника UART * @{ */ #define UART_Error_Frame UART_RSR_FE_Msk /*!< Флаг ошибки в структуре кадра */ #define UART_Error_Parity UART_RSR_PE_Msk /*!< Флаг ошибки контроля четности */ #define UART_Error_Break UART_RSR_BE_Msk /*!< Флаг разрыва линии */ #define UART_Error_Overflow UART_RSR_OE_Msk /*!< Флаг переполнения буффера приемника */ #define UART_Error_All (UART_RSR_FE_Msk | \ UART_RSR_PE_Msk | \ UART_RSR_BE_Msk | \ UART_RSR_OE_Msk) /*!< Все флаги ошибок выбраны */ #define IS_UART_ERROR(VALUE) (((VALUE) & ~UART_Error_All) == 0) /** * @} */ /** * @} */ /** @defgroup UART_Exported_Types Типы * @{ */ #define IS_UART_INT_DIV(VALUE) (((VALUE) > 0) && ((VALUE) < 0x10000)) #define IS_UART_FRAC_DIV(VALUE) ((VALUE) < 0x40) #define IS_UART_DATA(VALUE) ((VALUE) < 0x100) /** * @brief Выбор режима передачи стопового бита */ typedef enum { UART_StopBit_1, /*!< Один стоповый бит */ UART_StopBit_2 /*!< Два стоповых бита */ } UART_StopBit_TypeDef; #define IS_UART_STOP_BIT(VALUE) (((VALUE) == UART_StopBit_1) || \ ((VALUE) == UART_StopBit_2)) /** * @brief Выбор режима бита четности */ typedef enum { UART_ParityBit_Disable = 0, /*!< Не передается, не проверяется */ UART_ParityBit_Odd = UART_LCRH_PEN_Msk, /*!< Проверка нечетности данных */ UART_ParityBit_Even = UART_LCRH_PEN_Msk | UART_LCRH_EPS_Msk, /*!< Проверка четности данных */ UART_ParityBit_High = UART_LCRH_PEN_Msk | UART_LCRH_SPS_Msk, /*!< Бит четности постоянно равен единице */ UART_ParityBit_Low = UART_LCRH_PEN_Msk | UART_LCRH_SPS_Msk | UART_LCRH_EPS_Msk /*!< Бит четности постоянно равен нулю */ } UART_ParityBit_TypeDef; #define IS_UART_PARITY_BIT(VALUE) (((VALUE) == UART_ParityBit_Disable) || \ ((VALUE) == UART_ParityBit_Odd) || \ ((VALUE) == UART_ParityBit_Even) || \ ((VALUE) == UART_ParityBit_High) || \ ((VALUE) == UART_ParityBit_Low)) /** * @brief Количество передаваемых/принимаемых информационных бит */ typedef enum { UART_DataWidth_5 = UART_LCRH_WLEN_5bit, /*!< Длина информационного слова 5 бит */ UART_DataWidth_6 = UART_LCRH_WLEN_6bit, /*!< Длина информационного слова 6 бит */ UART_DataWidth_7 = UART_LCRH_WLEN_7bit, /*!< Длина информационного слова 7 бит */ UART_DataWidth_8 = UART_LCRH_WLEN_8bit /*!< Длина информационного слова 8 бит */ } UART_DataWidth_TypeDef; #define IS_UART_DATA_WIDTH(VALUE) (((VALUE) == UART_DataWidth_5) || \ ((VALUE) == UART_DataWidth_6) || \ ((VALUE) == UART_DataWidth_7) || \ ((VALUE) == UART_DataWidth_8)) /** * @brief Порог заполнения/опустошения буфера приемника/передатчика, по достижению которого * будет генерироваться прерывание */ typedef enum { UART_FIFOLevel_1_8 = UART_IFLS_TXIFLSEL_Lvl18, /*!< Заполнение/опустошение FIFO на 1/8 */ UART_FIFOLevel_1_4 = UART_IFLS_TXIFLSEL_Lvl14, /*!< Заполнение/опустошение FIFO на 1/4 */ UART_FIFOLevel_1_2 = UART_IFLS_TXIFLSEL_Lvl12, /*!< Заполнение/опустошение FIFO на 1/2 */ UART_FIFOLevel_3_4 = UART_IFLS_TXIFLSEL_Lvl34, /*!< Заполнение/опустошение FIFO на 3/4 */ UART_FIFOLevel_7_8 = UART_IFLS_TXIFLSEL_Lvl78 /*!< Заполнение/опустошение FIFO на 7/8 */ } UART_FIFOLevel_TypeDef; #define IS_UART_FIFO_LEVEL(VALUE) (((VALUE) == UART_FIFOLevel_1_8) || \ ((VALUE) == UART_FIFOLevel_1_4) || \ ((VALUE) == UART_FIFOLevel_1_2) || \ ((VALUE) == UART_FIFOLevel_3_4) || \ ((VALUE) == UART_FIFOLevel_7_8)) /** * @brief Структура инициализации UART */ typedef struct { UART_StopBit_TypeDef StopBit; /*!< Выбор режима передачи стопового бита */ UART_ParityBit_TypeDef ParityBit; /*!< Выбор режима бита четности */ UART_DataWidth_TypeDef DataWidth; /*!< Количество передаваемых/принимаемых информационных бит */ uint32_t BaudRate; /*!< Желаемая скорость передачи данных в бит/с */ FunctionalState FIFO; /*!< Разрешение режима FIFO буфера приемника и передатчика */ FunctionalState Rx; /*!< Разрешение приема */ FunctionalState Tx; /*!< Разрешение передачи */ } UART_Init_TypeDef; /** * @} */ /** @defgroup UART_Exported_Functions Функции * @{ */ void UART_AutoBaudConfig(UART_TypeDef* UARTx, uint32_t BaudRate); /** * @brief Разрешение работы выбранного UART * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_Cmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->CR_bit.UARTEN, State); } /** * @brief Настройка ширины слова данных * @param UARTx Выбор модуля UART, где x=0|1 * @param DataWidth Значение разрядности слова * @retval void */ __STATIC_INLINE void UART_DataWidthConfig(UART_TypeDef* UARTx, UART_DataWidth_TypeDef DataWidth) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_DATA_WIDTH(DataWidth)); WRITE_REG(UARTx->LCRH_bit.WLEN, DataWidth); } /** * @brief Настройка количества стоп-бит * @param UARTx Выбор модуля UART, где x=0|1 * @param StopBit Количество стоп-бит * @retval void */ __STATIC_INLINE void UART_StopBitConfig(UART_TypeDef* UARTx, UART_StopBit_TypeDef StopBit) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_STOP_BIT(StopBit)); WRITE_REG(UARTx->LCRH_bit.STP2, StopBit); } /** * @brief Настройка режима бита четности * @param UARTx Выбор модуля UART, где x=0|1 * @param ParityBit Режим * @retval void */ __STATIC_INLINE void UART_ParityBitConfig(UART_TypeDef* UARTx, UART_ParityBit_TypeDef ParityBit) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_PARITY_BIT(ParityBit)); MODIFY_REG(UARTx->LCRH, UART_LCRH_PEN_Msk | UART_LCRH_SPS_Msk | UART_LCRH_EPS_Msk, ParityBit); } /** * @brief Ручная настройка делителя для реализации необходимой скорости передачи * @param UARTx Выбор модуля UART, где x=0|1 * @param IntDiv Целая часть делителя. * Параметр принимает любое значение из диапазона 1-65535. * @param FracDiv Дробная часть делителя. * Параметр принимает любое значение из диапазона 0-63. В случае, если IntDiv * равен 65535, значение FracDiv может быть только 0. * @retval void */ __STATIC_INLINE void UART_BaudDivConfig(UART_TypeDef* UARTx, uint32_t IntDiv, uint32_t FracDiv) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_INT_DIV(IntDiv)); assert_param(IS_UART_FRAC_DIV(FracDiv)); WRITE_REG(UARTx->IBRD, IntDiv); WRITE_REG(UARTx->FBRD, FracDiv); } /** * @brief Включение разрыва линии * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_BreakCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->LCRH_bit.BRK, State); } /** * @brief Включение FIFO * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_FIFOCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->LCRH_bit.FEN, State); } /** * @brief Разрешение приема * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_RxCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->CR_bit.RXE, State); } /** * @brief Разрешение передачи * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_TxCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->CR_bit.TXE, State); } /** @defgroup UART_Init_Deinit Инициализация и деинициализация * @{ */ void UART_DeInit(UART_TypeDef* UARTx); void UART_Init(UART_TypeDef* UARTx, UART_Init_TypeDef* InitStruct); void UART_StructInit(UART_Init_TypeDef* InitStruct); /** * @} */ /** @defgroup UART_SendRecieve Прием и передача * @{ */ /** * @brief Передача слова данных * @param UARTx Выбор модуля UART, где x=0|1 * @param Data Слово данных (биты 7-0) * @retval void */ __STATIC_INLINE void UART_SendData(UART_TypeDef* UARTx, uint32_t Data) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_DATA(Data)); WRITE_REG(UARTx->DR, Data); } /** * @brief Прием слова данных * @param UARTx Выбор модуля UART, где x=0|1 * @retval Val Слово данных */ __STATIC_INLINE uint32_t UART_RecieveData(UART_TypeDef* UARTx) { assert_param(IS_UART_PERIPH(UARTx)); return READ_REG(UARTx->DR_bit.DATA); } /** * @brief Запрос состояния выбранного флага * @param UARTx Выбор модуля UART, где x=0|1 * @param Flag Выбор флагов. * Параметр принимает любую совокупность значений UART_Flag_x из @ref UART_Flag_Define. * @retval Status Состояние флага. Если выбрано несколько флагов, * то результат соответсвует логическому ИЛИ их состояний. */ __STATIC_INLINE FlagStatus UART_FlagStatus(UART_TypeDef* UARTx, uint32_t Flag) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_FLAG(Flag)); return (FlagStatus)READ_BIT(UARTx->FR, Flag); } /** * @brief Запрос состояния выбранного флага ошибки * @param UARTx Выбор модуля UART, где x=0|1 * @param Error Выбор флагов ошибки. * Параметр принимает любую совокупность значений UART_Error_x из @ref UART_Error_Define. * @retval Status Состояние флага. Если выбрано несколько флагов, * то результат соответсвует логическому ИЛИ их состояний. */ __STATIC_INLINE FlagStatus UART_ErrorStatus(UART_TypeDef* UARTx, uint32_t Error) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_ERROR(Error)); return (FlagStatus)READ_BIT(UARTx->RSR, Error); } /** * @brief Очистка флагов ошибки * @param UARTx Выбор модуля UART, где x=0|1 * @param Error Выбор флагов ошибки. * Параметр принимает любую совокупность значений UART_Error_x из @ref UART_Error_Define. * @retval void */ __STATIC_INLINE void UART_ErrorStatusClear(UART_TypeDef* UARTx, uint32_t Error) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_ERROR(Error)); WRITE_REG(UARTx->RSR, Error); } /** * @} */ /** @defgroup UART_IT Прерывания * @{ */ /** * @brief Настройка порога заполнения FIFO при приёме для генерации прерывания * @param UARTx Выбор модуля UART, где x=0|1 * @param FIFOLevelRx Порог * @retval void */ __STATIC_INLINE void UART_ITFIFOLevelRxConfig(UART_TypeDef* UARTx, UART_FIFOLevel_TypeDef FIFOLevelRx) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_FIFO_LEVEL(FIFOLevelRx)); WRITE_REG(UARTx->IFLS_bit.RXIFLSEL, FIFOLevelRx); } /** * @brief Настройка порога опустошения FIFO при передаче для генерации прерывания * @param UARTx Выбор модуля UART, где x=0|1 * @param FIFOLevelTx Порог * @retval void */ __STATIC_INLINE void UART_ITFIFOLevelTxConfig(UART_TypeDef* UARTx, UART_FIFOLevel_TypeDef FIFOLevelTx) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_FIFO_LEVEL(FIFOLevelTx)); WRITE_REG(UARTx->IFLS_bit.TXIFLSEL, FIFOLevelTx); } /** * @brief Маскирование выбранных прерываний * @param UARTx Выбор модуля UART, где x=0|1 * @param ITSource Выбор прерываний. * Параметр принимает любую совокупность значений UART_ITSource_x из @ref UART_ITSource_Define. * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_ITCmd(UART_TypeDef* UARTx, uint32_t ITSource, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_IT_SOURCE(ITSource)); MODIFY_REG(UARTx->IMSC, ITSource, State ? ITSource : 0); } /** * @brief Запрос немаскированного состояния прерывания * @param UARTx Выбор модуля UART, где x=0|1 * @param ITSource Выбор прерываний. * Параметр принимает любую совокупность значений UART_ITSource_x из @ref UART_ITSource_Define. * @retval Status Состояние флага. Если выбрано несколько прерываний, * то результат соответсвует логическому ИЛИ их состояний. */ __STATIC_INLINE FlagStatus UART_ITRawStatus(UART_TypeDef* UARTx, uint32_t ITSource) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_IT_SOURCE(ITSource)); return (FlagStatus)READ_BIT(UARTx->RIS, ITSource); } /** * @brief Запрос маскированного состояния прерывания * @param UARTx Выбор модуля UART, где x=0|1 * @param ITSource Выбор прерываний. * Параметр принимает любую совокупность значений UART_ITSource_x из @ref UART_ITSource_Define. * @retval Status Состояние флага. Если выбрано несколько прерываний, * то результат соответсвует логическому ИЛИ их состояний. */ __STATIC_INLINE FlagStatus UART_ITMaskedStatus(UART_TypeDef* UARTx, uint32_t ITSource) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_IT_SOURCE(ITSource)); return (FlagStatus)READ_BIT(UARTx->MIS, ITSource); } /** * @brief Сброс флагов состояния выбранных прерываний * @param UARTx Выбор модуля UART, где x=0|1 * @param ITSource Выбор прерываний. * Параметр принимает любую совокупность значений UART_ITSource_x из @ref UART_ITSource_Define. * @retval void */ __STATIC_INLINE void UART_ITStatusClear(UART_TypeDef* UARTx, uint32_t ITSource) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_IT_SOURCE(ITSource)); WRITE_REG(UARTx->ICR, ITSource); } /** * @} */ /** @defgroup UART_DMA Настройка DMA * @{ */ /** * @brief Управление блокированием запросов DMA от приемника в случае возникновения * прерывания по ошибке * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_DMABlkOnErrCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->DMACR_bit.DMAONERR, State); } /** * @brief Разрешение формирования запросов DMA для обслуживания буфера приемника * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_DMARxCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->DMACR_bit.RXDMAE, State); } /** * @brief Разрешение формирования запросов DMA для обслуживания буфера передатчика * @param UARTx Выбор модуля UART, где x=0|1 * @param State Выбор состояния * @retval void */ __STATIC_INLINE void UART_DMATxCmd(UART_TypeDef* UARTx, FunctionalState State) { assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(UARTx->DMACR_bit.TXDMAE, State); } /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif /* __PLIB035_UART_H */ /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2018 NIIET *****END OF FILE****/