Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
uart.c
См. документацию.
1 
29 #include <system.h>
30 #include "dma.h"
31 #include "chip_5023BC016.h"
32 #include "uart.h"
33 
34 
35 /*****************************************************************************
36  * Частные функции
37  ****************************************************************************/
38 
41 {
42  CTRL_T CtrlUART;
43  if (pUART == UART1)
44  {
45  CtrlUART = UART_1_CTRL_NUM;
46  }
47  if (pUART == UART2)
48  {
49  CtrlUART = UART_2_CTRL_NUM;
50  }
51  if (pUART == UART3)
52  {
53  CtrlUART = UART_3_CTRL_NUM;
54  }
55  if (pUART == UART4)
56  {
57  CtrlUART = UART_4_CTRL_NUM;
58  }
59  if (pUART == UART5)
60  {
61  CtrlUART = UART_5_CTRL_NUM;
62  }
63  if (pUART == UART6)
64  {
65  CtrlUART = UART_6_CTRL_NUM;
66  }
67  return CtrlUART;
68 }
69 
70 /*****************************************************************************
71  * Общие функции
72  ****************************************************************************/
73 
88 {
89  pUART->ICR = IntClear;
90 }
91 
92 /* Инициализация UART */
93 void UART_Init(UART_T *pUART)
94 {
97 
99  /* Выкючение передатчика */
100  UART_Disable(pUART);
101  UART_RXDisable(pUART);
102  UART_TXDisable(pUART);
103  /* Запрещение прерываний */
105 }
106 
107 /* Деициализация UART */
108 void UART_DeInit(UART_T *pUART)
109 {
110  /* Запрещение прерываний */
112  /* Выключение UART */
113  UART_RXDisable(pUART);
114  UART_TXDisable(pUART);
115  UART_Disable(pUART);
118 }
119 
126 void UART_SetupFIFOS(UART_T *pUART, UART_IFLS rxfifolimit, UART_IFLS txfifolimit)
127 {
128  pUART->IFLS = (rxfifolimit << 3) | txfifolimit;
129 }
130 
131 
146 {
147  return (pUART->MIS & MaskInt) ? SET : RESET;
148 }
149 
150 
157  void UART_SetDivisor(UART_T *pUART, uint32_t IBRD, uint32_t FBRD)
158 {
159  pUART->IBRD = UART_IBRD_BAUDDIV_INT(IBRD);
160  pUART->FBRD = UART_FBRD_BAUDDIV_FRAC(FBRD);
161 }
162 
177 {
178  return (pUART->MIS & MaskInt) ? SET : RESET;
179 }
180 
194  void UART_IntDisable(UART_T *pUART, UART_INTMASK_T IntMask)
195 {
196  pUART->IMSC &= (~IntMask) & UART_IMSC_BITMASK;
197 }
198 
204  uint8_t UART_ReadByte(UART_T *pUART)
205 {
206  return (uint8_t) (pUART->DR);
207 }
208 
222  void UART_IntEnable(UART_T *pUART, UART_INTMASK_T IntMask)
223 {
224  pUART->IMSC |= IntMask;
225 }
226 
232  void UART_Config(UART_T *pUART, uint32_t config)
233 {
234  pUART->LCR_H = config;
235 }
236 
237 
252 {
253  return (pUART->FR & Stat) ? SET : RESET;
254 }
255 
256 /* Передача массива байт по UART'у, без ожидания освобождения FIFO передатчика */
257 uint32_t UART_Send(UART_T *pUART, const void *data, uint32_t numBytes)
258 {
259  int sent = 0;
260  uint8_t *p8 = (uint8_t *) data;
261  /* Передаем данные пока FIFO передатчика не полон или не закончились данные */
262  while ((sent < numBytes) && (!(UART_GetStatus(pUART, UART_FR_TXFF))))
263  {
264  UART_SendByte(pUART, *p8);
265  p8++;
266  sent++;
267  }
268  return sent;
269 }
270 
275  void UART_Disable(UART_T *pUART)
276 {
277  pUART->CR &= (~UART_CR_UARTEN) & UART_CR_BITMASK;;
278 }
279 
284  void UART_TXEnable(UART_T *pUART)
285 {
286  pUART->CR |= UART_CR_TXE;
287 }
288 
293  void UART_TXDisable(UART_T *pUART)
294 {
295  pUART->CR &= (~UART_CR_TXE) & UART_CR_BITMASK;
296 }
297 
303 void UART_Enable(UART_T *pUART)
304 {
305  pUART->CR |= UART_CR_UARTEN;
306 }
307 
312  void UART_RXEnable(UART_T *pUART)
313 {
314  pUART->CR |= UART_CR_RXE;
315 }
316 
321  void UART_RXDisable(UART_T *pUART)
322 {
323  pUART->CR &= (~UART_CR_RXE) & UART_CR_BITMASK;;
324 }
325 
331  void UART_SendByte(UART_T *pUART, uint8_t data)
332 {
333  pUART->DR = ((uint32_t) data) & UART_DR_MASK_DATA;
334  // pUART->DR = ((uint32_t) data);
335 }
336 
337 /* Передача массива байт по UART'у, с ожиданием освобождения FIFO передатчика */
338 uint32_t UART_SendBlocking(UART_T *pUART, const void *data, uint32_t numBytes)
339 {
340  int pass, sent = 0;
341  uint8_t *p8 = (uint8_t *) data;
342  while (numBytes > 0)
343  {
344  pass = UART_Send(pUART, p8, numBytes);
345  numBytes -= pass;
346  sent += pass;
347  p8 += pass;
348  }
349  return sent;
350 }
351 
352 /* Прием массива байт по UART'у, без ожидания заполнения указанного массива полностью */
353 uint32_t UART_Read(UART_T *pUART, void *data, uint32_t numBytes)
354 {
355  int readBytes = 0;
356  uint8_t *p8 = (uint8_t *) data;
357  /* Принимаем данные пока FIFO приемника не пуст или не принято необходимое число данных */
358  while ((readBytes < numBytes) && (!(UART_GetStatus(pUART, UART_FR_RXFE))))
359  {
360  *p8 = UART_ReadByte(pUART);
361  p8++;
362  readBytes++;
363  }
364  return readBytes;
365 }
366 
367 /* Прием массива байт по UART'у, с ожиданием заполнения указанного массива полностью */
368 uint32_t UART_ReadBlocking(UART_T *pUART, void *data, uint32_t numBytes)
369 {
370  int pass, readBytes = 0;
371  uint8_t *p8 = (uint8_t *) data;
372 
373  while (readBytes < numBytes)
374  {
375  pass = UART_Read(pUART, p8, numBytes);
376  numBytes -= pass;
377  readBytes += pass;
378  p8 += pass;
379  }
380 
381  return readBytes;
382 }
383 
384 /* Обработчик прерывания UART по приему данных для кольцевых буферов */
386 {
387  while (!(UART_GetStatus(pUART, UART_FR_RXFE)))
388  {
389  uint8_t ch = UART_ReadByte(pUART);
390  RingBuffer_Insert(pRB, &ch);
391  }
392 }
393 
394 /* Обработчик прерывания UART по передаче данных для кольцевых буферов */
396 {
397  uint8_t ch;
398  while (!(UART_GetStatus(pUART, UART_FR_TXFF)) && RingBuffer_Pop(pRB, &ch))
399  {
400  UART_SendByte(pUART, ch);
401  }
402 
403  /* Выключение прерывания, если кольцевой буфер пуст */
404  if (RingBuffer_IsEmpty(pRB))
405  {
407  }
408 }
409 
410 /* Запись данных в кольцевой буфер и начало передачи */
411 uint32_t UART_SendRB(UART_T *pUART, RINGBUFF_T *pRB, const void *data, uint32_t bytes)
412 {
413  uint32_t ret;
414  uint8_t ch;
415  uint8_t *p8 = (uint8_t *) data;
416  /* Отключение прерывания по передаче на время работы с кольцевым буфером */
418  /* Заполнение кольцевого буфера данными */
419  ret = RingBuffer_InsertMult(pRB, p8, bytes);
420  while (!(UART_GetStatus(pUART, UART_FR_TXFF)) && RingBuffer_Pop(pRB, &ch))
421  {
422  UART_SendByte(pUART, ch);
423  }
425  ret += RingBuffer_InsertMult(pRB, (p8 + ret), (bytes - ret));
426  /* Включение прерывания по передаче */
428  return ret;
429 }
430 
431 /* Чтение данных из кольцевого буфера после приема */
432 uint32_t UART_ReadRB(UART_T *pUART, RINGBUFF_T *pRB, void *data, uint32_t bytes)
433 {
434  (void) pUART;
435  return RingBuffer_PopMult(pRB, (uint8_t *) data, bytes);
436 }
437 
438 /* Обработчик прерывания UART по приему/передаче данных для кольцевых буферов */
439 void UART_IRQRBHandler(UART_T *pUART, RINGBUFF_T *pRXRB, RINGBUFF_T *pTXRB)
440 {
441  /* Обработка прерывания по передаче */
442  if (UART_GetIntStatus(pUART, UART_MIS_TXMIS))
443  {
444  UART_TXIntHandlerRB(pUART, pTXRB);
445  /* Выключение прерывания, если кольцевой буфер пуст */
446  if (RingBuffer_IsEmpty(pTXRB))
447  {
449  }
450  }
451  /* Обработка прерывания по приему */
452  UART_RXIntHandlerRB(pUART, pRXRB);
453 }
454 
455 /* Определение и установка оптимальных параметров делителя частоты */
456 uint32_t UART_SetBaud(UART_T *pUART, uint32_t baud,const uint32_t sys_freq)
457 {
458  float div = (sys_freq/16.0)/baud;
459  uint32_t ibrd = (uint32_t) div;
460  uint32_t fbrd = (uint32_t)((div - ibrd)*64+0.5);
461  UART_SetDivisor(pUART, ibrd, fbrd);
462  /* Возврат установленного значения частоты */
463  return (uint32_t)(sys_freq/(16*(ibrd + fbrd/64.0)));
464 }
#define UART1
Указатель на структуру UART1.
Этот файл содержит структуры, макросы и функции необходимые для взаимодействия с контроллером прямого...
Этот файл содержит структуры, макросы и функции необходимые для взаимодействия с аппаратным модулем U...
UART_STATUS_T
Макросы и типы для регистра FR.
Definition: uart.h:82
void UART_RXIntHandlerRB(UART_T *pUART, RINGBUFF_T *pRB)
Обработчик прерывания UART по приему данных для кольцевых буферов
Definition: uart.c:385
uint32_t UART_ReadRB(UART_T *pUART, RINGBUFF_T *pRB, void *data, uint32_t bytes)
Чтение данных из кольцевого буфера после приема
Definition: uart.c:432
__RW uint32_t IBRD
Definition: uart.h:46
#define UART_CR_TXE
Definition: uart.h:131
int RingBuffer_IsEmpty(RINGBUFF_T *RingBuff)
Проверка кольцевого буфера на отсутствие данных
Definition: ringbuffer.c:224
void PWR_RST_Enable(CTRL_T CTRLn)
Ввод модуля в асинхронный сброс
Definition: system.c:309
CTRL_T
Номера модулей в регистрах PWR_CLK_CTRL и PWR_RST_CTRL Расшифровка битовых полей для регистров PWR_CT...
Definition: system.h:635
void UART_Config(UART_T *pUART, uint32_t config)
Установка длины слова данных, числа стоповых бит и контроля четности
Definition: uart.c:232
void UART_TXDisable(UART_T *pUART)
запрещение работы передатчика
Definition: uart.c:293
#define UART3
Указатель на структуру UART3.
__RO uint32_t MIS
Definition: uart.h:53
Этот файл содержит описание адресного пространства микроконтроллера 5023ВС016.
#define UART5
Указатель на структуру UART5.
void UART_RXDisable(UART_T *pUART)
запрещение работы приемника
Definition: uart.c:321
Status RingBuffer_Insert(RINGBUFF_T *RingBuff, const void *data)
Запись одного элемента в кольцевой буфер.
Definition: ringbuffer.c:55
void UART_IntDisable(UART_T *pUART, UART_INTMASK_T IntMask)
Запрещение прерываний по UART&#39;у
Definition: uart.c:194
__RW uint32_t LCR_H
Definition: uart.h:48
void PWR_CLK_Disable(CTRL_T CTRLn)
Отключение тактового сигнала от модуля
Definition: system.c:328
#define UART4
Указатель на структуру UART4.
void UART_TXEnable(UART_T *pUART)
Разрешение работы передатчика
Definition: uart.c:284
void UART_Enable(UART_T *pUART)
Разрешение работы UART.
Definition: uart.c:303
#define UART_FBRD_BAUDDIV_FRAC(x)
Макросы для регистра UARTx_FBRD.
Definition: uart.h:100
uint32_t UART_SendBlocking(UART_T *pUART, const void *data, uint32_t numBytes)
Передача массива байт по UART&#39;у, с ожиданием освобождения FIFO передатчика
Definition: uart.c:338
int RingBuffer_InsertMult(RINGBUFF_T *RingBuff, const void *data, int num)
Запись нескольких элементов в кольцевой буфер.
Definition: ringbuffer.c:77
void UART_SetupFIFOS(UART_T *pUART, UART_IFLS rxfifolimit, UART_IFLS txfifolimit)
Установка порогов прерываний по заполнению буфера приемника/передатчика
Definition: uart.c:126
void UART_DeInit(UART_T *pUART)
Деинициализация UART.
Definition: uart.c:108
uint32_t UART_ReadBlocking(UART_T *pUART, void *data, uint32_t numBytes)
Прием массива байт по UART&#39;у, с ожиданием заполнения указанного массива полностью ...
Definition: uart.c:368
#define CLK_INIT_PAUSE
Definition: system.h:40
uint32_t UART_SendRB(UART_T *pUART, RINGBUFF_T *pRB, const void *data, uint32_t bytes)
Запись данных в кольцевой буфер и начало передачи
Definition: uart.c:411
FlagStatus
Тип для состояний флагов
Definition: types.h:64
__RW uint32_t DR
Definition: uart.h:41
#define UART_CR_UARTEN
Definition: uart.h:129
Структура кольцевого буфера
Definition: ringbuffer.h:39
UART_MASKINTSTATUS_T
Макросы и типы для регистра UARTx_MIS.
Definition: uart.h:180
#define UART6
Указатель на структуру UART6.
#define UART_DR_MASK_DATA
Definition: uart.h:35
void PWR_RST_Disable(CTRL_T CTRLn)
Вывод модуля из асинхронного сброса
Definition: system.c:318
void PWR_CLK_Enable(CTRL_T CTRLn)
Подача тактового сигнала на модуль
Definition: system.c:337
void UART_Disable(UART_T *pUART)
запрещение работы UART.
Definition: uart.c:275
void UART_TXIntHandlerRB(UART_T *pUART, RINGBUFF_T *pRB)
Обработчик прерывания UART по передаче данных для кольцевых буферов
Definition: uart.c:395
void UART_SendByte(UART_T *pUART, uint8_t data)
Передача одного байта по UART&#39;у
Definition: uart.c:331
#define UART2
Указатель на структуру UART2.
uint8_t UART_ReadByte(UART_T *pUART)
Прием одного байта по UART&#39;у
Definition: uart.c:204
__RW uint32_t FBRD
Definition: uart.h:47
#define UART_CR_RXE
Definition: uart.h:132
uint32_t UART_GetIntStatus(UART_T *pUART, UART_MASKINTSTATUS_T MaskInt)
Получение статуса маскированного прерывания
Definition: uart.c:145
void UART_SetDivisor(UART_T *pUART, uint32_t IBRD, uint32_t FBRD)
Установка делителя скорости передачи данных
Definition: uart.c:157
void UART_Init(UART_T *pUART)
Инициализация UART.
Definition: uart.c:93
Этот файл содержит структуры, макросы и функции необходимые для взаимодействия с регистрами общего на...
void UART_ClearIntPending(UART_T *pUART, UART_INTCLEAR_T IntClear)
Сброс флагов прерываний
Definition: uart.c:87
const unsigned int sys_freq
Definition: main.c:31
__WO uint32_t ICR
Definition: uart.h:54
static CTRL_T UART_GetCtrlNum(UART_T *pUART)
Definition: uart.c:40
Status RingBuffer_Pop(RINGBUFF_T *RingBuff, void *data)
Чтение одного элемента из кольцевого буфера
Definition: ringbuffer.c:120
__RW uint32_t CR
Definition: uart.h:49
__RW uint32_t IFLS
Definition: uart.h:50
uint32_t UART_Read(UART_T *pUART, void *data, uint32_t numBytes)
Прием массива байт по UART&#39;у, без ожидания заполнения указанного массива полностью ...
Definition: uart.c:353
Структура для доступа к регистрам UART.
Definition: uart.h:39
int RingBuffer_PopMult(RINGBUFF_T *RingBuff, void *data, int num)
Чтение массива элементов из кольцевого буфера
Definition: ringbuffer.c:142
#define UART_IBRD_BAUDDIV_INT(x)
Макросы для регистра UARTBIRD.
Definition: uart.h:95
#define UART_CR_BITMASK
Definition: uart.h:133
__RO uint32_t FR
Definition: uart.h:44
uint32_t UART_Send(UART_T *pUART, const void *data, uint32_t numBytes)
Передача массива байт по UART&#39;у, без ожидания освобождения FIFO передатчика
Definition: uart.c:257
Definition: types.h:64
__RW uint32_t IMSC
Definition: uart.h:51
void UART_RXEnable(UART_T *pUART)
Разрешение работы приемника
Definition: uart.c:312
UART_IFLS
Тип UART_IFLS для регистра UARTx_IFLS.
Definition: uart.h:138
uint32_t UART_GetRawIntStatus(UART_T *pUART, UART_MASKINTSTATUS_T MaskInt)
Получение статуса прерывания
Definition: uart.c:176
void UART_IRQRBHandler(UART_T *pUART, RINGBUFF_T *pRXRB, RINGBUFF_T *pTXRB)
Обработчик прерывания UART по приему/передаче данных для кольцевых буферов
Definition: uart.c:439
UART_INTCLEAR_T
Макросы и типы для регистра UARTx_ICR.
Definition: uart.h:195
FlagStatus UART_GetStatus(UART_T *pUART, UART_STATUS_T Stat)
Получение текущего статуса UART контроллера
Definition: uart.c:251
void UART_IntEnable(UART_T *pUART, UART_INTMASK_T IntMask)
Разрешение прерываний по UART&#39;у
Definition: uart.c:222
UART_INTMASK_T
Макросы и типы для регистра UARTx_IMSC.
Definition: uart.h:150
uint32_t UART_SetBaud(UART_T *pUART, uint32_t baud, const uint32_t sys_freq)
Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена ...
Definition: uart.c:456
Definition: types.h:64