找回密码
 注册
查看: 273|回复: 2
打印 上一主题 下一主题

STM32F103基本定时器实现us延时遇到的问题

[复制链接]
  • TA的每日心情

    2024-4-11 15:49
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
     楼主| 发表于 2024-4-11 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    目前是想用TIM6实现us延时   ,下面是配置函数: U/ R' h; j, R! |9 n: O5 N
    void TIM6_configuration(void)
    + ]1 N. \% \, f7 ?! v$ a- f{; J0 J& `1 c0 m# }/ E8 }0 ?
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;; i( l) P" K, V, c5 ]6 M
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);
    * D3 Q/ |2 I* ^2 @/ m; V7 X9 p    - G* u1 Y1 T/ d
        TIM_DeInit(TIM6);# {! E0 ~' P# s( [3 ^
        TIM_TimeBaseStructure.TIM_Period=10-1;                                              // 自动重装载寄存器周期的值(计数值)+ z! e9 d6 j& @$ ^
        TIM_TimeBaseStructure.TIM_Prescaler=8-1;                                      // 时钟预分频数 72M/
    7 Q9 f2 |0 D8 I1 Y    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 采样分频, ~3 o; b1 h0 Z( P
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        // 向上计数模式7 {! {' n1 g' s5 E
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    4 E, s& P: }: d2 b6 I. C& a  v   
    5 U! a% @0 K0 q! D3 n    TIM_CleaRFlag(TIM6, TIM_FLAG_Update);                                                // 清除溢出中断标志9 i) R1 B0 v5 g4 V0 S
        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);4 c7 J- `, M8 D% U7 @0 v
        TIM_Cmd(TIM6, ENABLE);                                                                          // 开启时钟   
    ) H; Q! u% r7 J0 R, }}
    * M9 z( N; R9 \  b- C下面是中断函数$ e2 C( G+ O* |1 m8 M- Y1 _- c2 Y' Q1 u+ W
    void TIM6_IRQHandler(void)
    7 g/ k0 l$ w! m) h& m) [+ {( J& e- u{
    ! K; F, w. ], z+ u0 p( c7 _- ~6 U5 Q    if ( TIM_GetITStatus(TIM6 , TIM_IT_Update) != RESET ) 0 d) d, K" ]' v' d/ Y; n6 f- X  E1 s
        {         
    % {! P$ r+ }) ?' l4 f3 D& l% U        if( delaycnt > 0 ) 1 q; O# _  c4 v$ q7 o
            {
    + n  k! W% W* F( v' q6 K            delaycnt--;            ' ?4 W5 ]& T5 l* j
            }
    / r: `+ y! P/ N$ I+ Y4 I        TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);  5 _, Z1 a3 X! T
        }4 ^( {: o7 H+ G# p9 y! M
    }; W4 j% R  s; n- E3 m3 j
    还有延时函数* m2 g( ]3 e, }8 J# [( Y  f( J# ~
    void Delay1us(uint32_t nus)5 h+ n- }) {. e
    {8 G5 ^: O9 P3 p; V$ f! }$ }- a
        delaycnt = nus;
    / H4 w' n5 S6 W, f4 m   
    / r9 z& k; U( P# C/ C, }' R/ s//    TIM_Cmd(TIM6, ENABLE);        : {7 S/ Z" k: k' q. B
        while(delaycnt>0);
    : W, o3 U: X; m% J7 J" k' v//    TIM_Cmd(TIM6, DISABLE);        $ [  }( t/ Q2 A2 f5 P; J
    }8 n- C- e- Y9 x! A) f- W+ H& D
    想精准的实现1us的延时,就把这两个值修改如下
    9 f: q2 l/ c6 E* Y    TIM_TimeBaseStructure.TIM_Period=1-1;                                              // 自动重装载寄存器周期的值(计数值)# b1 F' ~/ {) S+ W# t
        TIM_TimeBaseStructure.TIM_Prescaler=72-1;                                      // 时钟预分频数 72M/5 m* e  \; t; m- T% u1 t
    理论上可行,但是实际调试时候发现卡在了    while(delaycnt>0);,不能执行下一步,而当TIM_Period写成(2-1),确实是2us延时,请问这是什么错误引起的/ f1 Q, ~2 m; d. \0 Q. c9 L8 [& n9 L

    ' _. k. [0 a) Y0 f
    ; S3 N& ?+ J1 I* z: U8 @

    该用户从未签到

    2#
    发表于 2024-4-11 15:54 | 只看该作者
    看看delaycnt变量定义的类型

    点评

    uint32_t delaycnt = 0; 我是这样写的  详情 回复 发表于 2024-4-11 16:06
  • TA的每日心情

    2024-4-11 15:49
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2024-4-11 16:06 | 只看该作者
    ybing12 发表于 2024-4-11 15:545 x- L, m4 _+ M
    看看delaycnt变量定义的类型
    " E7 N! c4 ^& O" m
    uint32_t delaycnt = 0;  O, D% N: d3 M" z4 U+ {
    我是这样写的9 z1 }  M/ ]* R

    6 Y. f; E1 j! o; a- p" [: w$ T
    8 R  T3 ]( s3 r" t2 m) m4 N; h
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-5-26 02:28 , Processed in 0.062500 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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