找回密码
 注册
关于网站域名变更的通知
查看: 284|回复: 2
打印 上一主题 下一主题

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    目前是想用TIM6实现us延时   ,下面是配置函数: X% c* T) t' u3 h& H& s
    void TIM6_configuration(void)& q) ], J" n( m) i. J( O4 C6 J$ v9 g
    {! U) ^: o# p, l. Q! F3 O$ M
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;( W8 s7 M0 I: v( U6 u; _
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);
    2 [' e$ q6 A* j. v0 v    * R" g- Z4 H- \4 }; U* Y
        TIM_DeInit(TIM6);6 f. s. `& |5 G  V6 A0 j" m
        TIM_TimeBaseStructure.TIM_Period=10-1;                                              // 自动重装载寄存器周期的值(计数值)+ J6 u' @3 Q2 T' }7 F9 ]5 o' v$ ?. l
        TIM_TimeBaseStructure.TIM_Prescaler=8-1;                                      // 时钟预分频数 72M/3 f: s/ f) b  i
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 采样分频
    8 {6 g: j- l1 n7 J$ j    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        // 向上计数模式
    0 {6 j3 d* O+ z; ~    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    1 E) a( L) I4 v, |3 r0 r5 s, _6 {   
    3 A# r# p! }/ l1 r/ K8 H    TIM_CleaRFlag(TIM6, TIM_FLAG_Update);                                                // 清除溢出中断标志
    ( l4 u& y! y& C$ H    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);: N2 |+ t; {& _: @0 [
        TIM_Cmd(TIM6, ENABLE);                                                                          // 开启时钟    & c" F" \+ R' n  L0 L4 m5 x
    }- M+ q: H* j; K1 x/ C
    下面是中断函数
    ) R5 Z1 t8 t% o9 A8 O+ z5 dvoid TIM6_IRQHandler(void)) A4 X5 W* p& j/ j4 A7 Y
    {; ~7 e6 G# L, c1 c5 f$ Q
        if ( TIM_GetITStatus(TIM6 , TIM_IT_Update) != RESET ) 2 D  P: X  O+ ?! f
        {          + ?& o, X( F" H" c
            if( delaycnt > 0 ) - U5 c; z3 k- X: l% U8 P
            {
    7 ]+ O( ~; v( \3 k- U            delaycnt--;            1 W2 e* k: |( [. j
            }- I0 s2 ^) H: e, s2 |
            TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);  4 L' g* P6 J, ]- E
        }. B0 ?+ T: G4 C, i, s" A$ M
    }, k# F* [7 X+ \
    还有延时函数3 u! q' _, X; f$ U3 k% i0 e) Q& E
    void Delay1us(uint32_t nus)( d7 H7 J+ t( f7 u, y8 w  k9 w
    {
    * I7 Q3 _* w0 I6 ?- h  Z    delaycnt = nus;
    7 [3 \6 `. v' h   
    # q' \" P: ~4 H//    TIM_Cmd(TIM6, ENABLE);        
    0 {; F' C- f" W/ d2 p& D* r1 K9 y! |    while(delaycnt>0);( S, e" Z* B, ?  r* }; T, R) h
    //    TIM_Cmd(TIM6, DISABLE);        
    . @/ R9 g2 |. m. Y4 j1 P% q: x" _}
    8 G* Y+ h0 v1 _想精准的实现1us的延时,就把这两个值修改如下
    2 j5 o6 Y' z+ H6 E    TIM_TimeBaseStructure.TIM_Period=1-1;                                              // 自动重装载寄存器周期的值(计数值)
    7 y/ I& u! P* t2 I9 B4 N    TIM_TimeBaseStructure.TIM_Prescaler=72-1;                                      // 时钟预分频数 72M/$ {: p7 t! M# {/ r/ o$ x4 s
    理论上可行,但是实际调试时候发现卡在了    while(delaycnt>0);,不能执行下一步,而当TIM_Period写成(2-1),确实是2us延时,请问这是什么错误引起的
      F! _, R" ]3 \( x+ M  t7 s
    + l( V  f. V1 ?/ b% {5 l) F
    2 X+ O5 x! l3 ^  i! L* T5 `

    该用户从未签到

    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:54
    6 }7 I* `6 \) V$ e# Z& Y2 V看看delaycnt变量定义的类型

    * l8 y8 n6 b; A' c: I& Kuint32_t delaycnt = 0;
    - o8 p+ `8 e/ A9 i* a8 u! k7 R5 {. c我是这样写的
    3 o# w& p) `9 Z
    4 P7 u" X5 H% p  n
    6 J- ^" M- C% f" ~) f" J* T( ~: g4 c
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-27 04:15 , Processed in 0.093750 second(s), 25 queries , Gzip On.

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

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

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