Advertisement
petrdynin

MIK32+UART_RX+DMA

Sep 17th, 2024
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1.  
  2. #define DMA_BUFFER_SIZE 16
  3.  
  4. typedef struct {
  5.     uint16_t   ri, ct;
  6.     uint8_t    buff[DMA_BUFFER_SIZE];
  7. } FIFO;
  8.  
  9. volatile FIFO RxFifo_1;
  10.  
  11.  
  12. void DMA_Initialize(void){
  13.  
  14.       PM->CLK_AHB_SET |= PM_CLOCK_AHB_DMA_M;
  15.      
  16.       DMA_CONFIG->CONFIG_STATUS  =  DMA_CONFIG_CLEAR_LOCAL_IRQ_M
  17.                           //      |   DMA_CONFIG_CLEAR_GLOBAL_IRQ_M
  18.                           //      |   DMA_CONFIG_CLEAR_ERROR_IRQ_M
  19.                           //      |   DMA_CONFIG_GLOBAL_IRQ_ENA_M
  20.                           //      |   DMA_CONFIG_ERROR_IRQ_ENA_M
  21.                           //      |   DMA_CONFIG_CURRENT_VALUE_M
  22.                                   ;
  23.  
  24. }
  25.  
  26.  
  27. void DMA_Ch1_Initialize(void){
  28.  
  29.       DMA_CONFIG->CHANNELS[1].SRC = (uint32_t)&(UART_1->RXDATA);
  30.       DMA_CONFIG->CHANNELS[1].DST = (uint32_t)RxFifo_1.buff;
  31.       DMA_CONFIG->CHANNELS[1].LEN = DMA_BUFFER_SIZE-1;
  32.  
  33.       DMA_CONFIG->CHANNELS[1].CFG = DMA_CH_CFG_PRIOR_VERY_HIGH_M
  34.  
  35.                                 |   DMA_CH_CFG_READ_MODE_PERIPHERY_M
  36.                                 |   DMA_CH_CFG_READ_NO_INCREMENT_M
  37.                                 |   DMA_CH_CFG_READ_SIZE_BYTE_M
  38.                                 |   0 << DMA_CH_CFG_READ_BURST_SIZE_S
  39.                                 |   DMA_CH_CFG_READ_REQUETS(1)
  40.                                 |   DMA_CH_CFG_READ_ACK_EN_M
  41.  
  42.                                 |   DMA_CH_CFG_WRITE_MODE_MEMORY_M
  43.                                 |   DMA_CH_CFG_WRITE_INCREMENT_M
  44.                                 |   DMA_CH_CFG_WRITE_SIZE_BYTE_M
  45.                                 |   0 << DMA_CH_CFG_WRITE_BURST_SIZE_S
  46.                                 |   DMA_CH_CFG_IRQ_EN_M
  47.  
  48.                                 |  DMA_CH_CFG_ENABLE_M
  49.                                 ;
  50. }
  51.  
  52. /*****************  часть обработчика прерывания от DMA *****************************/
  53.  
  54.        if ( EPIC->RAW_STATUS & (1<<EPIC_DMA_INDEX)){
  55.            EPIC->CLEAR = (1<<EPIC_DMA_INDEX);
  56.  
  57.            if(DMA_CONFIG->CONFIG_STATUS & DMA_CONFIG_CLEAR_LOCAL_IRQ(1)<<4){
  58.  
  59.                DMA_CONFIG->CONFIG_STATUS = DMA_CONFIG_CLEAR_LOCAL_IRQ(1)
  60.                                          | DMA_CONFIG_CURRENT_VALUE_M
  61.                                          ;
  62.                DMA_CONFIG->CHANNELS[1].CFG |= DMA_CH_CFG_ENABLE_M;
  63.            }
  64.  
  65.            DMA_CONFIG->CONFIG_STATUS &= ~DMA_CONFIG_CURRENT_VALUE_M;
  66.  
  67.         }
  68. /*************************************************************************************/    
  69.        
  70.        
  71.        
  72. uint16_t uart1_test(void) {
  73.  
  74.     static uint16_t old_ct = 0;
  75.     uint16_t new_ct = DMA_CONFIG->CHANNELS[1].LEN;
  76.     uint16_t rx_ct = 0;
  77.  
  78.  
  79.     if (new_ct >= old_ct) {
  80.         rx_ct = new_ct - old_ct;
  81.     } else {
  82.         rx_ct = (DMA_BUFFER_SIZE - old_ct) + new_ct;
  83.     }
  84.  
  85.     old_ct = new_ct;
  86.     RxFifo_1.ct += rx_ct;
  87.     if (RxFifo_1.ct > DMA_BUFFER_SIZE) {
  88.         RxFifo_1.ct = DMA_BUFFER_SIZE;
  89.     }
  90.  
  91.     return RxFifo_1.ct;
  92. }
  93.  
  94.  
  95. uint16_t uart1_getc (void)
  96. {
  97.     uint8_t  d;
  98.     uint16_t i;
  99.  
  100.     i = RxFifo_1.ri;
  101.     d = RxFifo_1.buff[i++];
  102.     RxFifo_1.ri = i % DMA_BUFFER_SIZE;
  103.     RxFifo_1.ct--;
  104.  
  105.     return d;
  106. }
  107.  
  108.  
  109.    
  110.     /*****************  крутится в цикле *****************************/
  111.    
  112.     while (1)
  113.         {
  114.          
  115.             if(uart1_test()){
  116.                 uart1_putc(uart1_getc());  // эхо
  117.             }
  118.            
  119.             // задача 2
  120.            
  121.             // задача 3
  122.            
  123.            
  124.             // задача N
  125.            
  126.         }
  127.  
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement