搜索
bottom↓
楼主: linquan315

STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)(申请加酷,让更多的人

  [复制链接]

出0入0汤圆

发表于 2012-12-14 18:59:15 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2012-12-19 19:19:10 | 显示全部楼层
真正的牛人呀!!
头像被屏蔽

出0入0汤圆

发表于 2012-12-22 11:33:17 | 显示全部楼层
很好的帖子!学习中!

出0入0汤圆

发表于 2012-12-22 12:43:20 | 显示全部楼层
mark 串口

出0入0汤圆

发表于 2012-12-23 00:34:03 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2012-12-24 16:43:41 | 显示全部楼层
只想用一个词:膜拜!

出0入4汤圆

发表于 2012-12-30 12:28:39 | 显示全部楼层
这个好,研究研究这2天

出0入0汤圆

发表于 2013-1-9 22:24:18 | 显示全部楼层
好东西受教了

出0入0汤圆

发表于 2013-1-9 22:37:09 | 显示全部楼层
非常的清楚

出0入0汤圆

发表于 2013-1-19 16:03:02 | 显示全部楼层
串口的详细介绍,STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)

出0入0汤圆

发表于 2013-1-23 17:21:20 | 显示全部楼层
看了好几遍楼主的帖子,但我的疑问还没解开:动态内存分配在这个地方应用,有啥子好处?至少我没看出来。用一个静态内存加上头尾指针,也可以实现啊!!

出0入0汤圆

发表于 2013-1-23 22:12:00 | 显示全部楼层
顶你,楼主

出0入0汤圆

发表于 2013-1-24 12:54:00 | 显示全部楼层
谢谢楼主的耐心讲解

出0入0汤圆

发表于 2013-1-24 14:39:12 | 显示全部楼层
环形队列 MARK

出0入0汤圆

发表于 2013-2-1 09:13:00 | 显示全部楼层
收藏下!!!

出0入0汤圆

发表于 2013-2-1 14:30:20 | 显示全部楼层
MARK
              

出0入0汤圆

发表于 2013-2-2 14:12:38 | 显示全部楼层
非常非常值得研究的一个帖子,感动

出0入0汤圆

发表于 2013-2-2 14:56:27 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2013-3-7 11:51:34 | 显示全部楼层
mark  下, ............

出0入0汤圆

发表于 2013-3-8 16:04:19 | 显示全部楼层
Very good!

出0入0汤圆

发表于 2013-3-12 00:53:40 | 显示全部楼层
太强了,学习中,顶!!!

出0入0汤圆

发表于 2013-3-15 17:45:40 | 显示全部楼层
分析精辟!顶

出0入0汤圆

发表于 2013-3-15 19:21:05 | 显示全部楼层
顶楼主!!!尤其是环形队列,我要好好研究一下!
头像被屏蔽

出0入0汤圆

发表于 2013-3-17 19:59:14 | 显示全部楼层
很详细 学习

出0入0汤圆

发表于 2013-3-17 20:42:52 | 显示全部楼层
不错 顶一下

出0入0汤圆

发表于 2013-3-17 21:00:29 | 显示全部楼层
好 记号一下

出0入0汤圆

发表于 2013-3-17 21:13:16 | 显示全部楼层
挺好,值得学习

出0入0汤圆

发表于 2013-3-20 17:21:32 | 显示全部楼层
谢谢楼主!学习了

出0入0汤圆

发表于 2013-3-22 19:25:45 | 显示全部楼层
楼主的帖子少而精,非常棒!
51单片机在用的时候,指针占用的字节数需要修改下,与32位不同,否则分配ucos内存块中,会发生错误

出0入0汤圆

发表于 2013-3-22 22:47:25 | 显示全部楼层
好东西,得好好学学了

出0入0汤圆

发表于 2013-4-1 10:43:21 | 显示全部楼层
haohaohaohao

出0入0汤圆

发表于 2013-4-1 11:28:11 | 显示全部楼层
mark,这个应该可以发送不定长数据的对吧

出0入0汤圆

发表于 2013-4-2 09:38:12 | 显示全部楼层
相当不错,谢谢分享~~~~~~~~~~~

