打印

MDK4.6环境下STM32F10xxxx.S一段一段看

[复制链接]
楼主: 明月小厨
手机看帖
扫描二维码
随时随地手机跟帖
61
明月小厨|  楼主 | 2013-1-4 17:24 | 只看该作者 回帖奖励 |倒序浏览
RCC->CFGR2 = 0;
系统提示说CFGR2没定义;我很烦;就到处乱找,结果发现了上面的秘密;

使用特权

评论回复
62
明月小厨|  楼主 | 2013-1-4 17:34 | 只看该作者
本帖最后由 明月小厨 于 2013-1-4 17:35 编辑

STM32_RCC分析与使用.zip (1.01 MB)

本文档仅供大家学习使用,不得用于商业用途;而且本文档仅仅保留几天,然后将删除;

使用特权

评论回复
63
明月小厨|  楼主 | 2013-1-4 21:16 | 只看该作者
本帖最后由 明月小厨 于 2013-1-4 21:40 编辑
明月小厨 发表于 2013-1-4 17:24
RCC->CFGR2 = 0;
系统提示说CFGR2没定义;我很烦;就到处乱找,结果发现了上面的秘密; ...


使用MD模式时是没有这个寄存器;使用HD模式时,有这个寄存器的定义;
估计和LD.MD.HD设置有关;

使用特权

评论回复
64
明月小厨|  楼主 | 2013-1-4 21:56 | 只看该作者
明月小厨 发表于 2013-1-3 10:10
第一个错误是说没有说明ld.md.hd;这个不是自动添加时已经选择了?迁就一下吧,既然它说你再说明一次,你说再说 ...

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)

/* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */

#endif
最简单的处理方式就是直接把你需要的使能;(把注释去掉)
这里的选择会产生一些影响;如有的寄存器在LD模式是非法的;

使用特权

