Миландр

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

Часовой пояс: UTC+03:00




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

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 63
Организация: НИИССИ
есть у кого нибудь пример, сделанный на основе библиотеки,
передача по 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
Сообщения: 63
Организация: НИИССИ
ну чо, неужели никто не делал персылку по UART DMA?
ни один пример DAM с UART не работает
в чем проблема может быть?


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

Зарегистрирован: 2016-июн-15 13:22
Сообщения: 43
Организация: EnSol
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+03:00


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

Сейчас этот форум просматривают: Google [Bot] и 13 гостей


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

Перейти: 

cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB