久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3357|回復: 0
打印 上一主題 下一主題
收起左側

串口DMA接收(寄存器)

[復制鏈接]
跳轉到指定樓層
樓主
ID:140959 發表于 2016-9-30 11:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
要用到的是串口空閑中斷
特別主要,如果開啟了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;
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久午夜片 | 亚洲自拍一区在线观看 | 国产日韩欧美在线 | 91在线精品一区二区 | 亚洲一区日韩 | 6996成人影院网在线播放 | 久久精品视频在线观看 | 久久99精品久久久久久噜噜 | 成人av网站在线观看 | 一级黄色生活视频 | 精品成人一区 | 91在线精品播放 | 国产精品成人一区二区 | 一区二区在线不卡 | 欧美日韩在线精品 | 欧美精品一区在线 | 亚洲成人一区二区三区 | 红桃视频一区二区三区免费 | 欧美一区二区视频 | 精品久久久久久久久久久院品网 | 在线精品观看 | 在线免费观看a级片 | 又爽又黄axxx片免费观看 | 一区二区高清 | 香蕉视频一区二区 | 亚洲欧美一区二区三区在线 | 免费xxxx大片国产在线 | jdav视频在线观看免费 | 色综合视频在线 | 99综合| 国产欧美日韩一区二区三区在线观看 | 久久久精品一区二区三区 | 妖精视频一区二区三区 | 日一区二区 | 亚洲一区二区在线视频 | 一级欧美| 欧洲精品久久久久毛片完整版 | 草久在线 | 国产一区二区高清在线 | 美国a级毛片免费视频 | 久久久久久综合 |