出0入0汤圆

发表于 2013-4-7 14:21:52 | 显示全部楼层
楼主,你好,在串口的程序中,您是不是没有将头指针和尾指针重合时的情况分开考虑啊?头指针和尾指针重合时有一种情况有可能是缓冲区满,一种情况是缓冲区空时,您是不是没有分开考虑?

出0入0汤圆

发表于 2013-4-8 16:56:09 | 显示全部楼层
MARK                       

出0入0汤圆

发表于 2013-4-8 20:52:13 | 显示全部楼层
不错,学习了!

出0入0汤圆

发表于 2013-4-11 15:31:27 | 显示全部楼层
非常好的 好东西啊

出0入0汤圆

发表于 2013-4-11 18:02:49 | 显示全部楼层
非常感谢,因为刚开始接触STM32,还不知道串口发送数据还有这样的要求,今天学到了不少。

出0入0汤圆

发表于 2013-4-11 22:56:12 | 显示全部楼层
好东西。

出0入0汤圆

发表于 2013-4-12 03:11:09 来自手机 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2013-4-12 03:11:09 来自手机 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2013-4-12 10:08:22 | 显示全部楼层
你好,我用了你的串口驱动,不过发生了一点错误,不知你现在是否应改正。问题具体是:当发送的数据长度刚好是28的整数倍时(这里是按一个内存块32字节大小计算),而又发送的比较快(即第一包数据还没来得及发送就有来了一包数据)。会出现内存分配错误,即多分配了一个内存块,这样发送的次数多了内存就会被用满。

出0入0汤圆

发表于 2013-4-12 10:11:03 | 显示全部楼层
更改方法,以为在申请内存时你判断只要一个内存块占满,就又申请了一块,但是如果所发数据刚好是一个内存块大小时是不应该申请第二块内存块的,所以应该根据数据长度来判断是否该申请下一个,而不是根据前一个是否已经满

出0入0汤圆

