OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9642|回复: 22

我已开发了用于战舰版的所有例程,可以认为是对原子哥例程的升版,现分享总线控制!

[复制链接]

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
发表于 2015-5-25 22:25:39 | 显示全部楼层 |阅读模式

各位用战舰版学习STM32单片机的朋友们你你们好!

大家学完了原子哥的STM32战舰版程序了没?我特为战舰版的每一个例程开发了新的程序,完全不同于原子哥的,
全是为了工程项目服务的,能直接应用于工程,全新的开发方式,全文注释,想了解吗?

例如SD卡的SDIO访问,整个系统的总线控制等等,以及I/O口有全新管理方法,大家看了之后,必定能力极大提升,
能更好的掌握STM32103系列单片机的使用;
本人基于战舰版的板子,开发了STM32103ZET6除以太网的所有例程,全可以直接应用于工程项目,也就是说模块化了;


下面提供一个例程,用MySprintf函数对总线进行管理;
本例程是在UCOS上运行的;

大家还在为在嵌入式系统中实现printf函数而寻找方法吗?
想了解printf函数到底是怎样实现的吗?
有用printf函数向任意总线发送数据吗?
因为大多数移植都是向串口发送数据,如果想要用printf函数向SPI总线,CAN总线发送数据,怎样实现?
想不想向总线发送完数据之后,由总线自动将其缓冲区内的数据发送完毕?
看完本例程之后,大家就会全明了;

MySprintf函数说明:

1)函数原型:
MySprintf(总线号,"格式控字符串",参数列表)

2)格式控制字符串
字符数据输出:
%c,%C  输出单个字符
%s,%S  输出字符串
%p%s,%P%s,%P%s 从字符串起始地址开如输出指定长度个字符,用于将一个指定的数组中的多少个元素发送出去;
%y%s,%y%S 从字符串起始地址开如输出指定长度个字符,用于将一个指定的数组中的多少个元素发送出去;
%Y%s,%Y%S 从字符串的指定的字符开始,开始向字符串起始地址方向发送数据;

数值型数据输出:
注意:在输出数据型数据时,输出参数必须与格式说明符对应的数据类型一致,最好用数据类型强制转换;

%d,%D,%i,%I, 以10进制的形式输出符号数;对应的数据类型为 int
%u 以10进制的形式发送无符号数;对应的数据类型为 unsigned int
%x,%X, 以16进制的形式发送无符号数;对应的数据类型为 unsigned int
%B,%b, 以2进制的形式发送无符号数;对应的数据类型为 unsigned int
%O,%o  以8进制的形式发送无符号数;对应的数据类型为 unsigned int
%f     以10进制的形式发送实型数;对应的数据类型为 double

如果需要输出长整型,则在相应的格式说明符前加l或者L,如:%lx,
但是需要注意的是,其所对应的参数必须用 unsigned long long 强制说明;


字符测试:
MySprintf(USART1S,"%p%s\r\n",1,"WangPingVeryGood!"); /* 从WangPingVeryGood!输出1个字符,即W */
MySprintf(USART1S,"%p%s\r\n",2,"WangPingVeryGood!"); /* 从WangPingVeryGood!输出2个字符,即Wa */

MySprintf(USART1S,"%y%s\r\n",1,"WangPingVeryGood!");/* 从WangPingVeryGood!输出1个字符,即W */
MySprintf(USART1S,"%y%s\r\n",2,"WangPingVeryGood!");/* 从WangPingVeryGood!输出2个字符,即Wa */

MySprintf(USART1S,"%Y%s\r\n",16,"WangPingVeryGood!");/* 从WangPingVeryGood!第16个字符开始,即先输出d */
                                                     /* 输出结果为dooGyreVgniPgnaw */
MySprintf(USART1S,"%Y%s\r\n",15,"WangPingVeryGood!");/* 从WangPingVeryGood!第15个字符开始,即先输出o */
                                                     /* 输出结果为ooGyreVgniPgnaw */

数值测试:
MySprintf(USART1S,"Test19=%f\r\n",0.0123);

详细测试,详见
STM32F103ZET6TestMySprintfAllNew\APP下的CommnicationService.c
请打开串口调试助手sscom33查看测试结果;


本例中还包含GPIO的管理,USART1串口程序,可直接应用于工程,请查看源码!


关于战舰版的STM32其它应用,欢迎大家来询;
手机18927587669

/*
 * =====================================================================================
 *         Name:  void MySprintf(unsigned char Driver,char *TempFormatString,...)
 *  Description:  函数功能:
 *                入口参数:1)Driver           驱动器
 *                         2)TempFormatString 从格式控制字符串开始为可变参数
 *                出口参数:无
 * =====================================================================================
 */
