NIIETCM4 PD  v0.8.0
Драйвер периферии для микроконтроллеров на базе ядра ARM Cortex-M4
niietcm4_uart.c
См. документацию.
1 
29 /* Includes ------------------------------------------------------------------*/
30 #include "niietcm4_uart.h"
31 
69 void UART_Cmd(NT_UART_TypeDef* UARTx, FunctionalState State)
70 {
71  assert_param(IS_UART_ALL_PERIPH(UARTx));
72  assert_param(IS_FUNCTIONAL_STATE(State));
73 
74  UARTx->CR_bit.UARTEN = (uint32_t)State;
75 }
76 
88 void UART_BaudRateDivConfig(NT_UART_TypeDef* UARTx, uint32_t IntDiv, uint32_t FracDiv)
89 {
90  assert_param(IS_UART_ALL_PERIPH(UARTx));
91  assert_param(IS_UART_INT_DIV(IntDiv));
92  assert_param(IS_UART_FRAC_DIV(FracDiv));
93 
94  UARTx->IBRD = IntDiv;
95  UARTx->FBRD = FracDiv;
96 }
97 
106 void UART_Break(NT_UART_TypeDef* UARTx, FunctionalState State)
107 {
108  assert_param(IS_UART_ALL_PERIPH(UARTx));
109  assert_param(IS_FUNCTIONAL_STATE(State));
110 
111  UARTx->LCR_H_bit.BRK = (uint32_t)State;
112 }
113 
120 void UART_DeInit(NT_UART_TypeDef* UARTx)
121 {
122  RCC_PeriphRst_TypeDef UartRst;
123  assert_param(IS_UART_ALL_PERIPH(UARTx));
124 
125  if (UARTx == NT_UART0)
126  {
127  UartRst = RCC_PeriphRst_UART0;
128 
129  }
130  else if (UARTx == NT_UART1)
131  {
132  UartRst = RCC_PeriphRst_UART1;
133 
134  }
135  else if (UARTx == NT_UART2)
136  {
137  UartRst = RCC_PeriphRst_UART2;
138 
139  }
140  else /* (UARTx == NT_UART3) */
141  {
142  UartRst = RCC_PeriphRst_UART3;
143 
144  }
145 
146  RCC_PeriphRstCmd(UartRst, DISABLE);
147  RCC_PeriphRstCmd(UartRst, ENABLE);
148 }
149 
159 OperationStatus UART_Init(NT_UART_TypeDef* UARTx, UART_Init_TypeDef* UART_InitStruct)
160 {
161  OperationStatus Status = ERROR;
162  uint32_t IntDiv, FracDiv;
163 
164  assert_param(IS_UART_ALL_PERIPH(UARTx));
165  assert_param(IS_UART_DATA_WIDTH(UART_InitStruct->UART_DataWidth));
166  assert_param(IS_FUNCTIONAL_STATE(UART_InitStruct->UART_FIFOEn));
167  assert_param(IS_UART_FIFO_LEVEL(UART_InitStruct->UART_FIFOLevelRx));
168  assert_param(IS_UART_FIFO_LEVEL(UART_InitStruct->UART_FIFOLevelTx));
169  assert_param(IS_UART_PARITY_BIT(UART_InitStruct->UART_ParityBit));
170  assert_param(IS_FUNCTIONAL_STATE(UART_InitStruct->UART_RxEn));
171  assert_param(IS_UART_STOP_BIT(UART_InitStruct->UART_StopBit));
172  assert_param(IS_FUNCTIONAL_STATE(UART_InitStruct->UART_TxEn));
173 
174  if (((UART_InitStruct->UART_ClkFreq*5)/3) < (UART_InitStruct->UART_BaudRate*16))
175  {
176  return Status;
177  }
178  IntDiv = UART_InitStruct->UART_ClkFreq/(16*UART_InitStruct->UART_BaudRate);
179  FracDiv = (uint32_t)((UART_InitStruct->UART_ClkFreq/(16.0*UART_InitStruct->UART_BaudRate)-IntDiv)*64.0+0.5);
180  UARTx->IBRD = IntDiv;
181  UARTx->FBRD = FracDiv;
182  UARTx->LCR_H_bit.WLEN = (uint32_t)UART_InitStruct->UART_DataWidth;
183  UARTx->LCR_H_bit.STP2 = (uint32_t)UART_InitStruct->UART_StopBit;
184  if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Odd)
185  {
186  UARTx->LCR_H_bit.SPS = 0;
187  UARTx->LCR_H_bit.EPS = 0;
188  UARTx->LCR_H_bit.PEN = 1;
189  }
190  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Even)
191  {
192  UARTx->LCR_H_bit.SPS = 0;
193  UARTx->LCR_H_bit.EPS = 1;
194  UARTx->LCR_H_bit.PEN = 1;
195  }
196  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_High)
197  {
198  UARTx->LCR_H_bit.SPS = 1;
199  UARTx->LCR_H_bit.EPS = 0;
200  UARTx->LCR_H_bit.PEN = 1;
201  }
202  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Low)
203  {
204  UARTx->LCR_H_bit.SPS = 1;
205  UARTx->LCR_H_bit.EPS = 1;
206  UARTx->LCR_H_bit.PEN = 1;
207  }
208  else /* UART_InitStruct->UART_ParityBit == UART_ParityBit_Disable */
209  {
210  UARTx->LCR_H_bit.PEN = 0;
211  }
212  UARTx->LCR_H_bit.FEN = (uint32_t)UART_InitStruct->UART_FIFOEn;
213  UARTx->IFLS_bit.RXIFLSEL = (uint32_t)UART_InitStruct->UART_FIFOLevelRx;
214  UARTx->IFLS_bit.TXIFLSEL = (uint32_t)UART_InitStruct->UART_FIFOLevelTx;
215  UARTx->CR_bit.TXE = (uint32_t)UART_InitStruct->UART_TxEn;
216  UARTx->CR_bit.RXE = (uint32_t)UART_InitStruct->UART_RxEn;
217 
218  Status = OK;
219  return Status;
220 }
221 
229 void UART_StructInit(UART_Init_TypeDef* UART_InitStruct)
230 {
231  UART_InitStruct->UART_BaudRate = 9600;
232  UART_InitStruct->UART_ClkFreq = EXT_OSC_VALUE;
233  UART_InitStruct->UART_DataWidth = UART_DataWidth_8;
234  UART_InitStruct->UART_FIFOLevelRx = UART_FIFOLevel_1_2;
235  UART_InitStruct->UART_FIFOLevelTx = UART_FIFOLevel_1_2;
236  UART_InitStruct->UART_FIFOEn = DISABLE;
237  UART_InitStruct->UART_ParityBit = UART_ParityBit_Disable;
238  UART_InitStruct->UART_StopBit = UART_StopBit_1;
239  UART_InitStruct->UART_RxEn = ENABLE;
240  UART_InitStruct->UART_TxEn = ENABLE;
241 }
242 
250 void UART_SendData(NT_UART_TypeDef* UARTx, uint32_t Data)
251 {
252  assert_param(IS_UART_ALL_PERIPH(UARTx));
253  assert_param(IS_UART_DATA(Data));
254 
255  UARTx->DR_bit.DATA = Data;
256 }
257 
264 uint32_t UART_RecieveData(NT_UART_TypeDef* UARTx)
265 {
266  assert_param(IS_UART_ALL_PERIPH(UARTx));
267 
268  return(UARTx->DR_bit.DATA);
269 }
270 
279 FlagStatus UART_FlagStatus(NT_UART_TypeDef* UARTx, UART_Flag_Typedef UART_Flag)
280 {
281  FlagStatus Status;
282  assert_param(IS_UART_ALL_PERIPH(UARTx));
283  assert_param(IS_UART_FLAG(UART_Flag));
284 
285  if (UARTx->FR & (1<<UART_Flag))
286  {
287  Status = Flag_SET;
288  }
289  else
290  {
291  Status = Flag_CLEAR;
292  }
293 
294  return Status;
295 }
296 
305 FlagStatus UART_ErrorStatus(NT_UART_TypeDef* UARTx, UART_Error_Typedef UART_Error)
306 {
307  FlagStatus Status;
308  assert_param(IS_UART_ALL_PERIPH(UARTx));
309  assert_param(IS_UART_ERROR(UART_Error));
310 
311  if (UARTx->RSR_ECR & (1<<UART_Error))
312  {
313  Status = Flag_SET;
314  }
315  else
316  {
317  Status = Flag_CLEAR;
318  }
319 
320  return Status;
321 }
322 
329 void UART_ErrorStatusClear(NT_UART_TypeDef* UARTx)
330 {
331  assert_param(IS_UART_ALL_PERIPH(UARTx));
332 
333  UARTx->RSR_ECR = 0xF;
334 }
335 
336 
344 void UART_ModemConfig(NT_UART_TypeDef* UARTx, UART_ModemInit_TypeDef* UART_ModemInitStruct)
345 {
346  assert_param(IS_UART_ALL_PERIPH(UARTx));
347  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_InvDTR));
348  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_InvRTS));
349  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_CTSEn));
350  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_RTSEn));
351 
352  UARTx->CR_bit.DTR = (uint32_t)UART_ModemInitStruct->UART_InvDTR;
353  UARTx->CR_bit.RTS = (uint32_t)UART_ModemInitStruct->UART_InvRTS;
354  UARTx->CR_bit.CTSEN = (uint32_t)UART_ModemInitStruct->UART_CTSEn;
355  UARTx->CR_bit.RTSEN = (uint32_t)UART_ModemInitStruct->UART_RTSEn;
356 }
357 
365 void UART_ModemStructInit(UART_ModemInit_TypeDef* UART_ModemInitStruct)
366 {
367  UART_ModemInitStruct->UART_InvDTR = DISABLE;
368  UART_ModemInitStruct->UART_InvRTS = DISABLE;
369  UART_ModemInitStruct->UART_CTSEn = DISABLE;
370  UART_ModemInitStruct->UART_RTSEn = DISABLE;
371 }
372 
384 void UART_ITFIFOLevelConfig(NT_UART_TypeDef* UARTx, UART_Dir_Typedef UART_Dir, UART_FIFOLevel_TypeDef UART_FIFOLevel)
385 {
386  assert_param(IS_UART_ALL_PERIPH(UARTx));
387  assert_param(IS_UART_DIR(UART_Dir));
388  assert_param(IS_UART_FIFO_LEVEL(UART_FIFOLevel));
389 
390  if (UART_Dir == UART_Dir_Rx)
391  {
392  UARTx->IFLS_bit.RXIFLSEL = (uint32_t)UART_FIFOLevel;
393  }
394  else /* if (UART_Dir == UART_Dir_Tx) */
395  {
396  UARTx->IFLS_bit.TXIFLSEL = (uint32_t)UART_FIFOLevel;
397  }
398 }
399 
410 void UART_ITCmd(NT_UART_TypeDef* UARTx, UART_ITSource_Typedef UART_ITSource, FunctionalState State)
411 {
412  assert_param(IS_UART_ALL_PERIPH(UARTx));
413  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
414 
415  if (State == ENABLE)
416  {
417  UARTx->IMSC |= (uint32_t)UART_ITSource;
418  }
419  else
420  {
421  UARTx->IMSC &= ~(uint32_t)UART_ITSource;
422  }
423 }
424 
433 FlagStatus UART_ITRawStatus(NT_UART_TypeDef* UARTx, UART_ITSource_Typedef UART_ITSource)
434 {
435  FlagStatus Status;
436  assert_param(IS_UART_ALL_PERIPH(UARTx));
437  assert_param(IS_UART_GET_IT_SOURCE(UART_ITSource));
438 
439  if (UARTx->RIS & UART_ITSource)
440  {
441  Status = Flag_SET;
442  }
443  else
444  {
445  Status = Flag_CLEAR;
446  }
447 
448  return Status;
449 }
450 
459 FlagStatus UART_ITMaskedStatus(NT_UART_TypeDef* UARTx, UART_ITSource_Typedef UART_ITSource)
460 {
461  FlagStatus Status;
462  assert_param(IS_UART_ALL_PERIPH(UARTx));
463  assert_param(IS_UART_GET_IT_SOURCE(UART_ITSource));
464 
465  if (UARTx->MIS & UART_ITSource)
466  {
467  Status = Flag_SET;
468  }
469  else
470  {
471  Status = Flag_CLEAR;
472  }
473 
474  return Status;
475 }
476 
485 void UART_ITStatusClear(NT_UART_TypeDef* UARTx, UART_ITSource_Typedef UART_ITSource)
486 {
487  assert_param(IS_UART_ALL_PERIPH(UARTx));
488  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
489 
490  UARTx->ICR = (uint32_t)UART_ITSource;
491 }
492 
502 void UART_DMABlkOnErrCmd(NT_UART_TypeDef* UARTx, FunctionalState State)
503 {
504  assert_param(IS_UART_ALL_PERIPH(UARTx));
505  assert_param(IS_FUNCTIONAL_STATE(State));
506 
507  UARTx->DMACR_bit.DMAONERR = (uint32_t)State;
508 }
509 
520 void UART_DMACmd(NT_UART_TypeDef* UARTx, UART_Dir_Typedef UART_Dir, FunctionalState State)
521 {
522  assert_param(IS_UART_ALL_PERIPH(UARTx));
523  assert_param(IS_UART_DIR(UART_Dir));
524  assert_param(IS_FUNCTIONAL_STATE(State));
525 
526  if (UART_Dir == UART_Dir_Rx)
527  {
528  UARTx->DMACR_bit.RXDMAE = (uint32_t)State;
529  }
530  else /* if (UART_Dir == UART_Dir_Tx) */
531  {
532  UARTx->DMACR_bit.TXDMAE = (uint32_t)State;
533  }
534 }
535 
552 /******************* (C) COPYRIGHT 2015 NIIET *****END OF FILE****/
void UART_ModemStructInit(UART_ModemInit_TypeDef *UART_ModemInitStruct)
Заполнение каждого члена структуры UART_ModemInitStruct значениями по умолчанию.
FlagStatus UART_ITRawStatus(NT_UART_TypeDef *UARTx, UART_ITSource_Typedef UART_ITSource)
Запрос немаскированного состояния прерывания.
UART_Flag_Typedef
Перечень флагов.
Definition: niietcm4_uart.h:74
FunctionalState UART_RTSEn
FunctionalState UART_RxEn
UART_DataWidth_TypeDef UART_DataWidth
#define IS_UART_IT_SOURCE(IT_SOURCE)
Макрос проверки аргументов типа UART_ITSource_Typedef.
FunctionalState
Описывает логическое состояние периферии. Используется для операций включения/выключения периферийных...
Definition: niietcm4.h:157
FunctionalState UART_InvRTS
FlagStatus UART_ErrorStatus(NT_UART_TypeDef *UARTx, UART_Error_Typedef UART_Error)
Запрос состояния выбранного флага ошибки.
Структура инициализации UART.
void UART_StructInit(UART_Init_TypeDef *UART_InitStruct)
Заполнение каждого члена структуры UART_InitStruct значениями по умолчанию.
UART_FIFOLevel_TypeDef UART_FIFOLevelTx
#define IS_UART_ALL_PERIPH(PERIPH)
Макрос проверки аргументов типа NT_UART_TypeDef.
Definition: niietcm4.h:214
uint32_t UART_RecieveData(NT_UART_TypeDef *UARTx)
Прием слова данных.
void UART_ITCmd(NT_UART_TypeDef *UARTx, UART_ITSource_Typedef UART_ITSource, FunctionalState State)
Маскирование выбранных прерываний.
FunctionalState UART_TxEn
#define IS_UART_ERROR(ERROR)
Макрос проверки аргументов типа UART_Error_Typedef.
FlagStatus
Описывает возможные состояния флага при запросе его статуса.
Definition: niietcm4.h:183
FlagStatus UART_FlagStatus(NT_UART_TypeDef *UARTx, UART_Flag_Typedef UART_Flag)
Запрос состояния выбранного флага.
void RCC_PeriphRstCmd(RCC_PeriphRst_TypeDef RCC_PeriphRst, FunctionalState State)
Вывод из состояния сброса периферийных блоков.
Definition: niietcm4_rcc.c:869
#define IS_UART_FIFO_LEVEL(FIFO_LEVEL)
Макрос проверки аргументов типа UART_FIFOLevel_TypeDef.
void UART_SendData(NT_UART_TypeDef *UARTx, uint32_t Data)
Передача слова данных.
#define IS_UART_INT_DIV(INT_DIV)
Макрос проверки соответсвия величины целой части делителя baudrate UART диапазону.
Definition: niietcm4_uart.h:56
#define IS_UART_FRAC_DIV(FRAC_DIV)
Макрос проверки соответсвия величины дробной части делителя baudrate UART диапазону.
Definition: niietcm4_uart.h:62
Файл содержит все прототипы функций для UART.
void UART_ITStatusClear(NT_UART_TypeDef *UARTx, UART_ITSource_Typedef UART_ITSource)
Сброс флагов состояния выбранных прерываний.
void UART_DMABlkOnErrCmd(NT_UART_TypeDef *UARTx, FunctionalState State)
Управление блокированием запросов DMA от приемника в случае возникновения прерывания по ошибке...
void UART_ITFIFOLevelConfig(NT_UART_TypeDef *UARTx, UART_Dir_Typedef UART_Dir, UART_FIFOLevel_TypeDef UART_FIFOLevel)
Выбор порог заполнения буфера приемника/передатчика, по достижению которого будет генерироваться прер...
void UART_Cmd(NT_UART_TypeDef *UARTx, FunctionalState State)
Разрешение работы выбранного UART.
Definition: niietcm4_uart.c:69
void UART_ErrorStatusClear(NT_UART_TypeDef *UARTx)
Очистка флагов ошибки.
void UART_ModemConfig(NT_UART_TypeDef *UARTx, UART_ModemInit_TypeDef *UART_ModemInitStruct)
Инициализирует модемный режим UART согласно параметрам структуры UART_ModemInitStruct.
uint32_t UART_BaudRate
void UART_DeInit(NT_UART_TypeDef *UARTx)
Устанавливает все регистры UART значениями по умолчанию.
FunctionalState UART_CTSEn
#define IS_UART_STOP_BIT(STOP_BIT)
Макрос проверки аргументов типа UART_StopBit_TypeDef.
OperationStatus
Описывает коды возврата для функций при выполнении какой-либо операции.
Definition: niietcm4.h:173
FunctionalState UART_InvDTR
UART_ParityBit_TypeDef UART_ParityBit
OperationStatus UART_Init(NT_UART_TypeDef *UARTx, UART_Init_TypeDef *UART_InitStruct)
Инициализирует UARTx согласно параметрам структуры UART_InitStruct.
void UART_DMACmd(NT_UART_TypeDef *UARTx, UART_Dir_Typedef UART_Dir, FunctionalState State)
Разрешение формирования запросов DMA для обслуживания буфера передатчика/приемника ...
#define IS_FUNCTIONAL_STATE(STATE)
Макрос проверки аргументов типа FunctionalState.
Definition: niietcm4.h:167
RCC_PeriphRst_TypeDef
Управление сбросом периферийных блоков
Definition: niietcm4_rcc.h:294
UART_Error_Typedef
Перечень ошибок приемника.
#define IS_UART_FLAG(FLAG)
Макрос проверки аргументов типа UART_Flag_Typedef.
Definition: niietcm4_uart.h:91
FlagStatus UART_ITMaskedStatus(NT_UART_TypeDef *UARTx, UART_ITSource_Typedef UART_ITSource)
Запрос маскированного состояния прерывания.
Структура инициализации модемного режима.
UART_Dir_Typedef
Направления передачи UART.
UART_StopBit_TypeDef UART_StopBit
#define IS_UART_DATA(DATA)
Макрос проверки корректности передаваемых данных.
Definition: niietcm4_uart.h:68
void UART_BaudRateDivConfig(NT_UART_TypeDef *UARTx, uint32_t IntDiv, uint32_t FracDiv)
Ручная настройка делителя для реализации необходимой скорости передачи.
Definition: niietcm4_uart.c:88
UART_ITSource_Typedef
Источники прерываний UART.
#define EXT_OSC_VALUE
Определение частоты используемого внешнего тактового генератора.
Definition: niietcm4.h:73
#define IS_UART_PARITY_BIT(PARITY_BIT)
Макрос проверки аргументов типа UART_ParityBit_TypeDef.
#define IS_UART_GET_IT_SOURCE(IT_SOURCE)
Макрос проверки номера пина при работе с пинами по отдельности.
UART_FIFOLevel_TypeDef UART_FIFOLevelRx
void UART_Break(NT_UART_TypeDef *UARTx, FunctionalState State)
Включение разрыва линии.
UART_FIFOLevel_TypeDef
Порог заполнения буфера приемника/передатчика, по достижению которого будет генерироваться прерывание...
#define IS_UART_DIR(DIR)
Макрос проверки аргументов типа UART_Dir_Typedef.
#define IS_UART_DATA_WIDTH(DATA_WIDTH)
Макрос проверки аргументов типа UART_DataWidth_TypeDef.
FunctionalState UART_FIFOEn