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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

GD32F103RCT6單片機串口初始化寄存器版代碼(循環數組異步發送)

[復制鏈接]
跳轉到指定樓層
樓主
ID:939250 發表于 2021-6-17 13:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//USART0
void Usart0Init(uint32_t baud)                  //PA10 RX  PA9 TX     //
{
        uint32_t Udiv = 0;
  RCU_APB2EN |= 0x00000001<<2;                //使能GPIOA時鐘
        RCU_APB2EN |= 0x00000001<<14;               //使能USART0時鐘
  GPIO_CTL1(GPIOA) &= 0xfffff0ff;            //設置RX引腳浮空輸入  PA10
        GPIO_CTL1(GPIOA) |= (0x00000004<<(4*2));
  GPIO_CTL1(GPIOA) &= 0xffffff0f;            //設置TX引腳復用推完輸出  50M     PA9
  GPIO_CTL1(GPIOA) |= (0x0000000B<<(4*1));   

        RCU_APB2RST  |=  (0x00000001 <<14);        //復位USART0
        RCU_APB2RST  &= ~(0x00000001 <<14);        //停止復位
        
        //計算波特率分頻比   udiv = UART0_CLK/(16*baud)  但寄存器中中小數點后面有四位,則需要擴大16倍  則 =  UART0_CLK/baud
        //時鐘頻率為APB2(系統初始化時已設定APB2等于APB等于系統時鐘108M)
  Udiv = (APB2_CLK+baud/2)/baud;                  //參考庫函數比用戶手冊上大一些,是不是因為經驗不穩定而加大一點
        USART_BAUD(USART0) = (Udiv) & 0x0000ffff;       //分頻比 共16位  12位整數  4位小數

        USART_CTL0(USART0) &= ~(0x00000001 <<12);       //12位設置為0  表示8位數據位

        
        USART_CTL1(USART0) &= ~(0x00000003 <<12);        //12-13位設置為0   表示1位停止位
        USART_CTL0(USART0) &= ~(0x00000003 <<9);         //9-10位設置為0    表示無效驗位
        
        USART_CTL2(USART0) &= ~(0x00000003 <<8);         //8-9位設置為0     表示禁用RTS CTS
        
        USART_CTL0(USART0) &= ~(0x00000003 <<2);       //第2位 設置為1  使能接收  3位設置為1  使能發送
        USART_CTL0(USART0) |=  (0x00000003 <<2);
        
        USART_CTL0(USART0) |=  (0x00000003 <<5);      //5位置1  接收緩沖器清空中斷   6位置1  發送完成中斷
        
        nvic_irq_enable(USART0_IRQn, 0, 0);           //設置中斷優先級
        USART_CTL0(USART0) |=  (0x00000001 <<13);      //使能USART0
}

void USART0_IRQHandler(void)
{
        uint32_t tmp = 0;
        if(USART_STAT(USART0) &(0x00000001 <<6))          //發送完成
  {
                USART_STAT(USART0) &= ~(0x00000001 <<6);
                if(mUsart0.TX.OntPtr != mUsart0.TX.InPtr)
                {
                 USART_DATA(USART0) =  mUsart0.TX.Buffer[mUsart0.TX.OntPtr];
                        mUsart0.TX.OntPtr++;
                        if(mUsart0.TX.OntPtr >=USART0_TX_BUFFER_SIZE)
                        {
                          mUsart0.TX.OntPtr = 0;
                        }
                }
                else
                {
                        mUsart0.IsSending = 0;
                }
               
        }
        
  if(USART_STAT(USART0) &(0x00000001 <<5))          //接收到數據
  {
                tmp = USART_STAT(USART0);
                mUsart0.RX.Buffer[mUsart0.RX.InPtr] = USART_DATA(USART0);
                mUsart0.RX.InPtr++;
                if(mUsart0.RX.InPtr >= USART0_RX_BUFFER_SIZE)
                {
                  mUsart0.RX.InPtr = 0;
                }
        }
        if(USART_STAT(USART0) &(0x00000001 <<3))          //溢出中斷
        {
                tmp = USART_STAT(USART0);
                tmp = (USART_DATA(USART0)&0x000000ff);
        }
}

