TA的每日心情 | 衰 2024-4-11 15:49 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
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
|
|