|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设备为stm32L071,rtt是github上下载的最新版4.1.1。在调试pm功能时遇到问题:. L3 r6 ?9 W6 b
1.可以进入STOP模式,tickless使用lptim,工作正常,软件定时器可以主动唤醒。+ D* G0 ~& p; X* _0 n
2.当使用外部中断唤醒stop模式后,串口工作不正常,debug发现唤醒后竟然先执行了中断服务函数,然后切换到等待信号量的线程,直到idle后才会执行中的睡眠前的代码处,这时才执行恢复时钟函数。9 \# F g* G/ t& Y/ t
pm睡眠前应该是禁用了全局中断的,只发生pending不执行ISR才对,为什么会有这种问题呢?; }3 [9 D' f! j N8 Z4 J
; x5 _$ V$ v Q) F# \- }- Wstatic void rx_thread_entry(void *param)" y, u) N" Y" s- V8 q5 i- g
{
5 G0 F8 @/ t5 u: b4 Y; Ewhile(1)$ ]3 y# t7 J7 G% {, y$ ?
{
% Z7 v% U2 D# Kif (rt_sem_take(rx_sem, RT_WAITING_FOREVER) == RT_EOK)
* k+ Z3 P, A0 T3 r2 q{
! S7 E, }0 k# m3 u+ Zrt_pm_sleep_request(PM_BOARD_ID, PM_SLEEP_MODE_NONE);& V! o0 [9 w r7 w. w) @
do something //此时串口异常,LOG等功能输出乱码) {* g. t( R8 S4 D5 B
rt_thread_mdelay(5); //执行到此处,才跳转到睡眠前位置,恢复时钟
5 |8 h2 h2 T2 D8 ~8 R$ [rt_thread_mdelay(5000);
( _" C5 a; H0 H, i* `4 g, i& A+ Ert_pm_sleep_release(PM_BOARD_ID, PM_SLEEP_MODE_NONE);
& c9 s& J8 }$ c, ~# E9 |5 H4 {}
' t, |5 U9 c' n}2 T: ]/ D; [, J/ c
}4 g3 ]5 ^/ A* {* l/ k7 ~0 K
void lora_rx_irq_callback(void *parameter)
% T* D5 \& J* S6 Z; D* b, K{
! T6 A: M7 c9 _% Q4 Y3 b6 @$ g& _rt_sem_release(rx_sem); //先执行此行,释放信号量& Z8 Q8 n- N: I8 H4 f# K8 O
}
- K! C& k: \ jpm适配代码如下:! F# U4 j9 M- g) e- ^. `
3 O) k: H' n4 D/ }. h' H+ m. q
static void sleep(struct rt_pm *pm, uint8_t mode)
% h) ]3 H3 h6 Z/ o6 {; E{1 j) _) k9 B$ h4 v: m5 ]8 |" s
switch (mode)0 ?; [) X* i: f
{% w6 |" g$ ^$ A( N; [* M
case PM_SLEEP_MODE_NONE:7 i7 H- l. n7 Y( _# O
break;
* C% O9 a% K" X8 j3 L+ y# Ucase PM_SLEEP_MODE_IDLE:
! S/ p7 h1 ?5 {) I- lcase PM_SLEEP_MODE_LIGHT:% j7 w$ \ w6 |8 V
/* Enter SLEEP Mode, Main regulator is ON /7 l2 p& o! i. E# A- ?) S) B
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
, R- a, M. @9 R1 t0 x* ~3 bbreak;
) U! y% [5 [1 dcase PM_SLEEP_MODE_DEEP:* b& G5 ?6 ~; S0 Y* | _
/ Disable SysTick interrupt / x7 c w7 z) n- h* s7 f
CLEAR_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);' `6 g0 ^* F5 a# b. z3 t
/ Enable the Ultra Low Power mode and the fast wake up /; }( y$ D9 Y6 W- u$ Z4 K+ F
SET_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
0 |& {3 ], z5 O& \! Z. X/ Select HSI as system clock source after Wake Up from Stop mode /
" U$ Y7 j" q) X//__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
3 @$ J7 s. \4 U. E5 U0 A/ Enter STOP mode /' f+ b& p; P( }7 N! h% F
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
% g2 ^+ f; w8 \7 f7 r$ \/ Disable the Ultra Low Power mode and the fast wake up /
) \) }' E1 J( [! o7 L8 D/ CCLEAR_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
1 C3 T4 |* g1 a$ Y7 V) H/ ^8 z9 v/ Enable SysTick interrupt /
7 \1 ?' w( D4 m7 Z) i# BSET_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);/ B9 f" w& t% r+ X
/ Re-configure the system clock /$ s' b0 v/ `5 T# g" o: v
SystEMClock_ReConfig();+ r, @; Q% a* E
break;
% o0 k8 _8 K, m/ Jcase PM_SLEEP_MODE_STANDBY:1 P' s% O; u5 z. Y
case PM_SLEEP_MODE_SHUTDOWN:
7 ~. F- K0 @* I2 _9 K% X+ ^( O__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);& U, L- ]& l7 `+ n) g
/ Enter STANDBY mode */* P+ ^# O( j% W: ~! ~
HAL_PWR_EnterSTANDBYMode();
: {* u% H+ v- L) |3 i8 x! cbreak;. k% `5 j. i& ^
default:% T( A1 {4 u/ ^& d, s ^# J
RT_ASSERT(0);
/ w* i+ B% U- s# u/ Q- w" Xbreak;0 i3 {4 d. e' }; g
}0 T& h z6 a$ I6 U7 y4 P+ d
}
0 m) R, v3 x: I+ X. H" t( x; g- o
& P A) g% x/ [1 V; V* }% e/ [$ W
7 @- B0 N5 e/ V0
4 x& A: h9 g4 ?. G f# m, `$ @$ @
7 T/ w/ }3 d" {9 u |
|