void Usart0Send(unsigned char *dta,unsigned char lg)
{
        unsigned char i;
        for(i=0;i<lg;i++)
        {
                mUsart0.TX.Buffer[mUsart0.TX.InPtr] = dta[ i];
                mUsart0.TX.InPtr++;
                if(mUsart0.TX.InPtr >=USART0_TX_BUFFER_SIZE)
                {
                         mUsart0.TX.InPtr = 0;
                }
        }
        if(mUsart0.IsSending == 0)
        {
                mUsart0.IsSending = 1;
                USART_DATA(USART0) =  mUsart0.TX.Buffer[mUsart0.TX.OntPtr];
                mUsart0.TX.OntPtr++;
          if(mUsart0.TX.OntPtr >=USART0_TX_BUFFER_SIZE)
                {
                        mUsart0.TX.OntPtr = 0;
                }
        }
}

void ResetUsart0DataBuffer(void)
{
        unsigned int i;
        for(i=0;i<USART0_TX_BUFFER_SIZE;i++)
        {
                mUsart0.TX.Buffer[ i] = 0;
        }
        for(i=0;i<USART0_RX_BUFFER_SIZE;i++)
        {
                mUsart0.RX.Buffer[ i] = 0;
        }
        mUsart0.TX.OntPtr = 0;
  mUsart0.TX.InPtr = 0;
  mUsart0.RX.OntPtr = 0;
  mUsart0.RX.InPtr = 0;
}

//USART1

void Usart1Init(uint32_t baud)               //PA3 RX  PA2 TX
{
        uint32_t Udiv = 0;
  RCU_APB2EN |= 0x00000001<<2;               //使能GPIOA時鐘
        RCU_APB1EN |= 0x00000001<<17;              //使能USART1時鐘
  GPIO_CTL0(GPIOA) &= 0xffff0fff;            //設置RX引腳浮空輸入  PA3
        GPIO_CTL0(GPIOA) |= (0x00000004<<(4*3));
  GPIO_CTL0(GPIOA) &= 0xfffff0ff;            //設置TX引腳復用推完輸出   50M     PA2
  GPIO_CTL0(GPIOA) |= (0x0000000B<<(4*2));   
  RCU_APB1RST  |=  (0x00000001 <<17);        //復位USART1
        RCU_APB1RST  &= ~(0x00000001 <<17);        //停止復位
        
        //計算波特率分頻比   udiv = UART0_CLK/(16*baud)  但寄存器中中小數點后面有四位,則需要擴大16倍  則 =  UART0_CLK/baud
        //時鐘頻率為APB1(系統初始化時已設定APB2等于APB/2等于系統時鐘108M/2)
  Udiv = (APB1_CLK+baud/2)/baud;                  //參考庫函數比用戶手冊上大一些,是不是因為經驗不穩定而加大一點
        USART_BAUD(USART1) = (Udiv) & 0x0000ffff;       //分頻比 共16位  12位整數  4位小數

        USART_CTL0(USART1) &= ~(0x00000001 <<12);       //12位設置為0  表示8位數據位

        
        USART_CTL1(USART1) &= ~(0x00000003 <<12);        //12-13位設置為0   表示1位停止位
        USART_CTL0(USART1) &= ~(0x00000003 <<9);         //9-10位設置為0    表示無效驗位
        
        USART_CTL2(USART1) &= ~(0x00000003 <<8);         //8-9位設置為0     表示禁用RTS CTS
        
        USART_CTL0(USART1) &= ~(0x00000003 <<2);       //第2位 設置為1  使能接收  3位設置為1  使能發送
        USART_CTL0(USART1) |=  (0x00000003 <<2);
        
        USART_CTL0(USART1) |=  (0x00000003 <<5);      //5位置1  接收緩沖器清空中斷   6位置1  發送完成中斷
        
        nvic_irq_enable(USART1_IRQn, 0, 0);           //設置中斷優先級
        USART_CTL0(USART1) |=  (0x00000001 <<13);      //使能USART0
}

void USART1_IRQHandler(void)
{
        uint32_t tmp = 0;
        if(USART_STAT(USART1) &(0x00000001 <<6))          //發送完成
  {
                USART_STAT(USART1) &= ~(0x00000001 <<6);
                if(mUsart1.TX.OntPtr != mUsart1.TX.InPtr)
                {
                  USART_DATA(USART1) =  mUsart1.TX.Buffer[mUsart1.TX.OntPtr];
                        mUsart1.TX.OntPtr++;
                        if(mUsart1.TX.OntPtr >=USART1_TX_BUFFER_SIZE)
                        {
                          mUsart1.TX.OntPtr = 0;
                        }
                }
                else
                {
                        mUsart1.IsSending = 0;
                }
               
        }
        
  if(USART_STAT(USART1) &(0x00000001 <<5))          //接收到數據
  {
                tmp = USART_STAT(USART1);
                mUsart1.RX.Buffer[mUsart1.RX.InPtr] = USART_DATA(USART1);
                mUsart1.RX.InPtr++;
                if(mUsart1.RX.InPtr >= USART1_RX_BUFFER_SIZE)
                {
                  mUsart1.RX.InPtr = 0;
                }
        }
        if(USART_STAT(USART1) &(0x00000001 <<3))          //溢出中斷
        {
                tmp = USART_STAT(USART1);
                tmp = (USART_DATA(USART1)&0x000000ff);
        }
}

void Usart1Send(unsigned char *dta,unsigned char lg)
{
        unsigned char i;
        for(i=0;i<lg;i++)
        {
                mUsart1.TX.Buffer[mUsart1.TX.InPtr] = dta[ i];
                mUsart1.TX.InPtr++;
                if(mUsart1.TX.InPtr >=USART1_TX_BUFFER_SIZE)
                {
                         mUsart1.TX.InPtr = 0;
                }
        }
        if(mUsart1.IsSending == 0)
        {
                mUsart1.IsSending = 1;
                USART_DATA(USART1) =  mUsart1.TX.Buffer[mUsart1.TX.OntPtr];
                mUsart1.TX.OntPtr++;
          if(mUsart1.TX.OntPtr >=USART1_TX_BUFFER_SIZE)
                {
                        mUsart1.TX.OntPtr = 0;
                }
        }
}

void ResetUsart1DataBuffer(void)
{
        unsigned int i;
        for(i=0;i<USART1_TX_BUFFER_SIZE;i++)
        {
                mUsart1.TX.Buffer[ i] = 0;
        }
        for(i=0;i<USART1_RX_BUFFER_SIZE;i++)
        {
                mUsart1.RX.Buffer[ i] = 0;
        }
        mUsart1.TX.OntPtr = 0;
  mUsart1.TX.InPtr = 0;
  mUsart1.RX.OntPtr = 0;
  mUsart1.RX.InPtr = 0;
}


//

