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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    目前是想用TIM6实现us延时   ,下面是配置函数' p6 U# S$ U9 g7 r( z) j7 X
    void TIM6_configuration(void)$ O3 h: V7 Y- ~1 P
    {; }. F6 o" N. X5 f0 x' L
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    4 J! X+ D5 [" I. {    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);
    2 L5 u; A! X4 f) A" E    1 s5 y% [$ Y: g0 `0 F7 s3 N
        TIM_DeInit(TIM6);+ x1 h* U5 P. L9 \, @3 c4 _9 z# {. [$ q$ k
        TIM_TimeBaseStructure.TIM_Period=10-1;                                              // 自动重装载寄存器周期的值(计数值)( G% x/ G" Y1 F: n( U1 B
        TIM_TimeBaseStructure.TIM_Prescaler=8-1;                                      // 时钟预分频数 72M/
    * _( T2 W7 U$ a9 V    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 采样分频
    ) n+ A. [7 m- X1 B1 {1 K    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        // 向上计数模式
    ; G: s/ K. X' j5 C    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);1 z. X4 M8 x+ @# E+ A/ L
       
    0 w$ W* A' S. W* Q. D' C! @    TIM_CleaRFlag(TIM6, TIM_FLAG_Update);                                                // 清除溢出中断标志8 H) L; e" c  o( u0 \
        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);7 c* G1 J2 |8 y) H# I7 L
        TIM_Cmd(TIM6, ENABLE);                                                                          // 开启时钟    5 D% a9 {' J# \& m% ~8 C
    }' p# I- {9 }* m  J$ c5 m' v
    下面是中断函数
    9 }' M/ A3 n- H$ b6 o! Fvoid TIM6_IRQHandler(void)
    : n9 f3 g7 c" @, v3 F  o{
    7 B' F8 \* {6 e6 X/ a    if ( TIM_GetITStatus(TIM6 , TIM_IT_Update) != RESET ) % ~2 s5 X- {" w0 K
        {          . C( F( S# V" A: ^
            if( delaycnt > 0 )
    ; i6 [, H' T1 A: u3 `        {
    , V7 V' N: ?; h* _/ _1 N: F5 |0 d# r            delaycnt--;            
    7 a# J8 H% C$ R6 a0 d3 q        }
    % ~9 n$ v# G" P6 u% X: L6 Y        TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);  
    1 w, C3 L  r; `' ^' K2 ^" J2 _: W6 h    }# G2 X) e2 T4 f  m9 d+ J; s: H! r
    }
    & b8 j1 ^( B1 v4 O还有延时函数
    3 K: n0 b4 a8 J: V; fvoid Delay1us(uint32_t nus)
    ( k& m8 v" }1 ?" S( r{
    5 q- @; h  s3 b" g  r; X7 i- l5 l    delaycnt = nus;/ j: a2 P' {4 }, G) S  R
        # f, s1 |2 \/ G0 O; D
    //    TIM_Cmd(TIM6, ENABLE);        3 @1 H& x2 b$ A1 ~8 q1 u5 A
        while(delaycnt>0);
    2 d/ M0 o! q# e//    TIM_Cmd(TIM6, DISABLE);        7 o9 Y  V+ W8 O" _
    }$ Z/ P1 g% w2 V$ g7 A0 u
    想精准的实现1us的延时,就把这两个值修改如下
    " A3 s1 W, \: B1 S& j* d6 D    TIM_TimeBaseStructure.TIM_Period=1-1;                                              // 自动重装载寄存器周期的值(计数值)6 O7 a2 F, B8 A" T3 U. ?
        TIM_TimeBaseStructure.TIM_Prescaler=72-1;                                      // 时钟预分频数 72M/
    / d& L% |" Z; R) n; B& E理论上可行,但是实际调试时候发现卡在了    while(delaycnt>0);,不能执行下一步,而当TIM_Period写成(2-1),确实是2us延时,请问这是什么错误引起的
    + D' ~1 T- j( h- X. k2 m! F! G% K, m' y! p( D
    % N* C8 ?9 |. W. D( X

    该用户从未签到

    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
    4 ?9 V: Y. k! @看看delaycnt变量定义的类型
    * ?- ^" G6 R9 A- u5 U; }
    uint32_t delaycnt = 0;
    % O$ e5 z, G1 l) ~我是这样写的( c4 l6 f1 x6 ]2 g

    + D0 {+ P! }8 j8 E# }) T. }+ R8 m) h, ~/ u3 L0 g6 b
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-24 03:08 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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