搜索
bottom↓
回复: 6

发一个STM32 循环队列发送485 数据的通用程序模块

[复制链接]

出0入0汤圆

发表于 2018-11-15 11:43:25 | 显示全部楼层 |阅读模式
void BSP_UART_Init(BUFF_TcbType* pbcb);

void BSP_UART_RxStart(UART_HandleTypeDef* huart, BUFF_TcbType* pbcb);
       
void BSP_UART_Getchars(UART_HandleTypeDef* huart,  BUFF_TcbType* pbcb);

void BSP_UART_FlushRxbuff(UART_HandleTypeDef* huart,  BUFF_TcbType* pbcb);

void BSP_UART_Putchars(UART_HandleTypeDef *huart, BUFF_TcbType* pbcb, uint8_t* pd, uint8_t size);



#define USART_FPGA                  USART1

#define USART_PC                   USART3

                                       




/*                Description :
        Initialize the BUFF_TcbType structure
*/

void BSP_UART_Init(BUFF_TcbType* pbcb)
{
        pbcb->pr = pbcb->rxbuff;

        pbcb->pti = pbcb->txbuff;
         
        pbcb->pto = pbcb->txbuff;
       
        pbcb->rxcount = 0;

        pbcb->txcount = 0;

        pbcb->hal_txcount = 0;
         
}

/* Description:
        main routine calls this function to launch UART data Recieving (Enable the RXNE INT),
        and the receive loop between bsp layer and hal layer will keep on going.
*/
void BSP_UART_RxStart(UART_HandleTypeDef* huart, BUFF_TcbType* pbcb)
{
        HAL_UART_Receive_IT(huart, pbcb->hal_rxbuff,HAL_RX_BUFF_SIZE);
}



/*        Description:
        Obtain or move the received datas from HAL buffer  to BSP buffer
        @ *ps  , pointer of source
        @ *pd  , pointer of destination
*/



void BSP_UART_Getchars(UART_HandleTypeDef* huart,  BUFF_TcbType* pbcb)               
{                                                                                                                                        /*main routine move data from hal layer to bsp layer periodically */
                                                                                                                                        /*HAL_UART_RxCpltCallback(huart) wouldn't be called if the main routine works correctlly*/
                                                                                                                                        /*the main program must be blocked if this funcition was called*/
       
        if(huart->RxXferCount)
        {
                /*transfer data from HAL to BSP*/
                *pbcb->pr=*huart->pRxBuffOutPtr;
                /*update BSP layer data structure*/
                pbcb->rxcount++;
               
                pbcb->pr++;
                /*update HAL layer structure*/
                __disable_irq();
               
                huart->RxXferCount--;
               
                __enable_irq();
               
                huart->pRxBuffOutPtr++;
               
                /*update HAL layer data structure*/
                if(huart->pRxBuffOutPtr == &pbcb->hal_rxbuff[HAL_RX_BUFF_SIZE])
                {
                        huart->pRxBuffOutPtr = &pbcb->hal_rxbuff[0];
                }
        }
       
       
}                                                                                                               

/*                Description:
        This function nerve be called unless overflow  occured or main rountine was blocked
        and didn't obtain data from rx bsp buffer in time.
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        //BSP_Debug();
}


/*                Description:
        Flush the RX buffer of bsp layer after the received msg was accepted
*/
void BSP_UART_FlushRxbuff( UART_HandleTypeDef *huart,BUFF_TcbType* pbcb)                                                                                               
{
       
        /*reload control information for buff of BSP layer*/
        uint8_t i;
        __disable_irq();
       
        for(i = 0; i < pbcb->rxcount; i++)
        {
                pbcb->rxbuff[i] = 0;
        }
        pbcb->rxcount = 0;
        pbcb->pr = pbcb->rxbuff;
       
        __enable_irq();
}