void MySprintf(unsigned char Driver,char *TempFormatString,...){
    char *SendCharPoint;                                /* 存储发送数据 */
    unsigned char CharData;                             /*  */
    char *FormatString=(void *)0;                       /* 格式控制指针 */
    unsigned char BufferSize=0;                         /* 缓冲区大小 */
    unsigned char Lflag=0;
    unsigned char LflagTrue=0;                          /* %l */
#if MySprintf_DebugEnable==1
    unsigned char DebugMode=FALSE;
#endif
    va_list vp;                                         /*  */
    if(Driver>BUS_DEVICE_GROUP)return;                  /* 设备号不存在,退出 */
    if(BusSendFunction[Driver]==(void *)0){             /* 如果指定的设备发送函数不存在,退出 */
        return;
    }
    va_start(vp,TempFormatString);                      /* 获得格式化输出字符串 */

#if MySprintf_DebugEnable==1
    MDriver=Driver;                                     /* 存储设备号 */
    MCapflag=0;                                         /* 默认为小写 */
#endif
    FormatString=TempFormatString;
    while(*FormatString){                               /* 直到字符串结束标志符 */
        if(*FormatString=='%'||Lflag){                  /* 是格式字符串起始字符%,或者已经接收到l/L */
            Lflag=FALSE;
            switch(*(++FormatString)){                  /*  */

/* %c,其所对应的参数最好用 int 强制转换 */
                case 'c':                               /* 1)格式为%c */
                case 'C':
                    CharData=va_arg(vp,int);            /* 获得%c,所对应的输出参数,必须使用CharData变量,不能用指针 */
                    MySprintf_PrintChar(Driver,CharData);
                                                        /* 向Driver设备发送字符 */
                    break;
                case 'Y':
                    MHightoLow=TRUE;
                case 'y':
                case 'P':
                case 'p':
                    BufferSize=va_arg(vp,int);
                    break;
                case 's':                               /* 3)格式为s% */
                case 'S':
                    SendCharPoint=va_arg(vp,char *);
                    MySprintf_PrintString(Driver,SendCharPoint,BufferSize);
                                                        /* 输出字符串字符 */
                    BufferSize=0;                       /* 必须将BufferSize清零 */
                    break;
                case '%':                               /* 4)格式为%% */
                    MySprintf_PrintChar(Driver,'%');    /* 输出%号本身 */
                    break;
                default:
#if MySprintf_DebugEnable==1                            /* 使能了调试 */
                    DebugMode=TRUE;
#endif
                    break;
            }
#if MySprintf_DebugEnable==1                            /* 使能了调试 */
            if(DebugMode){
                DebugMode=FALSE;
                switch(*FormatString){
                    case 'l':
                    case 'L':
                        Lflag=TRUE;                     /* 标志接收到l字符 */
                        LflagTrue=TRUE;
                        break;

/* %d格式默认为int,因此,参数需用 int 强制转换 */
/* %ld格式默认为 long long int,因此,参数需用 long long int 强制转换 */
                    case 'd':                           /* 5)格式为%d */
                    case 'D':
                    case 'i':
                    case 'I':
                        if(!LflagTrue){
                             MParameterValue=va_arg(vp,int);
                        }
                        else{
                             LflagTrue=FALSE;
                             MParameterValue=va_arg(vp,long long int);
                        }
                        if(MParameterValue<0){
                            MParameterValue=-MParameterValue;/* 转换成正值 */
                            MySprintf_PrintChar(Driver,'-'); /* 向Driver设备发送负号 */
                        }
                        MFormat=DEC;                         /* 格式10进制 */
                        MFact=10;                            /* 基数为10 */
                        MySprintf_PrintFormat();
                        break;

/* %x,%X,%b,%B,%o,%O,其所对应的参数,最好用 unsigned int 强制说明 */
/* %lx,%LX,%LB,%LO,%lo,其所对应的参数,最好用 unsigned long int 强制说明 */
                    case 'X':                               /* 6)%x格式 */
                    case 'B':
                    case 'O':
                        MCapflag=TRUE;
                    case 'x':
                    case 'b':
                    case 'o':
                    case 'u':
                    case 'U':
                        if(!LflagTrue){
                             MParameterValue=va_arg(vp,unsigned int);
                        }
                        else{
                             LflagTrue=FALSE;
                             MParameterValue=va_arg(vp,unsigned long long int);
                        }
                        if(*FormatString=='x'||*FormatString=='X'){
                            MFormat=HEX;            /* 格式16进制 */
                            MFact=16;               /* 基数为16 */
                        }
                        else if(*FormatString=='b'||*FormatString=='B'){
                            MFormat=BIN;            /* 格式2进制 */
                            MFact=2;                /* 基数为2 */
                        }
                        else if(*FormatString=='O'||*FormatString=='o'){
                            MFormat=OCT;            /* 格式8进制 */
                            MFact=8;                /* 基数为8 */
                        }
                        else if(*FormatString=='u'||*FormatString=='U'){
                            MFormat=DEC;            /* 格式10进制 */
                            MFact=10;               /* 基数为10 */
                        }
                        MySprintf_PrintFormat();
                        break;

/* %f 其所对应的参数最好用 double 进行强制转换 */
                    case 'f':
                    case 'F':
                        MFParameterValue=va_arg(vp,double);             /* 获得%f所对应的输出参数 */
                        if(MFParameterValue<0){                         /* 如果是一个负值 */
                            MySprintf_PrintChar(Driver,'-');            /* 输出负号 */
                            MFParameterValue=-MFParameterValue;         /* 将负值转换正值 */
                        }
                        MySprintf_PrintFloatValue();                    /* 输出实型数据 */
                        break;
                    default:
                        break;
                }
            }
#endif
            if(!Lflag)FormatString++;                  /* 如果不是%l,则指向下一个字符, */
        }
        else{                                          /* 否则,为普通字符 */
            if(!Lflag){
                MySprintf_PrintChar(Driver,*FormatString++);
                                                       /* 输出普通字符 */
            }
        }
    }
    va_end(vp);                                       /* 结束可变参量 */
}


