Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
uart_test.c
См. документацию.
1 
28 #include "uart_test.h"
29 
30 /* Размер буфера для тестирования UART */
31 #define UART_RB_SIZE 256 // Размер кольцевого буфера
32 const uint32_t sys_freq = 80000000; // Системная частота
33 #pragma data_alignment = 0x400
34 #pragma location=".noinit"
37 static uint8_t dma_tx_done;
38 char dbg_buffer[256]; // Отладочный буфер
40 static uint8_t rxbuff[UART_RB_SIZE],
42 
47 {
48  dma_tx_done = 1;
49  UART2->DMACR &= (~UART_DMACR_TXDMAE); // запрещение использования DMA при передаче
50  UART2->DMACR &=(~UART_DMACR_RXDMAE); // запрещение использования DMA при приеме
51  CMN_REG->DMA_INTR_FLAGS &=(~(1<<6));
52  CMN_REG->DMA_INTR_FLAGS |=(1<<6); // Флаг прерываний DMA для UART2 TX
53 }
54 
58 void UART_2_IRQ(void)
59 {
60  UART_IRQRBHandler(UART2, &rxring, &txring); // Обработчик прерывания UART по приему/передаче данных для кольцевых буферов
61 }
62 
67 {
68  GPIO_E->ALTFUNCSET = (1 << 2); //uart2 tx
69  GPIO_E->ALTFUNCSET = (1 << 1); //uart2 rx
70 }
71 
75 uint8_t UART_Test(void)
76 {
77  uint8_t test_rx_buffer[UART_RB_SIZE];
78  uint8_t test_tx_buffer[UART_RB_SIZE];
79  uint32_t baudrates[12] ={BAUDRATE_921600, // Список скоростей для COM порта
90  BAUDRATE_110};
91 
92  uint8_t k;
93  volatile uint16_t i,j;
94  UART_Init(UART2); // Инициализация UART
95  RingBuffer_Init(&rxring, rxbuff, 1, UART_RB_SIZE); // Инициализация кольцевого буфера
96  RingBuffer_Init(&txring, txbuff, 1, UART_RB_SIZE); // Инициализация кольцевого буфера
97  UART_SetBaud(UART2, BAUDRATE_921600,sys_freq); // Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена
98  UART_Config(UART2, (UART_LCR_H_PDIS | // Установка длины слова данных, числа стоповых бит и контроля четности
101  UART_LCR_H_FEN |
104  UART_Enable(UART2); // Разрешение работы UART
105  UART_TXEnable(UART2); // Разрешение работы передатчика
106  UART_RXEnable(UART2); // Разрешение работы приемника
107  UART_SetupFIFOS(UART2, UART_IFLS_1DIV8, UART_IFLS_1DIV8); // Установка порогов прерываний по заполнению буфера приемника/передатчика
108  for (i = 0; i < (UART_RB_SIZE); i++)
109  {
110  test_tx_buffer[i] = i;
111  test_rx_buffer[i] = 0xAA;
112  }
113  gpioInit_UART2(); // Инициализация GPIO для UART2
114  PRINT("Тестирование UART");
115  PRINT(" Ряд скоростей для тестирования:")
116  for (k = 0; k <= 12; k+=3)
117  {
118  if (k<10)
119  PRINT(" %iбит/с, %iбит/с, %iбит/с, ", baudrates[k], baudrates[k+1], baudrates[k+2]);
120  }
121  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
122 
123 /*****************************************************************************
124  * Режим опроса
125  ****************************************************************************/
126 
127  for (k = 0; k <= 11; k++)
128  {
129  UART_SetBaud(UART2, baudrates[k],sys_freq); // Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена
130  i = 0;
131  j = 0;
132  while (j < (UART_RB_SIZE))
133  {
134  while ((UART_GetStatus(UART2, UART_FR_RXFE)) && // Статус UART контроллера, SET or RESET
136  (i < (UART_RB_SIZE)))
137  {
138  UART_SendByte(UART2, test_tx_buffer[i]); // Передача одного байта по UART'у
139  i++;
140  }
141  while (!(UART_GetStatus(UART2, UART_FR_RXFE))) // Статус UART контроллера, SET or RESET
142  {
143  test_rx_buffer[j] = UART_ReadByte(UART2); // Прием одного байта по UART'у
144  j++;
145  }
146  }
147  if (memcmp(test_tx_buffer, test_rx_buffer, (UART_RB_SIZE)))
148  {
149  PRINT(" Режим опроса завершен на скорости %i неуспешно",
150  baudrates[k]);
151  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
152  // return false;
153  }
154  memset(test_rx_buffer, 0, UART_RB_SIZE);
155  }
156  UART_DeInit(UART2); // Деинициализация UART
158  PRINT(" Режим опроса завершен успешно");
159  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
160 
161 /*****************************************************************************
162  * Режим c прерываниями
163  ****************************************************************************/
164 
165  PRINT(" Тест UART в режиме c прерываниями");
166  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
167  int result=0;
168  for (k = 0; k < 11; k++)
169  {
170  UART_Init(UART2); // Инициализация UART
172  UART_SetBaud(UART2, baudrates[k],sys_freq); // Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена
173  UART_Config(UART2,(UART_LCR_H_PDIS | // Установка длины слова данных, числа стоповых бит и контроля четности
175  UART_LCR_H_STP2 |
179  UART_Enable(UART2); // Разрешение работы UART
180  UART_TXEnable(UART2); // Разрешение работы передатчика
181  UART_RXEnable(UART2); // Разрешение работы приемника
182  UART_SetupFIFOS(UART2, UART_IFLS_1DIV8, UART_IFLS_1DIV8); // Установка порогов прерываний по заполнению буфера приемника/передатчика
184  UART_IntEnable(UART2, UART_IMSC_RXIM); // Разрешение прерываний по UART'у
185  UART_IntEnable(UART2, UART_IMSC_TXIM); // Разрешение прерываний по UART'у
186  NVIC_EnableIRQ(UART_2,3); // Разрешение прерывания
188  for (i = 0; i < (UART_RB_SIZE); i++)
189  {
190  test_tx_buffer[i] = i;
191  test_rx_buffer[i] = 0xAA;
192  }
193  UART_SendRB(UART2, &txring, test_tx_buffer, (UART_RB_SIZE)); // Запись данных в кольцевой буфер и начало передачи
195  int l = 0;
196  while ((RingBuffer_GetCount(&rxring) < 256) && (l < 20000000))
197  {
199  {
200  uint8_t ch = UART_ReadByte(UART2);
201  RingBuffer_Insert(&rxring, &ch);
202  }
203  l++;
204  }
205  UART_ReadRB(UART2, &rxring, test_rx_buffer, (UART_RB_SIZE)); // Запись данных в кольцевой буфер и начало передачи
206  if (memcmp(test_tx_buffer, test_rx_buffer, (UART_RB_SIZE)))
207  {
208 #ifndef NO_VERBOSE
209 
210  PRINT(" Ошибка в работе теста UART в режиме c прерываниями на скорости %i", baudrates[k]);
211  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
212 #endif
213  result = 1;
214  }
215  else
216  {
217  PRINT("УСПЕШНО Тест UART в режиме c прерываниями на скорости %i", baudrates[k]);
218  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
219  }
220  NVIC_DisableIRQ(3); // Запрещение прерывания
221  UART_IntDisable(UART2, UART_IMSC_RXIM); // Запрещение прерываний по UART'у
222  UART_IntDisable(UART2, UART_IMSC_TXIM); // Запрещение прерываний по UART'у
223  UART_DeInit(UART2); // Деинициализация UART
225  }
226  if (result)
227  {
228  PRINT("Ошибка в работе теста UART в режиме c прерываниями");
229  }
230  else
231  {
232  PRINT("Теста UART в режиме c прерываниями прошел успешно! ");
233  }
234  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
235  UART_DeInit(UART2); // Деинициализация UART
236 
237 /*****************************************************************************
238  * Режим c DMA (не работает с внешней памятью)
239  ****************************************************************************/
240  int result_dma =0;
241 #ifndef EXT
242 
243  PRINT(" Тест UART в режиме c DMA");
244  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
245  for (k = 0; k < 11; k++)
246  {
247  UART_Init(UART2); // Инициализация UART
249  UART_SetBaud(UART2, baudrates[k],sys_freq); // Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена
250  UART_Config(UART2, (UART_LCR_H_PDIS | // Установка длины слова данных, числа стоповых бит и контроля четности
253  UART_LCR_H_FEN |
256  UART_Enable(UART2); // Разрешение работы UART
257  UART_TXEnable(UART2); // Разрешение работы передатчика
258  UART_RXEnable(UART2); // Разрешение работы приемника
259  UART_SetupFIFOS(UART2, UART_IFLS_1DIV8, UART_IFLS_1DIV8); // Установка порогов прерываний по заполнению буфера приемника/передатчика
261  UART_IntEnable(UART2, UART_IMSC_RXIM); // Разрешение прерываний по UART'у
262  UART_IntEnable(UART2, UART_IMSC_TXIM); // Разрешение прерываний по UART'у
264  int p= 0;
265  for (p = 0; p < (UART_RB_SIZE); p++)
266  {
267  test_tx_buffer[p] = p;
268  test_rx_buffer[p] = 0xAA;
269  }
270  // Настройка DMA
271  DMA->CFG = 1;
272  DMA->CTRL_BASE_PTR = (uint32_t) &DMA_UART_CTRL;
273  DMA->CHNL_ENABLE_SET = (1<<6);
274  DMA_UART_CTRL.prim_chan[6].src_data_end_ptr = (uint32_t)&test_tx_buffer[UART_RB_SIZE - 1];
275  DMA_UART_CTRL.prim_chan[6].dst_data_end_ptr = (uint32_t)UART2_BASE;
276  DMA_UART_CTRL.prim_chan[6].ctrl = DMA_CCTRL_BASIC | DMA_NEXT_USEBURST_DIS | \
277  DMA_N_MINUS_1(UART_RB_SIZE - 1) | DMA_R_POWER(4) | \
278  DMA_SRC_PROT_CACHE_DIS | DMA_SRC_PROT_BUFFER_DIS | DMA_SRC_PROT_PRIVILEGE_DIS | \
279  DMA_DST_PROT_CACHE_DIS | DMA_DST_PROT_BUFFER_DIS | DMA_DST_PROT_PRIVILEGE_DIS | \
280  DMA_SRC_DATA_SIZE_BYTE | DMA_SRC_ADDR_INC_BYTE | \
281  DMA_DST_DATA_SIZE_BYTE | DMA_DST_ADDR_INC_NULL;
282  CMN_REG->DMA_INTR_FLAGS &=(~(1<<6));
283  dma_tx_done = 0;
284  UART2->DMACR |= UART_DMACR_TXDMAE; // разрешение использования DMA при передаче
285  while (!(UART_GetStatus(UART2, UART_FR_TXFE))) {} // Получение текущего статуса UART контроллера
286  int l = 0;
287  while ((RingBuffer_GetCount(&rxring) < 256) && (l < 20000000)) // Получения количества элементов, записанных в кольцевой буфер.
288  {
289 
291  {
292  uint8_t ch = UART_ReadByte(UART2);
293  RingBuffer_Insert(&rxring, &ch);
294  }
295 
296  l++;
297  }
298  UART_ReadRB(UART2, &rxring, test_rx_buffer, (UART_RB_SIZE)); // Чтение данных из кольцевого буфера после приема
299  if (memcmp(test_tx_buffer, test_rx_buffer, UART_RB_SIZE))
300  {
301 #ifndef NO_VERBOSE
302  PRINT(" Ошибка в работе теста UART в режиме c DMA завершен на скорости %i", baudrates[k]);
303  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
304 #endif
305  result_dma = 1;
306  }
307  else
308  {
309 
310  PRINT("УСПЕШНО Тест UART в режиме c DMA на скорости %i", baudrates[k]);
311  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
312  }
313  memset(test_rx_buffer, 0, UART_RB_SIZE);
314  DMA->CFG = 0;
315  UART_IntDisable(UART2, UART_IMSC_RXIM); // Запрещение прерываний по UART'у
316  UART_DeInit(UART2); // Деинициализация UART
318  }
319  if (result_dma)
320  {
321  PRINT("Ошибка в работе теста UART в режиме c DMA");
322  }
323  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
324 #endif
325  if ((!result_dma)&&(!result))
326  {
327  PRINT("Тест UART завершен успешно");
328  }
329  else
330  {
331  PRINT("Ошибка в работе теста UART");
332  }
333  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
334  return result_dma;
335 }
char dbg_buffer[256]
Отладочный буфер
Definition: uart_test.c:38
#define DMA_DST_PROT_BUFFER_DIS
Definition: dma.h:92
#define DMA
Указатель на структуру DMA.
#define PRINT(...)
Макросы для использования отладочного выхода
Definition: debug_uart.h:48
Структура для доступа к управлющим данным всех каналов
Definition: dma.h:129
static uint8_t rxbuff[UART_RB_SIZE]
Буфер RX.
Definition: uart_test.c:40
#define CLK_UART_PAUSE
Definition: system.h:42
DMA_CTRL_T DMA_CTRL
Definition: uart_test.c:35
uint32_t src_data_end_ptr
Definition: dma.h:120
#define BAUDRATE_19200
Definition: uart.h:225
uint8_t UART_Test(void)
Основная программа тестирования UART.
Definition: uart_test.c:75
void UART_Enable(UART_T *pUART)
Разрешение работы UART.
Definition: uart.c:303
void UART_RXEnable(UART_T *pUART)
Разрешение работы приемника
Definition: uart.c:312
void NVIC_EnableIRQ(IRQn_T IRQn, uint32_t vec)
Разрешение прерывания
Definition: system.c:74
DMA_CTRL_T DMA_UART_CTRL
Definition: uart_test.c:36
void UART_Init(UART_T *pUART)
Инициализация UART.
Definition: uart.c:93
int RingBuffer_GetCount(RINGBUFF_T *RingBuff)
Получения количества элементов, записанных в кольцевой буфер.
Definition: ringbuffer.c:194
void UART_IntEnable(UART_T *pUART, UART_INTMASK_T IntMask)
Разрешение прерываний по UART&#39;у
Definition: uart.c:222
void UART_DeInit(UART_T *pUART)
Деинициализация UART.
Definition: uart.c:108
#define DMA_SRC_ADDR_INC_BYTE
Definition: dma.h:101
static RINGBUFF_T txring
Definition: uart_test.c:39
#define DMA_DST_PROT_PRIVILEGE_DIS
Definition: dma.h:95
#define UART_LCR_H_EPS_ODD
Definition: uart.h:109
#define BAUDRATE_115200
Definition: uart.h:222
uint32_t UART_SendRB(UART_T *pUART, RINGBUFF_T *pRB, const void *data, uint32_t bytes)
Запись данных в кольцевой буфер и начало передачи
Definition: uart.c:411
#define UART_LCR_H_SPS_DIS
Definition: uart.h:124
Definition: system.h:143
Этот файл содержит структуры, макросы и функции необходимые необходимые для тестовой программы для ап...
Status RingBuffer_Insert(RINGBUFF_T *RingBuff, const void *data)
Запись одного элемента в кольцевой буфер.
Definition: ringbuffer.c:55
#define UART_LCR_H_STP1
Definition: uart.h:111
FlagStatus UART_GetStatus(UART_T *pUART, UART_STATUS_T Stat)
Получение текущего статуса UART контроллера
Definition: uart.c:251
#define UART_LCR_H_STP2
Definition: uart.h:110
#define UART2_BASE
uint32_t UART_SetBaud(UART_T *pUART, uint32_t baud, const uint32_t sys_freq)
Установка целой и дробной частей делителя для получения заданной скорости последовательного обмена ...
Definition: uart.c:456
static uint8_t txbuff[UART_RB_SIZE]
Буфер TX.
Definition: uart_test.c:40
#define DMA_NEXT_USEBURST_DIS
Definition: dma.h:74
void RingBuffer_Init(RINGBUFF_T *RingBuff, void *buffer, int itemSize, int count)
Инициализация кольцевого буфера.
Definition: ringbuffer.c:40
#define BAUDRATE_230400
Definition: uart.h:221
volatile uint32_t ctrl
Definition: dma.h:122
uint8_t UART_ReadByte(UART_T *pUART)
Прием одного байта по UART&#39;у
Definition: uart.c:204
#define UART_LCR_H_PDIS
Definition: uart.h:107
Структура кольцевого буфера
Definition: ringbuffer.h:39
void UART_IRQRBHandler(UART_T *pUART, RINGBUFF_T *pRXRB, RINGBUFF_T *pTXRB)
Обработчик прерывания UART по приему/передаче данных для кольцевых буферов
Definition: uart.c:439
#define BAUDRATE_2400
Definition: uart.h:228
#define UART_RB_SIZE
Definition: uart_test.c:31
void UART_SetupFIFOS(UART_T *pUART, UART_IFLS rxfifolimit, UART_IFLS txfifolimit)
Установка порогов прерываний по заполнению буфера приемника/передатчика
Definition: uart.c:126
void NVIC_DisableIRQ(uint32_t vec)
Запрещение прерывания
Definition: system.c:347
#define BAUDRATE_9600
Definition: uart.h:227
#define BAUDRATE_14400
Definition: uart.h:226
#define DMA_SRC_PROT_BUFFER_DIS
Definition: dma.h:83
#define UART2
Указатель на структуру UART2.
#define DMA_DST_ADDR_INC_NULL
Definition: dma.h:113
#define BAUDRATE_38400
Definition: uart.h:224
#define BAUDRATE_110
Definition: uart.h:230
#define DMA_SRC_PROT_PRIVILEGE_DIS
Definition: dma.h:86
void UART_IntDisable(UART_T *pUART, UART_INTMASK_T IntMask)
Запрещение прерываний по UART&#39;у
Definition: uart.c:194
uint32_t dst_data_end_ptr
Definition: dma.h:121
void UART_TXEnable(UART_T *pUART)
Разрешение работы передатчика
Definition: uart.c:284
#define BAUDRATE_460800
Definition: uart.h:220
const uint32_t sys_freq
Системная частота
Definition: uart_test.c:32
#define DMA_CCTRL_BASIC
Definition: dma.h:64
static uint8_t dma_tx_done
Definition: uart_test.c:37
DMA_CHNL_CTRL_T prim_chan[32]
Definition: dma.h:131
#define UART_LCR_H_FEN
Definition: uart.h:112
void UART_2_IRQ(void)
Обработчик прерывания для UART2.
Definition: uart_test.c:58
void UART_SendByte(UART_T *pUART, uint8_t data)
Передача одного байта по UART&#39;у
Definition: uart.c:331
#define GPIO_E
Указатель на структуру GPIO_E.
#define CMN_REG
Указатель на структуру CMN_REG.
void DBG_TX_Flush(void)
Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART.
Definition: debug_uart.c:80
uint32_t UART_ReadRB(UART_T *pUART, RINGBUFF_T *pRB, void *data, uint32_t bytes)
Чтение данных из кольцевого буфера после приема
Definition: uart.c:432
#define BAUDRATE_1200
Definition: uart.h:229
void DMA_DONE_UART_2_IRQ(void)
Обработчик прерывания для DMA UART2.
Definition: uart_test.c:46
#define BAUDRATE_921600
Definition: uart.h:219
void gpioInit_UART2()
Инициализация GPIO для UART2.
Definition: uart_test.c:66
void UART_Config(UART_T *pUART, uint32_t config)
Установка длины слова данных, числа стоповых бит и контроля четности
Definition: uart.c:232
static RINGBUFF_T rxring
Definition: uart_test.c:39
#define DMA_R_POWER(n)
Definition: dma.h:77
#define BAUDRATE_57600
Definition: uart.h:223