Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-14 21:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: DMA По передачи UART
СообщениеДобавлено: 2018-июл-03 18:27 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
есть у кого нибудь пример, сделанный на основе библиотеки,
передача по DMA
беру тест, который идет в качестве примеров, но он не работает
Код:
void main(void)
{
   RST_CLK_DeInit();

   RST_CLK_HSEconfig(RST_CLK_HSE_ON);
   if (RST_CLK_HSEstatus() == ERROR) {
      while (1);
   }

   /* Configures the CPU_PLL clock source */
   RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul5);

   /* Enables the CPU_PLL */
   RST_CLK_CPU_PLLcmd(ENABLE);
   if (RST_CLK_CPU_PLLstatus() == ERROR) {
      while (1);
   }

   /* Enables the RST_CLK_PCLK_EEPROM */
   RST_CLK_PCLKcmd(RST_CLK_PCLK_EEPROM, ENABLE);

   /* Sets the code latency value */
   //EEPROM_SetLatency(EEPROM_Latency_3);

   /* Select the CPU_PLL output as input for CPU_C3_SEL */
   RST_CLK_CPU_PLLuse(ENABLE);

   /* Set CPUClk Prescaler */
   RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);

   /* Select the CPU clock source */
   RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);


   /* Enable peripheral clocks -------------------------------------------------- */
   RST_CLK_PCLKcmd((RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_UART1 | RST_CLK_PCLK_DMA), ENABLE);
   RST_CLK_PCLKcmd((RST_CLK_PCLK_PORTC), ENABLE);

   /* Disable all DMA request */
   MDR_DMA->CHNL_REQ_MASK_CLR = 0xFFFFFFFF;
   MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;

   /* Reset PORTC settings */
   PORT_DeInit(MDR_PORTC);

   /* Fill PortInit structure */
   PortInit.PORT_PULL_UP = PORT_PULL_UP_OFF;
   PortInit.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
   PortInit.PORT_PD_SHM = PORT_PD_SHM_OFF;
   PortInit.PORT_PD = PORT_PD_DRIVER;
   PortInit.PORT_GFEN = PORT_GFEN_OFF;
   PortInit.PORT_FUNC = PORT_FUNC_MAIN;
   PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
   PortInit.PORT_MODE = PORT_MODE_DIGITAL;

   /* Configure PORTC pins 3 (UART0_TX) as output */
   PortInit.PORT_OE = PORT_OE_OUT;
   PortInit.PORT_Pin = PORT_Pin_3;
   PORT_Init(MDR_PORTC, &PortInit);


   /* Configure PORTC pins 4 (UART0_RX) as input */
   PortInit.PORT_OE = PORT_OE_IN;
   PortInit.PORT_Pin = PORT_Pin_4;
   PORT_Init(MDR_PORTC, &PortInit);

   /* Init RAM */
   Init_RAM(SrcBuf1, BufferSize);

   /* Reset all UART settings */

   UART_DeInit(MDR_UART1);

   UART_BRGInit(MDR_UART1, UART_HCLKdiv1);

   /* UART1 configuration ------------------------------------------------ */
   UART_StructInit(&sUART);

   sUART.UART_BaudRate = 115200;
   sUART.UART_WordLength = UART_WordLength8b;
   sUART.UART_StopBits = UART_StopBits1;
   sUART.UART_Parity = UART_Parity_No;
   sUART.UART_FIFOMode = UART_FIFO_ON;
   sUART.UART_HardwareFlowControl = (UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE);
   UART_Init(MDR_UART1, &sUART);

       
   /* Enable UART1 */
   UART_Cmd(MDR_UART1, ENABLE);
       

   UART_DMAConfig(MDR_UART1, UART_IT_FIFO_LVL_8words, UART_IT_FIFO_LVL_8words);

   /* Enable UART1 DMA Rx and Tx request */
   UART_DMACmd(MDR_UART1, UART_DMA_TXE, ENABLE);


   /* Reset all DMA settings */
   DMA_DeInit();
   DMA_StructInit(&DMA_InitStr);

   /* Set Primary Control Data */
   DMA_PriCtrlStr.DMA_SourceBaseAddr = (uint32_t) SrcBuf1;
   DMA_PriCtrlStr.DMA_DestBaseAddr = (uint32_t) (&(MDR_UART1->DR));
   DMA_PriCtrlStr.DMA_SourceIncSize = DMA_SourceIncByte;
   DMA_PriCtrlStr.DMA_DestIncSize = DMA_DestIncNo;
   DMA_PriCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
   DMA_PriCtrlStr.DMA_Mode = DMA_Mode_Basic;
   DMA_PriCtrlStr.DMA_CycleSize = BufferSize;
   DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_8;
   DMA_PriCtrlStr.DMA_DestProtCtrl = DMA_DestPrivileged;

   /* Set Channel Structure */
   DMA_InitStr.DMA_PriCtrlData = &DMA_PriCtrlStr;
   DMA_InitStr.DMA_Priority = DMA_Priority_High;
   DMA_InitStr.DMA_UseBurst = DMA_BurstClear;
   DMA_InitStr.DMA_SelectDataStructure = DMA_CTRL_DATA_PRIMARY;

   /* DMA_Channel_UART1_TX configuration --------------------------------- */
   /* Set Primary Control Data */
   /* Init DMA channel */
   DMA_Init(DMA_Channel_REQ_UART1_TX, &DMA_InitStr);
       
       
             
   /* Transfer complete */
   while ((DMA_GetFlagStatus(DMA_Channel_REQ_UART1_TX, DMA_FLAG_CHNL_ENA)));
   //while ((DMA_GetFlagStatus(DMA_Channel_REQ_UART1_RX, DMA_FLAG_CHNL_ENA)));

   /* Check the corectness of written dada */
   TransferStatus1 = Verif_mem((BufferSize / 2), SrcBuf1, DstBuf1);
   /* TransferStatus1 = PASSED, if the data transmitted and received
      are correct */
   /* TransferStatus1 = FAILED, if the data transmitted and received
      are different */

   while (1);
}


