±êÌâ: ´®¿ÚDMA½ÓÊÕ£¨¼Ä´æÆ÷£© [´òÓ¡±¾Ò³]

×÷Õß: wangxiong    ʱ¼ä: 2016-9-30 11:01
±êÌâ: ´®¿ÚDMA½ÓÊÕ£¨¼Ä´æÆ÷£©
ÒªÓõ½µÄÊÇ´®¿Ú¿ÕÏÐÖжÏ
ÌØ±ðÖ÷Òª£¬Èç¹û¿ªÆôÁËdmaÓ³É䣬һ¶¨¼ÇµÃÒª¿ªÆôsyscfgÀïÃæµÄʱÖÓ£¬

/*
**************************************************************
**Ãû³Æ: void UART_DMA_Config()
**¹¦ÄÜ: UART³õʼ»¯
**Èë¿Ú: ÎÞ
**³ö¿Ú: ÎÞ
**************************************************************
*/
void UART_DMA_ConfigTx(DMA_Channel_TypeDef*DMA_CHx,ulong cpar,ulong cmar)
{
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    Afx_Delayus(100);
    DMA_CHx->CPAR = cpar; //Ô´
    DMA_CHx->CMAR = cmar;
    DMA_CHx->CCR = 0X00000000;
    DMA_CHx->CCR = DMA_CCR_MINC|DMA_CCR_DIR;//memory inc          ,read from memory
}

/*
**************************************************************
**Ãû³Æ: void UART_DMA_ConfigRx()
**¹¦ÄÜ: UART³õʼ»¯
**Èë¿Ú: ÎÞ
**³ö¿Ú: ÎÞ
**************************************************************
*/
void UART_DMA_ConfigRx(DMA_Channel_TypeDef*DMA_CHx,ulong cpar,ulong cmar)
{
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    Afx_Delayus(100);
    DMA_CHx->CPAR = cpar; //Ô´
    DMA_CHx->CMAR = cmar;
    DMA_CHx->CNDTR= 100;
    DMA_CHx->CCR = 0X00000000;
    DMA_CHx->CCR = DMA_CCR_MINC;//ÍâÉèºÍÄÚ´æ¶¼8×Ö½Ú£¬ÄÚ´æµÝÔö£¬ÍâÉè¹Ì¶¨£¬²»Æô¶¯Ñ­»·Ä£Ê½£¬´ÓÍâÉè¶ÁÈ¡£¬Í¨µÀ²»Ê¹ÄÜÖжÏ
}

/*
**************************************************************
**Ãû³Æ: void Afx_UARTInit()
**¹¦ÄÜ: UART³õʼ»¯
**Èë¿Ú: ÎÞ
**³ö¿Ú: ÎÞ
**************************************************************
*/
void Afx_UARTInit(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

    RCC->APB2RSTR|=RCC_APB2RSTR_USART1RST;   //¸´Î»´®¿Ú1
    RCC->APB2RSTR&=~RCC_APB2RSTR_USART1RST;        //Í£Ö¹¸´Î»

    //  UARTA 485
    USART1->BRR = 480000 / 96;
    USART1->CR1 = USART_CR1_TE|USART_CR1_RE|USART_CR1_UE|USART_CR1_IDLEIE;        //USART_CR1_RXNEIE|½ÓÊÜÖжÏÔÊÐí£¬½ÓÊÕ·¢ËÍʹÄÜ£¬¿ª    Æô´®¿Ú
    USART1->CR3 = USART_CR3_DMAT|USART_CR3_DMAR;           //·¢ËÍdmaʹÄÜ
    UART_DMA_ConfigTx(DMA1_Channel2,(ulong)&USART1->TDR,(ulong)iSendBuf);
    UART_DMA_ConfigRx(DMA1_Channel3,(ulong)&USART1->RDR,(ulong)RX485_fifo.buff);
    while((USART1->ISR & USART_ISR_TC) != USART_ISR_TC);        /* polling idle frame Transmission */
    USART1->ICR |= USART_ICR_TCCF;        /* Clear TC flag */

    DMA1_Channel3->CCR |= DMA_CCR_EN;

    NVIC_SetPriority(USART1_IRQn, 0);
    NVIC_EnableIRQ(USART1_IRQn);
}



void Afx_UartDmaEnable(DMA_Channel_TypeDef*DMA_CHx,uchar len)
{
     DMA_CHx->CCR&=~(1<<0);     //¹Ø±ÕÏÈ
     DMA_CHx->CNDTR=len;           //ÅäÖó¤¶È£¬Ä¿±êºÍÔ´ÔÚ³õʼ»¯µÄʱºòÒѾ­ÓÐÅäÖÃ
     DMA_CHx->CCR|=1<<0;           //¿ªÆô´«Êä
}         




/*
**************************************************************
**Ãû³Æ: void USART1_IRQHandler()
**¹¦ÄÜ: UART1Öжϴ¦Àí
**Èë¿Ú: ÎÞ
**³ö¿Ú: ÎÞ
**************************************************************
*/
void USART1_IRQHandler(void)
{
    ulong rtem;
    uchar rGetUartLenth = 0;
    rtem = USART1->ISR;
    if((rtem & USART_ISR_IDLE) == USART_ISR_IDLE)
    {
        rGetUartLenth = USART1->RDR; //ÇåUSART_IT_IDLE±êÖ¾
        DMA1_Channel3->CCR &= ~DMA_CCR_EN;
        rGetUartLenth = 100 - DMA1_Channel3->CNDTR;
        DMA1_Channel3->CNDTR = 100;
        RX485_fifo.ct = rGetUartLenth;
        DMA1_Channel3->CCR |= DMA_CCR_EN;
        gRs485Modbus.rNewFramDelay = 0;
        gRs485Modbus.rCTRL_BYTE.RecData = START;
    }   
    USART1->RQR |= USART_RQR_RXFRQ;
    USART1->ICR |= USART_ICR_ORECF|USART_ICR_IDLECF;
}


´®¿ÚModbusУÑé´¦ÀíÈçÏÂ


//************************************************************************
// name  :
// Descrp: ½ÓÊպͽâÃܱ¨ÎÄ
// input :
// return:
// author:
// date  :
//************************************************************************
uchar Afx_Rs485ModbusCommSrtingRecv( uchar *comm_buf)//comm_buf-->ModbusRevBuf È«²¿Êý¾Ý
{
    uchar sta_val = FAIL;
    uchar i = 0;
    if(gRs485Modbus.rCTRL_BYTE.rModbusNewFram == ModbusReady)          //³¬Ê± ¡¢ Êý¾Ý֡β
    {
        gRs485Modbus.rCTRL_BYTE.rModbusNewFram = ModbusNotReady;
        if(RX485_fifo.ct >= 5)//gRs232Modbus.MinRecNum
        {
            INT_BITS CRCData;
            INT_BITS CRCDataHL;
            CRCData.Val = Afx_CRCCheckSumByte(comm_buf,RX485_fifo.ct-2);
            CRCDataHL.v[0] = comm_buf[RX485_fifo.ct-2];
            CRCDataHL.v[1] = comm_buf[RX485_fifo.ct-1];
            if (CRCData.Val == CRCDataHL.Val)
            {
                gRs485Modbus.RecValueCount = RX485_fifo.ct;
                sta_val = PASS;
            }
            for(i = 0;i<RX485_fifo.ct;i++)
            {
                *comm_buf = RX485_fifo.buff;
                comm_buf++;
            }
        }
        RX485_fifo.ct = 0;
    }
    return sta_val;
}









»¶Ó­¹âÁÙ (http://www.51hei.com/bbs/) Powered by Discuz! X3.1