第一节: 心情和时钟
说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,
可是我会什么?我会的大大们都写了,我不会的大大们也写了。一个星期前花项目经费买了***的kit三合一板,最近几天闲了下来,便动手调试一下。算是有点心得,我又想奉献,可是我会什么?
我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。
唠叨了这么多,现在开始吧。
配置: stvd , cosmic
我学单片机开门三砖总是要砸的。
第一砖: 电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下
第二砖: 时钟系统,这等下再说。
第三砖: 复位系统,stm8只需要一只104电容从reset脚到地就可以了。
现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。
1 CLK_ECKR |=0X1; //开启外部时钟
2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy
3 CLK_CKDIVR &= 0XF8; //CPU无分频
4 CLK_SWR = 0XB4; //选择外部时钟
5 CLK_SWCR |=0X2; //使能外部时钟
上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。
就变成了下面的代码
CLK_ECKR |=0X1; //开启外部时钟
while(!(CLK_ECKR&0X2)); //等待外部时钟rdy
CLK_CKDIVR &= 0XF8; //CPU无分频
CLK_SWR = 0XB4; //选择外部时钟
while(!(CLK_SWCR&0X8)); //这里要等
CLK_SWCR |=0X2; //使能外部时钟
现在一切ok,是不是觉得看东西要仔细一下~~。顺便说一下,stm8有三个时钟源的,hse是外部时钟,hsi是内部16mhz的时钟。Stm8一启动默认为内部时钟,并且8分频。
其实这么处理不是最好的办法,如果外部时钟出了问题,stm8要傻傻的等待到死。它可以有中断的,在中断中处理一切,包括恢复时钟源,这才是正道,只是我比较懒,不是做正规产品,想都不愿去想。
长长的一篇,没什么内容,请原谅我的唠叨吧。
又想起一句,仔细看手册里的时钟概略图吧,这对你有帮助。