评论回复
65
明月小厨|  楼主 | 2013-1-4 22:08 | 只看该作者
本帖最后由 明月小厨 于 2013-1-4 22:09 编辑
明月小厨 发表于 2013-1-4 21:56
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined ( ...


正是这个原因导致:
RCC->CFGR2系统不认得;
还有一串寄存器名称也识别不出来;
并非这些寄存器名称一定需要设置;需要和相应的器件资源对应起来;
我使用的数据手册针对的是适合101X,102X,103X,105X,107X;所以有些出入就可以理解了;

LD和LD_VL有何不同?

使用特权

评论回复
66
明月小厨|  楼主 | 2013-1-4 22:13 | 只看该作者
明月小厨 发表于 2013-1-4 22:08
正是这个原因导致:
RCC->CFGR2系统不认得;
还有一串寄存器名称也识别不出来;

STM32系列MCU不同型号的移植.pdf (134.93 KB)

使用特权

评论回复
67
明月小厨|  楼主 | 2013-1-5 00:23 | 只看该作者
本帖最后由 明月小厨 于 2013-1-5 00:25 编辑
明月小厨 发表于 2013-1-3 15:42
当HSI被用于作为PLL时钟的输入时,系统时钟能得到的最大频率是36MHz。
晕倒,我的PCB已经排好了,没有外部时 ...


互联型的105,107如果使用HSI最大SYSCLK为36MHZ;
如果是103,使用HSI最快SYSCLK=64MHZ;

我的手册中前些天意外发现印重了一部分,前面有个章节说RCC;后面又有一个章节说RCC;——我以为这只是一个印刷错误;看了看页码好象不一样;但没有细细多想;
现在开始细看RCC部分,随手翻,是后面的RCC(和前面的RCC是一样的吧);
于是悲剧开始了,出现了一个又一个意外的错误,有些寄存器没有定义(105和107的寄存器和103的有些是不一样);一番折腾,确认是数据手册的版本不一样;
最后回到手头的手册,仔细前后一对比;发现:
前的RCC部分描述的内容符合103;后面的RCC部分描述的内容符合105和107;  ——这样搞很折腾人的;新人伤不起!

使用特权

评论回复
68
明月小厨|  楼主 | 2013-1-5 00:27 | 只看该作者
明月小厨 发表于 2013-1-5 00:23
互联型的105,107如果使用HSI最大SYSCLK为36MHZ;
如果是103,使用HSI最快SYSCLK=64MHZ;
我的手册中前些天意 ...

我把105,107的时钟看了一整天,对照时钟树逐一核对过;全部作废

使用特权

评论回复
69
明月小厨|  楼主 | 2013-1-5 00:35 | 只看该作者
RCC->CFGR2 = 0; //复位以太网和USB;
我怎么就没想到STM32F103有以太网接口吗?一通折腾后竟然也编译成功了;一步错,步步错!

使用特权

评论回复
70
明月小厨|  楼主 | 2013-1-5 20:27 | 只看该作者
RCC->CFGR |=0x10;            //设置SYSCLK时钟源为PLLCLK;
while(!(RCC->CFGR & 0x08));  //等待切换完成;

上面二句的意思是切换SYSCLK时钟源为PLLCLK;
但实际执行时死机了;后来才发现
正确的代码是:
RCC->CFGR |=0x02;            //设置SYSCLK时钟源为PLLCLK;
while(!(RCC->CFGR & 0x08));  //等待切换完成;

排错时借用了软件仿真的手段,直接观察对应的标志位;非常好用!:victory:
RCC部分过通关;:victory:

使用特权

评论回复
71
明月小厨|  楼主 | 2013-1-6 01:01 | 只看该作者
今天太晚了;明天继续战斗;
明天的任务,重新建立全新的工程,使用干净的崭新的FLIB3.5库;不改变库函数;必要时自己重建一二个;
在库环境下开始建立我的项目;

做出这个决定的原因:这几天搞RCC搞的头很大,虽然搞到最后搞的很明白;很简洁,但搞的过程真的费时费力;我今天看了一看相关的库;如果使用库函数,很容易搞掂了,虽然多出来5-10倍的代码;
毕竟利用库只是一次性的操作,主要任务是完成初始化工作.对项目来说影响并不大;也许启动初始化时多跑上几个mS;

这些库函数就是向导,虽然引导我们走了许多的弯路;但它封装了许多的细节,顶多我查看相在的寄存器验证一下即可;对寄存器的每一位不必深入了解;

——明天开始抄近路!偷一次懒。
用寄存器直接操作法非常精简,最优秀的项目可以对操作器直接操作;可是我没有那么时间耗在F103上面;我以后说不定要了解F3,传说F3的性能更强大;:P

使用特权

评论回复
72
13249207512| | 2013-1-6 11:33 | 只看该作者

使用特权

评论回复
73
lyn3210| | 2013-1-7 15:46 | 只看该作者
使用工程模板。

使用特权

评论回复
74
明月小厨|  楼主 | 2013-1-7 18:56 | 只看该作者
你说的太晚了,我摸索了半天才发现,在库文件夹里真的有工程模板;

使用特权

评论回复
75
lirunze| | 2013-1-7 19:53 | 只看该作者
学习了啊

使用特权

评论回复
76
明月小厨|  楼主 | 2013-1-8 02:33 | 只看该作者
上面是我自己摸索的,一边上网找资料,一面自己瞎猜;有不少错误;
如systemInit();这个函数是系统上电后的初始化函数,是留给用户有main前做些什么;
但这个函数的原型在库里面已经有了;具体是放在什么地方我没注意;
这些文件的结构比较特别;并没有集中放在一起;而是分多个地方存放的;
1.启动文件 xxxxxx_xx.S;有专门的文件夹存放,可以用MDK来复制一份,自己复制也行;反正都一样的;
2.xxxxx. h和xxxx.c文件;库文件里有一个地方存放着这二组文件,分别是inc和src;和外设有关的;就是我们最常说的库函数,大多数就是它们二个;
3.内核操作需要的文件;也是.h和.c;放在另一个地方,一个是支持IAR编译器,另一个是支持ARM(MDK);
4.还有几个项目必需的.h;如#include "stm32f10x.h";这个是所有.h文件的老祖宗;
1,2,4是通用的;
3和编译器有关;

刚开始没有必要计较那么多细节;如果有个模板就直接用;上面的库文件和库函数通常没有人会去修改它们;
这样能保持库相关文件的完整性.便于移植或升级编译环境甚至库;

如果准备使用库,涉及到的内容会多一些,要知道都是些什么文件,放在哪;
如果准备使用寄存器直接操作,这些库就没有必要全添加进来了;只需要定义寄存器的,中断的,内核的几个文件即可;

使用特权

评论回复
77
明月小厨|  楼主 | 2013-1-8 02:37 | 只看该作者
启动文件中有md.s和md_vl.s;我一直分不清楚二个有什么区别.如何正确使用它们;
现在搞明白了;原来103RB用md;而100RB则使用md_vl;
vl的意思是超值的;性能和103主流的器件差不多,但价格便宜;

可实际上主流的103更超值更便宜;

使用特权

评论回复
78
明月小厨|  楼主 | 2013-1-8 02:40 | 只看该作者
如果只是学习,不计较浪费时间,可以这些细节上纠结一番;
对未知的东西总是有些好奇;但大致搞明白后,这些就不值钱了;所以很多开发板或入门书等,直接跳过这些环节;直奔GPIO点灯;

使用特权

评论回复
79
明月小厨|  楼主 | 2013-1-8 02:47 | 只看该作者
F103目前仍是ST的主打产品;但它的对手已经来了;
F3XX和F4XX;
一个性能明显超出很多,但价格也超出很多;这么丰富的资源必须跑操作系统,不然真的浪费;我私下估计这些器件的出现目标就是mini电脑;未来(也许3年5年后)的市场潜力巨大,
另一个价格差不多,相关的资源却有升级;

使用特权

评论回复
80
不能不吹| | 2013-1-8 13:29 | 只看该作者
菜鸟看不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则