STM32F103ZET6TestMySprintfAllNew.zip

635.38 KB, 下载次数: 982

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2015-5-25 22:47:13 | 显示全部楼层
顶,,,,,,,,,,,,,,,,,,,
https://github.com/WZTENG
回复 支持 反对

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
发表于 2015-5-25 23:27:29 | 显示全部楼层
快速占领前排
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-26 00:02:28 | 显示全部楼层
cool,不错。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-5-26 20:13:02 | 显示全部楼层
擦,这方法不错,谢谢分享!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
 楼主| 发表于 2015-5-29 07:36:15 | 显示全部楼层
回复【5楼】
参考了别人的程序,按照自己的意思修修改了一下,使其功能更加强大;
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-5-29 08:36:35 | 显示全部楼层
顶  不过看不习惯这种风格的。。。
学无止境
回复 支持 反对

使用道具 举报

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
 楼主| 发表于 2015-5-29 09:07:23 | 显示全部楼层
回复【7楼】jermy_z:
---------------------------------
因为这是gVim的编辑器
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2015-2-10
在线时间
0 小时
发表于 2015-5-29 09:43:11 | 显示全部楼层
不错   顶
高能立方 新一代集成电源,让设计更加简单 http://www.hiecube.com
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-1-25
在线时间
0 小时
发表于 2015-5-29 13:32:59 | 显示全部楼层
其他后续其他例程,顶。。。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
 楼主| 发表于 2015-5-29 15:10:47 | 显示全部楼层
回复【10楼】w860316:
---------------------------------
后续,有偿服务不好意思啊,尊重劳动成果!你需要吗?
回复 支持 反对

使用道具 举报

11

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-9-24
在线时间
15 小时
发表于 2015-5-29 15:37:58 | 显示全部楼层
顶。。。。。。。。。。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
 楼主| 发表于 2015-5-29 15:51:27 | 显示全部楼层
回复【9楼】Sendsafe:
---------------------------------
谢谢!
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
发表于 2015-5-29 22:09:28 | 显示全部楼层
这个太牛逼了。。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-6-3
在线时间
0 小时
 楼主| 发表于 2015-5-29 22:43:39 | 显示全部楼层
回复【14楼】cxran2wms:
---------------------------------
还有比这个更牛的,能提升自己对STM32103系列的全方位理解,不过要有偿服务,谢谢!
---------------------------------
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-3-18
在线时间
46 小时
发表于 2015-5-30 13:52:17 | 显示全部楼层
很赞,希望看到其他的。如何有偿法。
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-1-25
在线时间
0 小时
发表于 2015-6-5 09:24:18 | 显示全部楼层
回复【11楼】WangPing258:
---------------------------------
只要合理,可以接受啊,尊重劳动成果,我赞成。
PS如何联系?
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-6-5 12:28:54 | 显示全部楼层
怎么个有偿法???多少money????
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-7-2
在线时间
0 小时
发表于 2015-9-2 11:27:00 | 显示全部楼层
方法不错,谢谢分享,顶一下
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-9-6
在线时间
2 小时
发表于 2015-9-7 12:11:54 | 显示全部楼层
看上去很不错嘛
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-8-2
在线时间
2 小时
发表于 2020-8-23 23:01:52 | 显示全部楼层
顶顶顶顶
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-8-24
在线时间
4 小时
发表于 2020-9-1 12:53:34 | 显示全部楼层
可以,很强大
回复 支持 反对

使用道具 举报

0

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2020-5-31
在线时间
67 小时
发表于 2020-9-1 14:05:45 | 显示全部楼层
nbpuls
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 14:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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