|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设备为stm32L071,rtt是github上下载的最新版4.1.1。在调试pm功能时遇到问题:5 M) d# S5 ~/ |" B
1.可以进入STOP模式,tickless使用lptim,工作正常,软件定时器可以主动唤醒。
: F8 m, j# d3 i' }2.当使用外部中断唤醒stop模式后,串口工作不正常,debug发现唤醒后竟然先执行了中断服务函数,然后切换到等待信号量的线程,直到idle后才会执行中的睡眠前的代码处,这时才执行恢复时钟函数。
3 r3 q! [& N' |7 f7 O3 `pm睡眠前应该是禁用了全局中断的,只发生pending不执行ISR才对,为什么会有这种问题呢?: y( Z* \1 o; d. p$ P
, Z( X, I3 w$ w1 Kstatic void rx_thread_entry(void *param)
1 i0 B7 @( [5 Y! G{) m0 _6 q0 ?$ N* @# c' T$ a* i
while(1)3 i6 S+ X4 H; K# _/ [
{: D* r2 O1 n( t9 U5 W
if (rt_sem_take(rx_sem, RT_WAITING_FOREVER) == RT_EOK)9 i. U5 F V- @- Z6 B5 ? g
{
. Z6 V5 }& L$ F1 B* P9 qrt_pm_sleep_request(PM_BOARD_ID, PM_SLEEP_MODE_NONE);3 |% F% b' A& {' H0 E1 U: Q+ e
do something //此时串口异常,LOG等功能输出乱码
, G4 r' j8 E( j6 grt_thread_mdelay(5); //执行到此处,才跳转到睡眠前位置,恢复时钟& ?; A9 H1 f+ ]3 X( ^, i5 F
rt_thread_mdelay(5000);
" J1 P ~9 f& u& E4 c. @3 i* H( prt_pm_sleep_release(PM_BOARD_ID, PM_SLEEP_MODE_NONE);. p+ z' @' i: w) N( o0 `
}
0 F$ [% S6 I3 G6 ~% X5 `}
2 x3 V/ n( p6 i# |4 F P8 }' p9 E}
& x; B6 U+ f7 V" s: x4 N, mvoid lora_rx_irq_callback(void *parameter)
# n. ?8 h& \( t( }& `7 k9 q" y$ R{
3 L. d5 y! y2 Frt_sem_release(rx_sem); //先执行此行,释放信号量2 |9 g2 |( f4 X$ S* [# K
}4 G$ r+ {- j- J4 H7 C
pm适配代码如下: i% I" {$ w' v3 g
& ?. h* V7 w7 X; g
static void sleep(struct rt_pm *pm, uint8_t mode)
6 p+ T5 u& t6 ^, c{
! p; S8 h, R [' ^4 N6 Rswitch (mode)
5 c0 Q) A! O) ?0 B' A2 k- V{$ ]9 r- V. `$ r) ^/ [2 R" H; v- a
case PM_SLEEP_MODE_NONE:
9 ~( k% y! _! k: F/ ~# _3 _8 [break;
9 k/ a0 q3 Z" c9 s2 C" L- L" Fcase PM_SLEEP_MODE_IDLE:
% F2 v5 V4 J! O* p' Mcase PM_SLEEP_MODE_LIGHT:# [+ |4 G3 Y$ Z9 @
/* Enter SLEEP Mode, Main regulator is ON /
6 t, b- ?! m8 S) ^' vHAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
& U1 g' I7 p' Z. r6 Ubreak;
$ @! [ m& T" `7 }2 A0 ~) Ecase PM_SLEEP_MODE_DEEP:
" U8 ^! \7 h% g' K3 d) f) m/ Disable SysTick interrupt /
/ l( g( P7 z4 lCLEAR_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);
' S, d/ M9 k: {2 c( R5 S \/ Enable the Ultra Low Power mode and the fast wake up /+ ]: a9 ^" q7 |* n E. x( I( b8 h
SET_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
, l9 g/ S+ I- ]5 y' E! ~0 C/ Select HSI as system clock source after Wake Up from Stop mode /
, y) i9 y/ T D0 C" _$ }//__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
, l- K G* T; r% f, K/ Enter STOP mode /7 q6 e2 X; h2 j
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
7 b: y0 m2 A9 u/ Disable the Ultra Low Power mode and the fast wake up /
, p/ U8 y0 i! s" @6 z0 jCLEAR_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
7 g" d2 T$ t6 j2 V0 D% |8 l/ Enable SysTick interrupt /
5 p" Z# ?% A- r6 c" c3 }SET_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);2 s# Q( A+ l. J( C. z, r2 u
/ Re-configure the system clock /
; a! `3 N3 z/ ^6 XSystEMClock_ReConfig();
, w/ }$ k' K6 X2 Hbreak;
, S8 R1 k; _' l ]8 {case PM_SLEEP_MODE_STANDBY:* j# n$ y, H- y: {& H
case PM_SLEEP_MODE_SHUTDOWN:- h, X' r4 P9 g
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);2 Y: ]8 i9 a4 c o
/ Enter STANDBY mode */
& P5 q% d2 x- Q1 s$ o# W- pHAL_PWR_EnterSTANDBYMode(); ]! o% X8 M! E) b% ~4 C
break;
. U) D1 q8 G7 @' x9 F7 t4 {7 y# Sdefault:* F8 U* N2 r4 u; z+ F
RT_ASSERT(0);
4 R4 m$ }0 v1 p) ]/ l2 h6 ubreak;' H% k4 O+ z) n; M4 q* n6 ~
}8 a: g5 H% k( @* `% n7 o
}
9 V# [+ U8 [. G* A2 H: a. _
; {4 }( t$ L/ G M
, h6 ]1 D5 m( x% b; ?0
' Q @" k& m( v C% y' h# R0 ]2 F/ K
1 g! g* g# D t# [9 Y7 B |
|