доходит do while(1);
но ничего не передается в порт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA По передачи UART
СообщениеДобавлено: 2018-июл-04 11:56 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
ну чо, неужели никто не делал персылку по UART DMA?
ни один пример DAM с UART не работает
в чем проблема может быть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA По передачи UART
СообщениеДобавлено: 2018-июл-10 09:25 
Не в сети
Аватара пользователя

Зарегистрирован: 2016-июн-15 13:22
Сообщения: 43
erik писал(а):
ну чо, неужели никто не делал персылку по UART DMA?
ни один пример DAM с UART не работает
в чем проблема может быть?

Код:
void COMUNICATION_SendDataPO( uint8_t *buffer, uint8_t length)
{
    length--;
   
    MDR_UART1->DMACR &= ~UART_DMACR_TXDMAE;
    MDR_DMA->CHNL_ENABLE_CLR = (1 << DMA_Channel_UART1_TX);
   
    DMA_ControlTable[DMA_Channel_UART1_TX].DMA_Control = DMA_Mode_Basic | (length << 4) | DMA_DestIncNo;
    DMA_ControlTable[DMA_Channel_UART1_TX].DMA_SourceEndAddr = (uint32_t)buffer + length;
    DMA_ControlTable[DMA_Channel_UART1_TX].DMA_DestEndAddr = (uint32_t)&(MDR_UART1->DR);
   
    MDR_DMA->CHNL_ENABLE_SET = (1 << DMA_Channel_UART1_TX);
    MDR_UART1->DMACR |= UART_DMACR_TXDMAE;
    NVIC_EnableIRQ ( UART1_IRQn );
   
    #ifdef DEGUG_ON
        LOGER_Print("Sent data for PO" "\n\0");
    #endif
}