/*                Description:
        While datas in the hal layer were transmitted , this function will be called automatically
        by HW system, we shall load datas from bsp layer to hal layer in this function , and launch
        the next transmition, the Tx loop between bsp layer and hal layer will keep on going.
*/
void HAL_UART_TxCpltCallbackExt(UART_HandleTypeDef *huart, BUFF_TcbType* pbcb)
{
        /*channel uart to pc tx completed*/
        int8_t tmp ,i ,idx;
        int16_t d;
        if(huart->Instance == USART_PC)
        {
                idx=0;                                                                /*subscript*/
        }
        if(huart->Instance == USART_FPGA)
        {
                idx=1;
        }
       
        /*step 1: check if all the datas in bsp tx buff were transmitted */
        if(pbcb->txcount > 0)
        {
                /*step 2: check how many datas are in the tx buff*/
                if(pbcb->txcount  > HAL_TX_BUFF_SIZE)
                {
                        tmp = HAL_TX_BUFF_SIZE;
                }
               
                else
                {
                        tmp = pbcb->txcount;
                }
                /*step 3: remove data from bsp layer to hal layer */       
                for(i = 0; i < tmp; i++)
                {
                        /*refresh pbcb */
                        pbcb->hal_txbuff[i] = *pbcb->pto++;
                        pbcb->txcount--;
                        pbcb->hal_txcount++;
                       
                        /*ring buffer ,pointer move to head*/
                        if( pbcb->pto == (pbcb->txbuff  +  BSP_TX_BUFF_SIZE))
                        {
                                pbcb->pto = pbcb->txbuff;
                        }
                       
                }
               
                if(huart->Instance == USART_PC)
                {       
                        /*if it is 485 bus , set the dircetion to tx*/
                        __BSP_RS485_TXD();               
                }
               
                /*step 4: arm to transimit bsp data*/
                HAL_UART_Transmit_IT(huart, pbcb->hal_txbuff, pbcb->hal_txcount);
               
                pbcb->hal_txcount = 0;
        }
        /*data in bsp buff has been tx*/
        else
        {
                if(huart->Instance == USART_PC)
                {
                        for(d = 5000; d >0; d--)                        /*hold on here until the datas on the bus were transmitted*/
                        ;
                        __BSP_RS485_RXD();
                }
        }
       
       
}
/*                Description
        put chars into bsp layer buffer, if huart->State !=HAL_UART_STATE_BUSY_TX
        launch transimition process ,then  the loop between bsp layer and hal layer keep going
        @ huart ,hal layer object
        @ pbcb,        bsp layer object
        @ *pd, pointer to datas to be transfer
        @ size, number of data to be transfer
*/
void BSP_UART_Putchars(UART_HandleTypeDef *huart, BUFF_TcbType* pbcb, uint8_t* pd, uint8_t size)
{
        int8_t i,tmp;
       
        /*step 1: put the chars into bsp buffer*/       

        __disable_irq();
       
        for(i=0;i<size;i++)
        {
                *pbcb->pti++= *pd++;
                pbcb->txcount++;
               
                /*ring buffer ,pointer move to head from rear*/
                if( pbcb->pti == (pbcb->txbuff  +  BSP_TX_BUFF_SIZE))
                {
                        pbcb->pti = pbcb->txbuff;
                }
                       
        }
        __enable_irq();

        /*step 2: if huart->state is free for tx, move data from bsp to hal and start a transfer*/
       
        if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
        {
                       
                if(pbcb->txcount  > HAL_TX_BUFF_SIZE)
                {
                        tmp = HAL_TX_BUFF_SIZE;
                }
               
                else
                {
                        tmp = pbcb->txcount;
                }
               
               
                /*refresh pbcb */
                for(i = 0; i < tmp; i++)
                {
                        pbcb->hal_txbuff[i] = *pbcb->pto++;
                        pbcb->txcount--;
                        pbcb->hal_txcount++;
                       
                        /*ring buffer ,pointer move to head*/
                        if( pbcb->pto == (pbcb->txbuff  +  BSP_TX_BUFF_SIZE))
                        {
                                pbcb->pto = pbcb->txbuff;
                        }
                       
                }
               
                /*if it is 485 bus , set the dircetion to tx*/
                if(huart->Instance ==USART_PC)
                {
                        __BSP_RS485_TXD();
                }
               
                /*arm to transimit bsp data*/
                HAL_UART_Transmit_IT(huart, pbcb->hal_txbuff, pbcb->hal_txcount);
               
                pbcb->hal_txcount = 0;
               
         }
       
        /*if huart->state is busy for tx ,do nothing*/       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2018-11-15 15:22:56 | 显示全部楼层
留个爪吧,如果有文件,接收发送都有FIFO就好了

出0入0汤圆

发表于 2018-11-15 15:40:55 | 显示全部楼层
串口 通信  使用缓冲区的方法

出330入0汤圆

发表于 2018-11-15 18:58:50 来自手机 | 显示全部楼层
最要紧的是接收,发送DMA搞定。

出0入0汤圆

发表于 2018-11-21 18:35:47 | 显示全部楼层
还不错

出0入0汤圆

发表于 2018-11-22 08:30:51 | 显示全部楼层
太好了 这个比较适合我

出10入12汤圆

发表于 2018-11-22 10:50:57 | 显示全部楼层
没有dma??????????
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 11:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表