NIIETCM4 PD  v0.9.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  UART_BaudRateDivConfig(UARTx, IntDiv, FracDiv);
181  UARTx->LCR_H_bit.WLEN = (uint32_t)UART_InitStruct->UART_DataWidth;
182  UARTx->LCR_H_bit.STP2 = (uint32_t)UART_InitStruct->UART_StopBit;
183  if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Odd)
184  {
185  UARTx->LCR_H_bit.SPS = 0;
186  UARTx->LCR_H_bit.EPS = 0;
187  UARTx->LCR_H_bit.PEN = 1;
188  }
189  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Even)
190  {
191  UARTx->LCR_H_bit.SPS = 0;
192  UARTx->LCR_H_bit.EPS = 1;
193  UARTx->LCR_H_bit.PEN = 1;
194  }
195  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_High)
196  {
197  UARTx->LCR_H_bit.SPS = 1;
198  UARTx->LCR_H_bit.EPS = 0;
199  UARTx->LCR_H_bit.PEN = 1;
200  }
201  else if (UART_InitStruct->UART_ParityBit == UART_ParityBit_Low)
202  {
203  UARTx->LCR_H_bit.SPS = 1;
204  UARTx->LCR_H_bit.EPS = 1;
205  UARTx->LCR_H_bit.PEN = 1;
206  }
207  else /* UART_InitStruct->UART_ParityBit == UART_ParityBit_Disable */
208  {
209  UARTx->LCR_H_bit.PEN = 0;
210  }
211  UARTx->LCR_H_bit.FEN = (uint32_t)UART_InitStruct->UART_FIFOEn;
212  UARTx->IFLS_bit.RXIFLSEL = (uint32_t)UART_InitStruct->UART_FIFOLevelRx;
213  UARTx->IFLS_bit.TXIFLSEL = (uint32_t)UART_InitStruct->UART_FIFOLevelTx;
214  UARTx->CR_bit.TXE = (uint32_t)UART_InitStruct->UART_TxEn;
215  UARTx->CR_bit.RXE = (uint32_t)UART_InitStruct->UART_RxEn;
216 
217  Status = OK;
218  return Status;
219 }
220 
228 void UART_StructInit(UART_Init_TypeDef* UART_InitStruct)
229 {
230  UART_InitStruct->UART_BaudRate = 9600;
231  UART_InitStruct->UART_ClkFreq = EXT_OSC_VALUE;
232  UART_InitStruct->UART_DataWidth = UART_DataWidth_8;
233  UART_InitStruct->UART_FIFOLevelRx = UART_FIFOLevel_1_2;
234  UART_InitStruct->UART_FIFOLevelTx = UART_FIFOLevel_1_2;
235  UART_InitStruct->UART_FIFOEn = DISABLE;
236  UART_InitStruct->UART_ParityBit = UART_ParityBit_Disable;
237  UART_InitStruct->UART_StopBit = UART_StopBit_1;
238  UART_InitStruct->UART_RxEn = ENABLE;
239  UART_InitStruct->UART_TxEn = ENABLE;
240 }
241 
249 void UART_SendData(NT_UART_TypeDef* UARTx, uint32_t Data)
250 {
251  assert_param(IS_UART_ALL_PERIPH(UARTx));
252  assert_param(IS_UART_DATA(Data));
253 
254  /*
255  * В младшем байте Data находятся данные для передачи в линию.
256  * Все остальные биты при записи в регистр данных аппартно игнорируются.
257  * Запись в регистр DR идет напрямую, а не через поле DR_bit.DATA,
258  * т.к. запись в поле развернется в процедуру Чтение-Модификация-Запись,
259  * которая может привести к ошибкам, когда происходит одновременный прием данных и передача.
260  */
261  UARTx->DR = Data;
262 }
263 
270 uint32_t UART_RecieveData(NT_UART_TypeDef* UARTx)
271 {
272  assert_param(IS_UART_ALL_PERIPH(UARTx));
273 
274  return(UARTx->DR_bit.DATA);
275 }
276 
286 FlagStatus UART_FlagStatus(NT_UART_TypeDef* UARTx, uint32_t UART_Flag)
287 {
288  FlagStatus Status;
289  assert_param(IS_UART_ALL_PERIPH(UARTx));
290  assert_param(IS_UART_FLAG(UART_Flag));
291 
292  if (UARTx->FR & UART_Flag)
293  {
294  Status = Flag_SET;
295  }
296  else
297  {
298  Status = Flag_CLEAR;
299  }
300 
301  return Status;
302 }
303 
313 FlagStatus UART_ErrorStatus(NT_UART_TypeDef* UARTx, uint32_t UART_Error)
314 {
315  FlagStatus Status;
316  assert_param(IS_UART_ALL_PERIPH(UARTx));
317  assert_param(IS_UART_ERROR(UART_Error));
318 
319  if (UARTx->RSR_ECR & UART_Error)
320  {
321  Status = Flag_SET;
322  }
323  else
324  {
325  Status = Flag_CLEAR;
326  }
327 
328  return Status;
329 }
330 
339 void UART_ErrorStatusClear(NT_UART_TypeDef* UARTx, uint32_t UART_Error)
340 {
341  assert_param(IS_UART_ALL_PERIPH(UARTx));
342  assert_param(IS_UART_ERROR(UART_Error));
343 
344  UARTx->RSR_ECR = UART_Error;
345 }
346 
347 
355 void UART_ModemConfig(NT_UART_TypeDef* UARTx, UART_ModemInit_TypeDef* UART_ModemInitStruct)
356 {
357  assert_param(IS_UART_ALL_PERIPH(UARTx));
358  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_InvDTR));
359  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_InvRTS));
360  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_CTSEn));
361  assert_param(IS_FUNCTIONAL_STATE(UART_ModemInitStruct->UART_RTSEn));
362 
363  UARTx->CR_bit.DTR = (uint32_t)UART_ModemInitStruct->UART_InvDTR;
364  UARTx->CR_bit.RTS = (uint32_t)UART_ModemInitStruct->UART_InvRTS;
365  UARTx->CR_bit.CTSEN = (uint32_t)UART_ModemInitStruct->UART_CTSEn;
366  UARTx->CR_bit.RTSEN = (uint32_t)UART_ModemInitStruct->UART_RTSEn;
367 }
368 
376 void UART_ModemStructInit(UART_ModemInit_TypeDef* UART_ModemInitStruct)
377 {
378  UART_ModemInitStruct->UART_InvDTR = DISABLE;
379  UART_ModemInitStruct->UART_InvRTS = DISABLE;
380  UART_ModemInitStruct->UART_CTSEn = DISABLE;
381  UART_ModemInitStruct->UART_RTSEn = DISABLE;
382 }
383 
395 void UART_ITFIFOLevelConfig(NT_UART_TypeDef* UARTx, UART_Dir_Typedef UART_Dir, UART_FIFOLevel_TypeDef UART_FIFOLevel)
396 {
397  assert_param(IS_UART_ALL_PERIPH(UARTx));
398  assert_param(IS_UART_DIR(UART_Dir));
399  assert_param(IS_UART_FIFO_LEVEL(UART_FIFOLevel));
400 
401  if (UART_Dir == UART_Dir_Rx)
402  {
403  UARTx->IFLS_bit.RXIFLSEL = (uint32_t)UART_FIFOLevel;
404  }
405  else /* if (UART_Dir == UART_Dir_Tx) */
406  {
407  UARTx->IFLS_bit.TXIFLSEL = (uint32_t)UART_FIFOLevel;
408  }
409 }
410 
421 void UART_ITCmd(NT_UART_TypeDef* UARTx, uint32_t UART_ITSource, FunctionalState State)
422 {
423  assert_param(IS_UART_ALL_PERIPH(UARTx));
424  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
425 
426  if (State == ENABLE)
427  {
428  UARTx->IMSC |= (uint32_t)UART_ITSource;
429  }
430  else
431  {
432  UARTx->IMSC &= ~(uint32_t)UART_ITSource;
433  }
434 }
435 
445 FlagStatus UART_ITRawStatus(NT_UART_TypeDef* UARTx, uint32_t UART_ITSource)
446 {
447  FlagStatus Status;
448  assert_param(IS_UART_ALL_PERIPH(UARTx));
449  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
450 
451  if (UARTx->RIS & UART_ITSource)
452  {
453  Status = Flag_SET;
454  }
455  else
456  {
457  Status = Flag_CLEAR;
458  }
459 
460  return Status;
461 }
462 
472 FlagStatus UART_ITMaskedStatus(NT_UART_TypeDef* UARTx, uint32_t UART_ITSource)
473 {
474  FlagStatus Status;
475  assert_param(IS_UART_ALL_PERIPH(UARTx));
476  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
477 
478  if (UARTx->MIS & UART_ITSource)
479  {
480  Status = Flag_SET;
481  }
482  else
483  {
484  Status = Flag_CLEAR;
485  }
486 
487  return Status;
488 }
489 
498 void UART_ITStatusClear(NT_UART_TypeDef* UARTx, uint32_t UART_ITSource)
499 {
500  assert_param(IS_UART_ALL_PERIPH(UARTx));
501  assert_param(IS_UART_IT_SOURCE(UART_ITSource));
502 
503  UARTx->ICR = (uint32_t)UART_ITSource;
504 }
505 
515 void UART_DMABlkOnErrCmd(NT_UART_TypeDef* UARTx, FunctionalState State)
516 {
517  assert_param(IS_UART_ALL_PERIPH(UARTx));
518  assert_param(IS_FUNCTIONAL_STATE(State));
519 
520  UARTx->DMACR_bit.DMAONERR = (uint32_t)State;
521 }
522 
533 void UART_DMACmd(NT_UART_TypeDef* UARTx, UART_Dir_Typedef UART_Dir, FunctionalState State)
534 {
535  assert_param(IS_UART_ALL_PERIPH(UARTx));
536  assert_param(IS_UART_DIR(UART_Dir));
537  assert_param(IS_FUNCTIONAL_STATE(State));
538 
539  if (UART_Dir == UART_Dir_Rx)
540  {
541  UARTx->DMACR_bit.RXDMAE = (uint32_t)State;
542  }
543  else /* if (UART_Dir == UART_Dir_Tx) */
544  {
545  UARTx->DMACR_bit.TXDMAE = (uint32_t)State;
546  }
547 }
548 
565 /******************* (C) COPYRIGHT 2015 NIIET *****END OF FILE****/
void UART_ModemStructInit(UART_ModemInit_TypeDef *UART_ModemInitStruct)
Заполнение каждого члена структуры UART_ModemInitStruct значениями по умолчанию.
FunctionalState UART_RTSEn
void UART_ITStatusClear(NT_UART_TypeDef *UARTx, uint32_t UART_ITSource)
Сброс флагов состояния выбранных прерываний.
FunctionalState UART_RxEn
UART_DataWidth_TypeDef UART_DataWidth
FunctionalState
Описывает логическое состояние периферии. Используется для операций включения/выключения периферийных...
Definition: niietcm4.h:157
FunctionalState UART_InvRTS
void UART_ITCmd(NT_UART_TypeDef *UARTx, uint32_t UART_ITSource, FunctionalState State)
Маскирование выбранных прерываний.
Структура инициализации UART.
void UART_StructInit(UART_Init_TypeDef *UART_InitStruct)
Заполнение каждого члена структуры UART_InitStruct значениями по умолчанию.
#define IS_UART_ERROR(ERROR)
Макрос проверки номеров флагов ошибок на попадание в допустимый диапазон.
FlagStatus UART_ErrorStatus(NT_UART_TypeDef *UARTx, uint32_t UART_Error)
Запрос состояния выбранного флага ошибки.
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_ErrorStatusClear(NT_UART_TypeDef *UARTx, uint32_t UART_Error)
Очистка флагов ошибки.
FunctionalState UART_TxEn
FlagStatus
Описывает возможные состояния флага при запросе его статуса.
Definition: niietcm4.h:183
void RCC_PeriphRstCmd(RCC_PeriphRst_TypeDef RCC_PeriphRst, FunctionalState State)
Вывод из состояния сброса периферийных блоков.
Definition: niietcm4_rcc.c:869
#define IS_UART_IT_SOURCE(IT_SOURCE)
Макрос проверки номеров источников прерываний на попадание в допустимый диапазон. ...
#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_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_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.
FlagStatus UART_ITMaskedStatus(NT_UART_TypeDef *UARTx, uint32_t UART_ITSource)
Запрос маскированного состояния прерывания.
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
#define IS_UART_FLAG(FLAG)
Макрос проверки номеров флагов на попадание в допустимый диапазон.
Структура инициализации модемного режима.
FlagStatus UART_FlagStatus(NT_UART_TypeDef *UARTx, uint32_t UART_Flag)
Запрос состояния выбранного флага.
FlagStatus UART_ITRawStatus(NT_UART_TypeDef *UARTx, uint32_t UART_ITSource)
Запрос немаскированного состояния прерывания.
UART_Dir_Typedef
Направления передачи UART.
Definition: niietcm4_uart.h:74
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
#define EXT_OSC_VALUE
Определение частоты используемого внешнего тактового генератора.
Definition: niietcm4.h:73
#define IS_UART_PARITY_BIT(PARITY_BIT)
Макрос проверки аргументов типа UART_ParityBit_TypeDef.
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.
Definition: niietcm4_uart.h:84
#define IS_UART_DATA_WIDTH(DATA_WIDTH)
Макрос проверки аргументов типа UART_DataWidth_TypeDef.
FunctionalState UART_FIFOEn