发表于 2013-4-12 10:11:33 | 显示全部楼层
unsigned char USART3WriteDataToBuffer(unsigned char *buffer,unsigned char count)
{
        unsigned char i=count;
    u8 num;
        u8 err;
        /*´Ë´¦¿ÉÒÔ¼ÓÈëÐźŵƻòÕ߹رÕÖжÏ*/
        if(count==0)return 0;
        USART3StopSendISR();
        /*¼ÆËã·ÅÈëcount¸öÊý¾ÝÐèÒª¶àÉÙ¸öÄÚ´æ¿é*/
        if(count%USART3_SEND_MAX_Q)num=count/USART3_SEND_MAX_Q+1;
        else num=count/USART3_SEND_MAX_Q;
        /*ÐèÒªnum¸öÊý¾Ý¿é*/
        /*Èç¹ûÄÚ´æ²»×㣬ֱ½Ó·µ»Ø*/                 
        if(USART3SendQFree<num){USART3StartSendISR();return ERR_NO_SPACE;}
        //Ê×ÏÈÉêÇëÄÚ´æ¿é£¬USART3SendQBoxHostÔÚÏÂÒ»¸öÄÚ´æÉêÇëºó²Å¼ÓÒ»
        USART3SendTCB[USART3SendQBoxHost].Index=(u8 *)OSMemGet(OSQUSARTIndex,&err);
    USART3SendQFree--;
    num--;
        if(USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;       
        count=0;
        while(i!='\0')                                                                                 
        {
                *(USART3SendTCB[USART3SendQBoxHost].Index+count)=*buffer;
                count++;
                if(count>=USART3_SEND_MAX_Q)
                {
                        USART3SendTCB[USART3SendQBoxHost].Num=USART3_SEND_MAX_Q;
                        //ÐèÒªÒ»¸öеÄÄÚ´æ¿é´æ·Å½ÓÏÂÀ´µÄÊý¾Ý£¬ËùÒÔ¸üÐÂUSART3SendQBoxHost
                        if(++USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;
                        //ÐèÒªÒ»¸öеÄÄÚ´æ¿é´æ·Å½ÓÏÂÀ´µÄÊý¾Ý
            if (num != 0) //´Ë´¦Èç¹û²»¼ÓÕâ¸öÅжϵĻ°£¬ÓÐÖÖÇé¿ö»á³öÏÖ´íÎ󣬼´·¢Ë͵ÄÊý¾Ý¸ÕºÃÊÇ
                //Ò»¸ö´æ´¢¿é´óСʱ£¬Èç¹ûûÓÐÕâ¸öÅжÏϵͳÓÐÉêÇëÁËÒ»¿éÄڴ棬µ«Õâ¸öÄڴ沢ûÓб»Ê¹Ó㬵«ÊÇ
                //¿ÕÄÚ´æ¼ÆÊýÆ÷ÒѾ­¼õÁË1£¬Ï´ÎÔÙ½øÀ´Ê±ÓÖÉêÇëÁËÒ»´Î£¬ÕâÑùʱ¼ä³¤ÁË¿ÕÄÚ´æ¼ÆÊýÆ÷±äΪ0¾Í»á·¢Éú´íÎó¡£
            {
                USART3SendTCB[USART3SendQBoxHost].Index=(u8 *)OSMemGet(OSQUSARTIndex,&err);
                //¿ÕµÄ·¢ËÍÈÎÎñ¿é¼õÒ»                        
                USART3SendQFree--;
            }
                       
                        count=0;
                }
                buffer++;
                i--;
        }
        //´Ë´¦ÊÇÉÐδÕû¿é´æÍêµÄÊý¾Ý£¬ËüÃÇÒ²Òª´æ·ÅÔÚÒ»¸öеÄÄÚ´æ¿éÀï
        if(count!=0)
        {
                USART3SendTCB[USART3SendQBoxHost].Num=count;
               
                if(++USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;
        }
        //Èç¹ûÊǵÚÒ»´Î£¬¾ÍÆô¶¯·¢ËÍ£¬Èç¹ûÊÇÒѾ­Æô¶¯¾ÍûÓÐÕâ¸ö±ØÒªÁË
        if(USART3RunningFlag==0)
        {
#if                  DMA_MODE
                USART3DMAConfig(USART3SendTCB[USART3SendQBoxTail].Index,USART3SendTCB[USART3SendQBoxTail].Num);
#else       
                USART3SendUpdate();
#endif               
                USART3RunningFlag=1;
        }
        /*´Ë´¦¿ÉÒÔ¿ªÆôÐźŵƻòÕß´ò¿ªÖжÏ*/
        USART3StartSendISR();
        return 0x00;
}

出0入0汤圆

发表于 2013-4-12 10:13:16 | 显示全部楼层
unsigned char USART3WriteDataToBuffer(unsigned char *buffer,unsigned char count)
{
        unsigned char i=count;
    u8 num;
        u8 err;
        /*此处可以加入信号灯或者关闭中断*/
        if(count==0)return 0;
        USART3StopSendISR();
        /*计算放入count个数据需要多少个内存块*/
        if(count%USART3_SEND_MAX_Q)num=count/USART3_SEND_MAX_Q+1;
        else num=count/USART3_SEND_MAX_Q;
        /*需要num个数据块*/
        /*如果内存不足,直接返回*/                 
        if(USART3SendQFree<num){USART3StartSendISR();return ERR_NO_SPACE;}
        //首先申请内存块,USART3SendQBoxHost在下一个内存申请后才加一
        USART3SendTCB[USART3SendQBoxHost].Index=(u8 *)OSMemGet(OSQUSARTIndex,&err);
    USART3SendQFree--;
    num--;
        if(USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;       
        count=0;
        while(i!='\0')                                                                                 
        {
                *(USART3SendTCB[USART3SendQBoxHost].Index+count)=*buffer;
                count++;
                if(count>=USART3_SEND_MAX_Q)
                {
                        USART3SendTCB[USART3SendQBoxHost].Num=USART3_SEND_MAX_Q;
                        //需要一个新的内存块存放接下来的数据,所以更新USART3SendQBoxHost
                        if(++USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;
                        //需要一个新的内存块存放接下来的数据
            if (num != 0) //此处如果不加这个判断的话,有种情况会出现错误,即发送的数据刚好是
                //一个存储块大小时,如果没有这个判断系统有申请了一块内存,但这个内存并没有被使用,但是
                //空内存计数器已经减了1,下次再进来时又申请了一次,这样时间长了空内存计数器变为0就会发生错误。
            {
                USART3SendTCB[USART3SendQBoxHost].Index=(u8 *)OSMemGet(OSQUSARTIndex,&err);
                //空的发送任务块减一                        
                USART3SendQFree--;
            }
                       
                        count=0;
                }
                buffer++;
                i--;
        }
        //此处是尚未整块存完的数据,它们也要存放在一个新的内存块里
        if(count!=0)
        {
                USART3SendTCB[USART3SendQBoxHost].Num=count;
               
                if(++USART3SendQBoxHost>=USART3_SEND_MAX_BOX)USART3SendQBoxHost=0;
        }
        //如果是第一次,就启动发送,如果是已经启动就没有这个必要了
        if(USART3RunningFlag==0)
        {
#if                  DMA_MODE
                USART3DMAConfig(USART3SendTCB[USART3SendQBoxTail].Index,USART3SendTCB[USART3SendQBoxTail].Num);
#else       
                USART3SendUpdate();
#endif               
                USART3RunningFlag=1;
        }
        /*此处可以开启信号灯或者打开中断*/
        USART3StartSendISR();
        return 0x00;
}

出0入0汤圆

发表于 2013-4-12 10:44:29 | 显示全部楼层
收藏了。串口,内存。

出0入0汤圆

发表于 2013-4-12 11:21:08 | 显示全部楼层
支持学习了哈

出0入0汤圆

发表于 2013-4-13 13:10:44 | 显示全部楼层
记录一下

出0入0汤圆

发表于 2013-4-13 16:49:17 | 显示全部楼层
相当不错,谢谢分享~~~~~~~~~~~

出0入0汤圆

发表于 2013-4-13 19:46:45 | 显示全部楼层
好像以前在哪里看见过的额。。

出0入0汤圆

发表于 2013-4-15 17:32:27 | 显示全部楼层
   请问 你说的那个用DMA组成环形队列的结构体各个元素的意思我不是很明白,能否讲讲具体的实现方法。。。

出0入0汤圆

发表于 2013-4-18 06:52:40 | 显示全部楼层
绝对要顶

出0入0汤圆

发表于 2013-4-18 14:05:12 | 显示全部楼层
写的很好,必须顶一个,多谢楼主了~~

出0入0汤圆

发表于 2013-4-24 10:12:06 | 显示全部楼层
需详细拜读之~~

出0入0汤圆

发表于 2013-4-25 18:56:35 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2013-5-4 16:00:08 | 显示全部楼层
相当不错!很好!

出0入0汤圆

发表于 2013-5-6 19:50:13 | 显示全部楼层
正需要,谢谢楼主!

出0入0汤圆

发表于 2013-5-9 16:42:11 | 显示全部楼层
mark之~ 以后用到回来看

出10入95汤圆

发表于 2013-5-9 21:14:37 | 显示全部楼层
传说中的 内存动态分配

出0入0汤圆

发表于 2013-5-11 10:02:24 | 显示全部楼层
置顶,学习

出0入0汤圆

发表于 2013-5-13 01:19:33 | 显示全部楼层
最近在做串口屏处理,正好用到这篇帖子。从头到尾拜读了一遍,楼主很好很强大……

出0入0汤圆

发表于 2013-5-13 08:16:08 来自手机 | 显示全部楼层
好东西!谢谢分享!

出0入0汤圆

发表于 2013-5-17 14:46:12 | 显示全部楼层
看不懂,找时间细看!

出0入0汤圆

发表于 2013-5-17 15:41:23 | 显示全部楼层
不错。。。。。

出0入0汤圆

发表于 2013-5-18 16:01:38 来自手机 | 显示全部楼层
记一下晚上回家看

出0入0汤圆

发表于 2013-5-21 11:42:48 | 显示全部楼层
mark下,很牛的帖,不光要顶,还要移植

出0入0汤圆

发表于 2013-5-21 16:10:19 | 显示全部楼层
MARK~楼主强人

出0入0汤圆

发表于 2013-5-22 22:25:57 | 显示全部楼层
牛人哪,值得学习。

出0入0汤圆

发表于 2013-5-26 10:03:23 | 显示全部楼层
mark...........................

出0入0汤圆

发表于 2013-5-26 23:18:02 | 显示全部楼层
上次看到这个帖子,今天特意搜索仔细看看。

出0入0汤圆

发表于 2013-6-8 13:16:20 | 显示全部楼层
学习了,楼主很强大

出0入0汤圆

发表于 2013-6-9 11:44:34 | 显示全部楼层
是不是需要什么 拼音库?我怎么输入什么,就返回什么?

出0入0汤圆

发表于 2013-6-9 13:08:20 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2013-7-21 21:20:22 | 显示全部楼层
好资料~~必须得顶~~

出0入0汤圆

发表于 2013-7-21 21:28:20 来自手机 | 显示全部楼层
收藏精品

出0入0汤圆

发表于 2013-7-25 10:10:52 | 显示全部楼层
串口 很复杂的样子。。。如果是更多形象的说明,逻辑上的解释就好了。

出0入0汤圆

发表于 2013-7-27 21:42:29 | 显示全部楼层
COOL!!!

出0入0汤圆

发表于 2013-7-28 00:35:40 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2013-7-28 08:11:41 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2013-8-3 15:07:13 | 显示全部楼层
MARK串口驱动

出0入0汤圆

发表于 2013-8-3 15:51:25 | 显示全部楼层
一个串口通信程序都这么我学问,真是长见识

出0入0汤圆

发表于 2013-8-5 23:57:07 | 显示全部楼层
精华,马克~!

出0入0汤圆

发表于 2013-8-6 08:17:33 | 显示全部楼层
好贴~~学习了~

出0入0汤圆

发表于 2013-8-6 15:42:19 | 显示全部楼层
顶。一直用“程序1-1”的方法,因为能满足Debug要求,所以没考虑过效率问题。虽然没用到STM32但在楼主这里学到了更好的串口驱动方法,非常感谢。

出0入0汤圆

发表于 2013-8-6 17:21:34 | 显示全部楼层
MARK,就要这种实在的技术

出0入0汤圆

发表于 2013-8-7 16:54:37 | 显示全部楼层
mark!

出0入0汤圆

发表于 2013-8-7 17:02:51 | 显示全部楼层

出0入0汤圆

发表于 2013-8-8 10:11:30 | 显示全部楼层
对串口研究的这么透彻 佩服

出0入0汤圆

发表于 2013-8-8 10:54:40 | 显示全部楼层
比较系统。修改不同串口设置可以参考linux驱动的方式,多个串口设备共享一套驱动程序。

出0入0汤圆

发表于 2013-8-8 11:19:50 | 显示全部楼层
mark         

出0入0汤圆

发表于 2013-8-12 20:49:05 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2013-8-12 20:59:07 来自手机 | 显示全部楼层
顶起来!

出0入0汤圆

发表于 2013-8-26 17:14:44 | 显示全部楼层
串口收发啊,学习学习

出0入0汤圆

发表于 2013-8-28 15:05:53 | 显示全部楼层
不错学习了啊!非常感谢楼主。。。。

出0入4汤圆

发表于 2013-8-29 19:31:20 | 显示全部楼层
bucuo,xuexile

出0入0汤圆

发表于 2013-8-29 21:01:59 | 显示全部楼层
奶奶的嫩是看不懂!

出0入0汤圆

发表于 2013-9-6 10:02:24 | 显示全部楼层
顶一下!收藏。

出0入0汤圆

发表于 2013-9-6 10:35:18 | 显示全部楼层
比较详细,但是还没有看懂,得努力,谢谢楼主

出0入0汤圆

发表于 2013-9-25 16:16:46 | 显示全部楼层
MARK,STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 14:22

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

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