void Usart2Init(uint32_t baud)               //PB11 RX  PB10 TX
{
        uint32_t Udiv = 0;
  RCU_APB2EN |= 0x00000001<<3;                //使能GPIOB時鐘
        RCU_APB1EN |= 0x00000001<<18;               //使能USART2時鐘
  GPIO_CTL1(GPIOB) &= 0xffff0fff;            //設置RX引腳浮空輸入  PA10
        GPIO_CTL1(GPIOB) |= (0x00000004<<(4*3));
  GPIO_CTL1(GPIOB) &= 0xfffff0ff;            //設置TX引腳復用推完輸出  50M     PB10
  GPIO_CTL1(GPIOB) |= (0x0000000B<<(4*2));   

        RCU_APB1RST  |=  (0x00000001 <<18);        //復位USART2
        RCU_APB1RST  &= ~(0x00000001 <<18);        //停止復位
        
        //計算波特率分頻比   udiv = UART0_CLK/(16*baud)  但寄存器中中小數點后面有四位,則需要擴大16倍  則 =  UART0_CLK/baud
        //時鐘頻率為APB1(系統初始化時已設定APB2等于APB/2等于系統時鐘108M/2)
  Udiv = (APB1_CLK+baud/2)/baud;                  //參考庫函數比用戶手冊上大一些,是不是因為經驗不穩定而加大一點
        USART_BAUD(USART2) = (Udiv) & 0x0000ffff;       //分頻比 共16位  12位整數  4位小數

        USART_CTL0(USART2) &= ~(0x00000001 <<12);       //12位設置為0  表示8位數據位

        
        USART_CTL1(USART2) &= ~(0x00000003 <<12);        //12-13位設置為0   表示1位停止位
        USART_CTL0(USART2) &= ~(0x00000003 <<9);         //9-10位設置為0    表示無效驗位
        
        USART_CTL2(USART2) &= ~(0x00000003 <<8);         //8-9位設置為0     表示禁用RTS CTS
        
        USART_CTL0(USART2) &= ~(0x00000003 <<2);       //第2位 設置為1  使能接收  3位設置為1  使能發送
        USART_CTL0(USART2) |=  (0x00000003 <<2);
        
        USART_CTL0(USART2) |=  (0x00000003 <<5);      //5位置1  接收緩沖器清空中斷   6位置1  發送完成中斷
        
        nvic_irq_enable(USART2_IRQn, 0, 0);           //設置中斷優先級
        USART_CTL0(USART2) |=  (0x00000001 <<13);      //使能USART0
}

void USART2_IRQHandler(void)
{
        uint32_t tmp = 0;
        if(USART_STAT(USART2) &(0x00000001 <<6))          //發送完成
  {
                USART_STAT(USART2) &= ~(0x00000001 <<6);
                if(mUsart2.TX.OntPtr != mUsart2.TX.InPtr)
                {
                  USART_DATA(USART2) =  mUsart2.TX.Buffer[mUsart2.TX.OntPtr];
                        mUsart2.TX.OntPtr++;
                        if(mUsart2.TX.OntPtr >=USART2_TX_BUFFER_SIZE)
                        {
                          mUsart2.TX.OntPtr = 0;
                        }
                }
                else
                {
                        mUsart2.IsSending = 0;
                }
               
        }
        
  if(USART_STAT(USART2) &(0x00000001 <<5))          //接收到數據
  {
                tmp = USART_STAT(USART2);
                mUsart2.RX.Buffer[mUsart2.RX.InPtr] = USART_DATA(USART2);
                mUsart2.RX.InPtr++;
                if(mUsart2.RX.InPtr >= USART2_RX_BUFFER_SIZE)
                {
                  mUsart2.RX.InPtr = 0;
                }
        }
        if(USART_STAT(USART2) &(0x00000001 <<3))          //溢出中斷
        {
                tmp = USART_STAT(USART2);
                tmp = (USART_DATA(USART2)&0x000000ff);
        }
}

void Usart2Send(unsigned char *dta,unsigned char lg)
{
        unsigned char i;
        for(i=0;i<lg;i++)
        {
                mUsart2.TX.Buffer[mUsart2.TX.InPtr] = dta[ i];
                mUsart2.TX.InPtr++;
                if(mUsart2.TX.InPtr >=USART2_TX_BUFFER_SIZE)
                {
                         mUsart2.TX.InPtr = 0;
                }
        }
        if(mUsart2.IsSending == 0)
        {
                mUsart2.IsSending = 1;
                USART_DATA(USART2) =  mUsart2.TX.Buffer[mUsart2.TX.OntPtr];
                mUsart2.TX.OntPtr++;
          if(mUsart2.TX.OntPtr >=USART2_TX_BUFFER_SIZE)
                {
                        mUsart2.TX.OntPtr = 0;
                }
        }
}

void ResetUsart2DataBuffer(void)
{
        unsigned int i;
        for(i=0;i<USART2_TX_BUFFER_SIZE;i++)
        {
                mUsart2.TX.Buffer[ i] = 0;
        }
        for(i=0;i<USART2_RX_BUFFER_SIZE;i++)
        {
                mUsart2.RX.Buffer[ i] = 0;
        }
        mUsart2.TX.OntPtr = 0;
  mUsart2.TX.InPtr = 0;
  mUsart2.RX.OntPtr = 0;
  mUsart2.RX.InPtr = 0;
}

void Usart3Init(uint32_t baud)               //PC11 RX  PC10 TX
{
        uint32_t Udiv = 0;
  RCU_APB2EN |= 0x00000001<<4;                //使能GPIOC時鐘
        RCU_APB1EN |= 0x00000001<<19;               //使能USART2時鐘
  GPIO_CTL1(GPIOC) &= 0xffff0fff;            //設置RX引腳浮空輸入  PC11
        GPIO_CTL1(GPIOC) |= (0x00000004<<(4*3));
  GPIO_CTL1(GPIOC) &= 0xfffff0ff;            //設置TX引腳復用推完輸出  50M     PC10
  GPIO_CTL1(GPIOC) |= (0x0000000B<<(4*2));   

        RCU_APB1RST  |=  (0x00000001 <<19);        //復位USART2
        RCU_APB1RST  &= ~(0x00000001 <<19);        //停止復位
        
        //計算波特率分頻比   udiv = UART0_CLK/(16*baud)  但寄存器中中小數點后面有四位,則需要擴大16倍  則 =  UART0_CLK/baud
        //時鐘頻率為APB1(系統初始化時已設定APB2等于APB/2等于系統時鐘108M/2)
  Udiv = (APB1_CLK+baud/2)/baud;                  //參考庫函數比用戶手冊上大一些,是不是因為經驗不穩定而加大一點
        USART_BAUD(UART3) = (Udiv) & 0x0000ffff;       //分頻比 共16位  12位整數  4位小數

        USART_CTL0(UART3) &= ~(0x00000001 <<12);       //12位設置為0  表示8位數據位
        
        USART_CTL1(UART3) &= ~(0x00000003 <<12);        //12-13位設置為0   表示1位停止位
        USART_CTL0(UART3) &= ~(0x00000003 <<9);         //9-10位設置為0    表示無效驗位
        
        USART_CTL2(UART3) &= ~(0x00000003 <<8);         //8-9位設置為0     表示禁用RTS CTS
        
        USART_CTL0(UART3) &= ~(0x00000003 <<2);       //第2位 設置為1  使能接收  3位設置為1  使能發送
        USART_CTL0(UART3) |=  (0x00000003 <<2);
        
        USART_CTL0(UART3) |=  (0x00000003 <<5);      //5位置1  接收緩沖器清空中斷   6位置1  發送完成中斷
        
        nvic_irq_enable(UART3_IRQn, 0, 1);           //設置中斷優先級
        USART_CTL0(UART3) |=  (0x00000001 <<13);      //使能USART0
}

void UART3_IRQHandler(void)
{
        uint32_t tmp = 0;
        if(USART_STAT(UART3) &(0x00000001 <<6))          //發送完成
  {
                USART_STAT(UART3) &= ~(0x00000001 <<6);
                if(mUsart3.TX.OntPtr != mUsart3.TX.InPtr)
                {
                  USART_DATA(UART3) =  mUsart3.TX.Buffer[mUsart3.TX.OntPtr];
                        mUsart3.TX.OntPtr++;
                        if(mUsart3.TX.OntPtr >=USART3_TX_BUFFER_SIZE)
                        {
                          mUsart3.TX.OntPtr = 0;
                        }
                }
                else
                {
                        mUsart3.IsSending = 0;
                }
               
        }
        
  if(USART_STAT(UART3) &(0x00000001 <<5))          //接收到數據
  {
                tmp = USART_STAT(UART3);
                mUsart3.RX.Buffer[mUsart3.RX.InPtr] = USART_DATA(UART3);
                mUsart3.RX.InPtr++;
                if(mUsart3.RX.InPtr >= USART3_RX_BUFFER_SIZE)
                {
                  mUsart3.RX.InPtr = 0;
                }
        }
        if(USART_STAT(UART3) &(0x00000001 <<3))          //溢出中斷
        {
                tmp = USART_STAT(UART3);
                tmp = (USART_DATA(UART3)&0x000000ff);
        }
}

void Usart3Send(unsigned char *dta,unsigned char lg)
{
        unsigned char i;
        for(i=0;i<lg;i++)
        {
                mUsart3.TX.Buffer[mUsart3.TX.InPtr] = dta[ i];
                mUsart3.TX.InPtr++;
                if(mUsart3.TX.InPtr >=USART3_TX_BUFFER_SIZE)
                {
                         mUsart3.TX.InPtr = 0;
                }
        }
        if(mUsart3.IsSending == 0)
        {
                mUsart3.IsSending = 1;
                USART_DATA(UART3) =  mUsart3.TX.Buffer[mUsart3.TX.OntPtr];
                mUsart3.TX.OntPtr++;
          if(mUsart3.TX.OntPtr >=USART3_TX_BUFFER_SIZE)
                {
                        mUsart3.TX.OntPtr = 0;
                }
        }
}

void ResetUsart3DataBuffer(void)
{
        unsigned int i;
        for(i=0;i<USART3_TX_BUFFER_SIZE;i++)
        {
                mUsart3.TX.Buffer[ i] = 0;
        }
        for(i=0;i<USART3_RX_BUFFER_SIZE;i++)
        {
                mUsart3.RX.Buffer[ i] = 0;
        }
        mUsart3.TX.OntPtr = 0;
  mUsart3.TX.InPtr = 0;
  mUsart3.RX.OntPtr = 0;
  mUsart3.RX.InPtr = 0;
}



void Usart4Init(uint32_t baud)               //PD2 RX  PC12 TX
{
        uint32_t Udiv = 0;
        RCU_APB2EN |= 0x00000001<<5;                //使能GPIOD時鐘
  RCU_APB2EN |= 0x00000001<<4;                //使能GPIOC時鐘
        RCU_APB1EN |= 0x00000001<<20;               //使能USART2時鐘
  GPIO_CTL0(GPIOD) &= 0xffffF0ff;            //設置RX引腳浮空輸入  PD2
        GPIO_CTL0(GPIOD) |= (0x00000004<<(4*2));
  GPIO_CTL1(GPIOC) &= 0xfff0ffff;            //設置TX引腳復用推完輸出  50M     PC12
  GPIO_CTL1(GPIOC) |= (0x0000000B<<(4*4));   

        RCU_APB1RST  |=  (0x00000001 <<20);        //復位USART2
        RCU_APB1RST  &= ~(0x00000001 <<20);        //停止復位
        
        //計算波特率分頻比   udiv = UART0_CLK/(16*baud)  但寄存器中中小數點后面有四位,則需要擴大16倍  則 =  UART0_CLK/baud
        //時鐘頻率為APB1(系統初始化時已設定APB2等于APB/2等于系統時鐘108M/2)
  Udiv = (APB1_CLK+baud/2)/baud;                  //參考庫函數比用戶手冊上大一些,是不是因為經驗不穩定而加大一點
        USART_BAUD(UART4) = (Udiv) & 0x0000ffff;       //分頻比 共16位  12位整數  4位小數

        USART_CTL0(UART4) &= ~(0x00000001 <<12);       //12位設置為1  表示8位數據位

        
        USART_CTL1(UART4) &= ~(0x00000003 <<12);        //12-13位設置為0   表示1位停止位
        USART_CTL0(UART4) &= ~(0x00000003 <<9);         //9-10位設置為0    表示無效驗位
        
        USART_CTL2(UART4) &= ~(0x00000003 <<8);         //8-9位設置為0     表示禁用RTS CTS
        
        USART_CTL0(UART4) &= ~(0x00000003 <<2);       //第2位 設置為1  使能接收  3位設置為1  使能發送
        USART_CTL0(UART4) |=  (0x00000003 <<2);
        
        USART_CTL0(UART4) |=  (0x00000003 <<5);      //5位置1  接收緩沖器清空中斷   6位置1  發送完成中斷
        
        nvic_irq_enable(UART4_IRQn, 1, 1);           //設置中斷優先級
        USART_CTL0(UART4) |=  (0x00000001 <<13);      //使能USART0
}

void UART4_IRQHandler(void)
{
        uint32_t tmp = 0;
        if(USART_STAT(UART4) &(0x00000001 <<6))          //發送完成
  {
                USART_STAT(UART4) &= ~(0x00000001 <<6);
                if(mUsart4.TX.OntPtr != mUsart4.TX.InPtr)
                {
                  USART_DATA(UART4) =  mUsart4.TX.Buffer[mUsart4.TX.OntPtr];
                        mUsart4.TX.OntPtr++;
                        if(mUsart4.TX.OntPtr >=USART4_TX_BUFFER_SIZE)
                        {
                          mUsart4.TX.OntPtr = 0;
                        }
                }
                else
                {
                        mUsart4.IsSending = 0;
                }
               
        }
        
  if(USART_STAT(UART4) &(0x00000001 <<5))          //接收到數據
  {
                tmp = USART_STAT(UART4);
                mUsart4.RX.Buffer[mUsart4.RX.InPtr] = USART_DATA(UART4);
                mUsart4.RX.InPtr++;
                if(mUsart4.RX.InPtr >= USART4_RX_BUFFER_SIZE)
                {
                  mUsart4.RX.InPtr = 0;
                }
        }
        if(USART_STAT(UART4) &(0x00000001 <<3))          //溢出中斷
        {
                tmp = USART_STAT(UART4);
                tmp = (USART_DATA(UART4)&0x000000ff);
        }
}

void Usart4Send(unsigned char *dta,unsigned char lg)
{
        unsigned char i;
        for(i=0;i<lg;i++)
        {
                mUsart4.TX.Buffer[mUsart4.TX.InPtr] = dta[ i];
                mUsart4.TX.InPtr++;
                if(mUsart4.TX.InPtr >=USART4_TX_BUFFER_SIZE)
                {
                         mUsart4.TX.InPtr = 0;
                }
        }
        if(mUsart4.IsSending == 0)
        {
                mUsart4.IsSending = 1;
                USART_DATA(UART4) =  mUsart4.TX.Buffer[mUsart4.TX.OntPtr];
                mUsart4.TX.OntPtr++;
          if(mUsart4.TX.OntPtr >=USART4_TX_BUFFER_SIZE)
                {
                        mUsart4.TX.OntPtr = 0;
                }
        }
}

void ResetUsart4DataBuffer(void)
{
        unsigned int i;
        for(i=0;i<USART4_TX_BUFFER_SIZE;i++)
        {
                mUsart4.TX.Buffer[ i] = 0;
        }
        for(i=0;i<USART4_RX_BUFFER_SIZE;i++)
        {
                mUsart4.RX.Buffer[ i] = 0;
        }
        mUsart4.TX.OntPtr = 0;
  mUsart4.TX.InPtr = 0;
  mUsart4.RX.OntPtr = 0;
  mUsart4.RX.InPtr = 0;
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:939250 發表于 2021-6-17 13:45 | 只看該作者
接受和發送使用循環數據組緩沖區異步發送
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 2021天天躁夜夜看 | 欧美在线观看一区 | 免费久久99精品国产婷婷六月 | 亚洲第一区国产精品 | 91av导航| 宅女噜噜66国产精品观看免费 | 日韩在线观看一区二区三区 | 中文字幕第100页 | 欧美 视频 | 亚洲第1页 | 玩丰满女领导对白露脸hd | 成人在线一区二区 | 午夜免费精品视频 | 狠狠色综合久久丁香婷婷 | 91精品亚洲 | 精品亚洲永久免费精品 | 天天干狠狠干 | 国产在线一区二区 | 亚洲精品久久久蜜桃网站 | 不卡在线视频 | 日韩欧美手机在线 | 黄色毛片网站在线观看 | 一级黄a| 欧美视频免费在线 | 激情六月丁香 | 国产精品视频网 | wwwww在线观看| 99久久国产免费 | 久久美女视频 | 午夜男人免费视频 | 国产精品久久久一区二区三区 | 青青久久| 国产h视频 | 成人高清在线视频 | 精品久久久久久18免费网站 | 涩涩导航| 91电影在线 | 日韩欧美网 | 99精品国自产在线 | 中文字幕1区2区 | 日韩在线视频一区二区三区 |