Код:
static void CONFIG_ModuleUART(void)
{
    UART_InitTypeDef        UART_InitStructure;
    DMA_ChannelInitTypeDef  DMA_ChannelStructure;
    DMA_CtrlDataInitTypeDef DMA_CtrlDataInitStructure;
   
    // Запускаем тактирование UART
    RST_CLK_PCLKcmd(RST_CLK_PCLK_UART1 | RST_CLK_PCLK_UART2 | RST_CLK_PCLK_DMA, ENABLE);
    // Прескаллер для UART
    UART_BRGInit(MDR_UART1, UART_HCLKdiv2);
    UART_BRGInit(MDR_UART2, UART_HCLKdiv2);
   
    MDR_DMA->CHNL_REQ_MASK_CLR = 0xFFFFFFFF;
    MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;

    // Сбрасываем настройки UART
    UART_DeInit(MDR_UART1);
    UART_DeInit(MDR_UART2);
   
    NVIC_EnableIRQ ( UART1_IRQn );
   
    // Инициализация настроек
    UART_InitStructure.UART_BaudRate            = 9600;
    UART_InitStructure.UART_WordLength          = UART_WordLength8b;
    UART_InitStructure.UART_StopBits            = UART_StopBits1;
    UART_InitStructure.UART_Parity              = UART_Parity_No;
    UART_InitStructure.UART_FIFOMode            = UART_FIFO_OFF;
    UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;
   
    UART_DMAConfig(MDR_UART1, UART_IT_FIFO_LVL_12words, UART_IT_FIFO_LVL_12words);
   
    UART_Init (MDR_UART1,&UART_InitStructure);
    UART_Init (MDR_UART2,&UART_InitStructure);
   
//    UART_DMACmd(MDR_UART1, UART_DMA_TXE, ENABLE);

    DMA_CtrlDataInitStructure.DMA_SourceBaseAddr    = COMMINICATION_GetTelemetryAddress();
    DMA_CtrlDataInitStructure.DMA_DestBaseAddr      = (uint32_t)(&(MDR_UART1->DR));
    DMA_CtrlDataInitStructure.DMA_SourceIncSize     = DMA_SourceIncByte;
    DMA_CtrlDataInitStructure.DMA_DestIncSize       = DMA_DestIncNo;
    DMA_CtrlDataInitStructure.DMA_MemoryDataSize    = DMA_MemoryDataSize_Byte;
    DMA_CtrlDataInitStructure.DMA_Mode              = DMA_Mode_Basic;
    DMA_CtrlDataInitStructure.DMA_CycleSize         = SIZE_STRING_TELEMETRY;
    DMA_CtrlDataInitStructure.DMA_NumContinuous     = DMA_Transfers_1;
    DMA_CtrlDataInitStructure.DMA_SourceProtCtrl    = DMA_SourcePrivileged;
    DMA_CtrlDataInitStructure.DMA_DestProtCtrl      = DMA_DestPrivileged;
   
    // Инициализируем настроек канала для передачи по UART1
    DMA_ChannelStructure.DMA_PriCtrlData            = &DMA_CtrlDataInitStructure;
    DMA_ChannelStructure.DMA_Priority               = DMA_Priority_Default;
    DMA_ChannelStructure.DMA_UseBurst               = DMA_BurstClear;
    DMA_ChannelStructure.DMA_SelectDataStructure    = DMA_CTRL_DATA_PRIMARY;
   
    // Применяем настройки канала
    DMA_Init(DMA_Channel_UART1_TX, &DMA_ChannelStructure);
   
    // Ращрешаем прерывания по приёму
    UART_ITConfig(MDR_UART1, UART_IT_RX, ENABLE);
   
    // запускаем UART
    UART_Cmd(MDR_UART1,ENABLE);
    UART_Cmd(MDR_UART2,ENABLE);
}

_________________
cdeblog.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB