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

STM32延时函数,使用了systick

[复制链接]
123456Kelly 发布时间:2016-6-26 18:26
看到有人写延时函数, 个人认为那样总有些问题,于是自己写个一个, 请大家帮忙看看有什么问题,在什么极端情况下会出问题, 中断优先级必须最高,否则在优先级更高的函数里就失效了,最后的gettickcount是系统运行的毫秒数, 这个最好在main函数里面先调用Delay_Init6 v" n  h; k' h
#define __DELAY_C
' {# N, {$ \# P: z1 j
3 L0 }& I/ a/ m& B3 ]# ^! w- P#include "delay.h"
! f: K* f7 S; q' g' i0 g% cu64          tickcou=0xffffffffff000000;
& i& _0 k6 Y/ D' B/ bu16 fac_us;
, b* M' d  K" n8 n9 t% D, s" e7 Gu16 fac_ms;
, s9 X2 p: u: \! zu8 initok=0;* r" B7 ]+ W. m- Z
void    Delay_Init(void)/ g4 E9 v& L7 l: R2 ?  s5 z
{
  |% e  Z7 o! [, T# N        SysTick_Config(0xFFFFFF);
4 O1 N5 h  J$ Q, u7 u        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //  HCLK/8* U( A9 T+ y  M1 {
        fac_us=SystemCoreClock/8000000;        6 x) E& {$ I8 L, @) R
        fac_ms=SystemCoreClock/8000;
) j+ n( d0 K; s        SysTick->VAL=0x00;      
1 Y8 ]2 U( v1 a        NVIC_SetPriority(SysTick_IRQn, 0);# f) K3 o* a3 O5 B' G* Z. Q& F
        initok=1;- V9 l9 F8 L1 x) X7 i8 O8 [8 W' f
}
! m8 s  U# i  m) S, f" Ivoid SysTick_Handler(void)0 {6 d" e0 m) X* c
{) @7 q" P& L2 ~. }7 g
        tickcou=tickcou-(1 << 24);$ E7 ]( S! L7 z3 R& z# W: P
}
2 s! k6 f2 n: S% [4 L# k, {% Y5 Avoid    delay_ms(u16 nms)                                : v& h+ n2 Y  m3 e4 v
{
% ]2 k2 K# Q: s% o( B4 |9 U. D        u64 tar;- Q, {) W# m/ I1 w* r
        if(initok==0)Delay_Init();
' e3 G( Z6 k- V7 b' {2 B        tar=tickcou+(SysTick->VAL)-(nms*fac_ms);
. b2 {# S$ ^5 @2 n* F        while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter();
- i7 N% j" n( C# e& V- S' O  _8 k}1 ?$ p0 B; R# t: |; d0 Y; s
void    delay_us(u16 nus)
+ U- g4 ?- w" F- Q{. [2 Y, }* _7 G& N
        u64 tar;
. k8 Z  A1 X+ D: g5 D, O. `        if(initok==0)Delay_Init();
" }( |3 P: }8 J) a        tar=tickcou+(SysTick->VAL)-(nus*fac_us);
% _' m9 Z- m/ Q% Y3 L* Q  |        while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter(); ! N# w' o+ c* o
}       
3 y* a* }. ?: T& n' ou64 gettickcount(void)6 K2 P4 y* Z/ P
{1 o/ Z) {! v5 e2 u
        u64 temptick;' f  Y# N! Z8 ]5 ?' Z) Z
        if(initok==0)Delay_Init();, O! d1 N2 u8 V/ k" S0 \
        temptick=(0xffffffffffffffff -tickcou+(SysTick->VAL))/fac_ms;
6 P0 |/ o9 |) O9 {6 i, B        return temptick;' f+ K3 f$ u" U0 c& @6 D9 ~9 v8 _
}
% `+ X, P$ ~0 l4 F+ V/*************½áÊø***************/6 K4 K: ]4 t/ S  C9 B

& e3 f( p  M1 r. ?! a8 B: A7 ^! N% N" ?9 G( n
赞 收藏 评论1 发布时间:2016-6-26 18:26

举报

1个回答
123456Kelly 回答时间:2016-6-26 18:28:36
u64 gettickcount(void)
& W& |0 C) \" @, [{+ I' C: ^- l0 b! b- u, Y. C
        u64 temptick;
% m4 K; c* ?$ l1 z, s& |        if(initok==0)Delay_Init();
- l5 G0 J3 A8 n4 T  h6 C/ [6 Y: B8 ]        temptick=(0xffffffffffffffff -tickcou-(SysTick->VAL))/fac_ms;
# p/ u( |/ ^. s2 o1 s; J4 {        return temptick;$ p: R; [! M, K% ]$ t3 s
}抱歉,是-(SysTick->VAL)
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版