你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO板开发日志

[复制链接]
qianfan 发布时间:2014-9-30 19:54
 最近很荣幸,拿到了社区的一块NUCLEO板(302),在这里首先感谢社区,感谢沐紫姐,感谢各位版主。
3 m2 x) L: O' @* ^迷上了Arduino,喜欢Arduino的那种简约,同时也喜欢直接操作寄存器,只有学会了操作寄存器,才能够真正的掌握一个芯片,才能够最大的发挥芯片的作用。好了,废话不多说,说点移植Arduino的事情吧。5 F9 U5 z3 {) L* `- T5 T- p
先来谈谈时间吧。
7 j8 ~( q  A$ p( ^1 \0 y& X在Arduino中,有两个函数,一个是millis,一个是micros。第一个函数是用于获取当前的毫秒数,返回值类型是unsigned long。第二个是用于获取当前的微秒数,返回值也是unsigned long。刚开始天真的认为,获取两个不同单位的时间可以使用两个定时器,一个定时器的周期是1ms,一个定时器的周期是1us。并且每一个周期内产生中断,类似下面的代码:* d. ]  {* E, x0 L" d4 n
uint32_t ms,us;" Z: M* L3 z) T$ H! R- t5 r3 X# w) ^
void msCycleIntHandler(void) {ms++;}7 r1 s0 E4 }, b3 @
void usCycleIntHandler(void) {us++;}
/ D% b! w' L3 p: d7 F' u但是这样会出现一个问题,ms的中断还好说,但是us的呢?每个1us,就会提出一次中断,这样频繁的打断CPU,岂不是很浪费呢?我们能不能使用一个定时器来产生这两种不同时间的基准呢?最先想到的应该是Systick。那么下面就说说如何使用Systick来产生这两个不同的基准时间。
5 n2 o  t7 h( E# ]4 Dmillis是最简单的,只需要让Systick每隔1ms产生一个中断请求即可。我们可以这样配置,配置Systick的时钟为1M(也就是1us的周期),将自动重载寄存器的值设置成为1000-1,这样,Systick中断的时间也就是1000*1us=1ms。% I; Y. J2 V. \) n! b
在Systick_Handler的中断处理函数中添加这样的代码:
1 A3 E- E6 K, M( }/ ]7 ]volatile uint32_t ms;9 T1 }/ B' f4 B& K* a
void Systick_Handler(void) {ms++;}
/ I- e5 Q9 l' x& u* u$ r- suint32_t millis(void) {return ms;}. y* g  ]# m- S! X6 k2 e5 _, D
这样就能够产生1ms的时间基准了。在这个时间基准上,我们可以产生精确的延时。下面是我的延时函数:' M+ {  k0 V0 x. l
void delay(int _ms) {: j3 P/ {. v% o& s5 a
uint32_t endTime=millis()+_ms;
# F) S$ e1 x3 z5 X5 \4 l- r3 z* y7 A* dwhile(endTime!=millis())    ;6 l* K. o7 Q8 w: |2 q
}
1 S3 m. u* P$ {/ g7 I2 U请注意上面代码中的判断语句endTime!=millis();这句正是一个重点。这里我为什么不写while(millis()millis(),那么考虑这么一个情况,假设当前的时间是UINT32_MAX-1,你的定时时间是10ms,那么endTime==UINT32_MAX-1+10=9;你的程序是这样的:while(millins()CUR;}% s4 r/ `$ ~  w5 s% M5 j
与delay同样的道理,这里我们也能够写出一个延时us级别的程序了。
0 y9 ]% f# A$ N7 \可能有人会想了,这里的micros原则上来说并不是系统的启动时间(以us计数),而是将1ms的平均分割点。如何能够知道系统的运行时间,以us计算呢?这不是很简单嘛:
2 B" S1 f, i; B4 G8 ~- Omillis()*1000+micros();这样就是系统运行的时间(us);这里可要小心啦,别让这一个数值溢出了。这里可不喜欢它的溢出。
9 n8 g5 _9 ~  s5 N  m# R可能会想了,我要这样的程序干什么呢?我不用定时器,使用软件延时不也一样能够延时吗?一是软件延时的精准度的问题,二是当有了millis的时候,你就能够使用这个函数来计算你的程序运行速度的快慢了:, ^9 K4 W7 R& Q% G  t$ m
uint32_t before=millis();2 l( f+ w% M! }1 F
//do something...
' K, B% c; K0 `- b2 W3 uuint32_t times=millis()-before;
( N" R" o! Y! r) S  @6 e6 T) sSerial.println(times);+ p' `/ _4 P8 n- X
随时的将程序两段的时间输出,可以方便的查看运行的时间。当然,NUCLEO有一个ST LINK,使用KEIL下面的断点调试测量时间也是很简单的。
* s( V2 d$ e8 ~% Z好了,废话说完了,感谢大家耐心的看完。. n2 ]4 G4 j8 O" K% x8 k/ ^: t
 
0 j- a( ?  f5 t5 @1 u- R 
赞 收藏 评论1 发布时间:2014-9-30 19:54

举报

1个回答
霹雳之火 回答时间:2014-10-1 08:28:52

RE:NUCLEO板开发日志

谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版