|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设备为stm32L071,rtt是github上下载的最新版4.1.1。在调试pm功能时遇到问题:
' O$ [& e: L' r0 [" h# A: G1.可以进入STOP模式,tickless使用lptim,工作正常,软件定时器可以主动唤醒。
% F h9 e, T; P; D& s) a% m2.当使用外部中断唤醒stop模式后,串口工作不正常,debug发现唤醒后竟然先执行了中断服务函数,然后切换到等待信号量的线程,直到idle后才会执行中的睡眠前的代码处,这时才执行恢复时钟函数。
& F+ Z- a; y4 Q. k fpm睡眠前应该是禁用了全局中断的,只发生pending不执行ISR才对,为什么会有这种问题呢?
& Z5 H9 |9 t: w2 h# M
1 H) |, O S! }6 u5 Rstatic void rx_thread_entry(void *param), M/ e6 t% V' t$ V
{
" o5 `( Z' c, x1 u& hwhile(1)
( h& @; S& c( z- P: K{
7 } B- v+ b7 k8 X" Qif (rt_sem_take(rx_sem, RT_WAITING_FOREVER) == RT_EOK)6 x# f1 f9 q; T' N
{
+ d4 @$ F: v( n; Nrt_pm_sleep_request(PM_BOARD_ID, PM_SLEEP_MODE_NONE);
$ q0 f: {5 ~+ h! w( `do something //此时串口异常,LOG等功能输出乱码/ k' p- s+ `0 z$ N
rt_thread_mdelay(5); //执行到此处,才跳转到睡眠前位置,恢复时钟6 U; }* r' s9 W h6 B& o' D
rt_thread_mdelay(5000);
% Z8 q. p- {6 h8 h! zrt_pm_sleep_release(PM_BOARD_ID, PM_SLEEP_MODE_NONE);
3 m* ]2 C7 A/ [( ]( b4 [; i}% p# `1 S# s- m. f$ e
}
) M% W3 }0 Y8 e" R; l P9 p' W}
8 s) J8 y4 F$ C9 z. }void lora_rx_irq_callback(void *parameter)6 J" ?: m/ S% x/ W
{
7 ^) N$ Q5 D0 drt_sem_release(rx_sem); //先执行此行,释放信号量
: s4 e4 q0 o1 O7 O2 n$ Q}/ ~ A$ b6 G; w! w8 f' _7 H
pm适配代码如下:) ]. E8 @5 r( }# V, t& T. Q. Y2 {
& u5 j" B% d `1 b, {static void sleep(struct rt_pm *pm, uint8_t mode)
& V* a- o0 _: _6 R, S! ^3 F. b{ ^# A- q; t' O/ q7 Y1 g/ p) m" \
switch (mode)
, T. _% b8 b. P3 `: {( V: u{$ P1 B2 J$ P( {2 T# G/ v0 H
case PM_SLEEP_MODE_NONE:9 s8 {$ U! n2 b U+ \
break;
' m" A1 K: G9 l5 S4 Pcase PM_SLEEP_MODE_IDLE:% C& D5 [* N! a6 F/ A
case PM_SLEEP_MODE_LIGHT:" R: n* C5 T3 @7 Y. p' u
/* Enter SLEEP Mode, Main regulator is ON /
$ G3 S0 C* m+ J; {, ^HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
. N' B) }- Q- Z5 Nbreak;6 t- u* y5 y# f/ g7 j A
case PM_SLEEP_MODE_DEEP:
/ _( \4 b. ? s$ W9 s! m/ Disable SysTick interrupt /) g4 a" b1 Z9 _$ x
CLEAR_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);
( L. x; ^4 q( c: e) W/ Enable the Ultra Low Power mode and the fast wake up /% [6 A- U9 ^6 o- o# t- l) o
SET_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
: q# k! Q$ d2 k7 N* U2 X/ Select HSI as system clock source after Wake Up from Stop mode /6 ^" m2 t, `6 e( k/ J
//__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);7 M" L3 j } Y; {
/ Enter STOP mode /
: y+ j4 D" e9 j$ ZHAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);4 Y/ j7 a5 J6 h( a* K, v
/ Disable the Ultra Low Power mode and the fast wake up /
0 D* m t/ o) c" x+ LCLEAR_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);6 j7 g: I0 R& `
/ Enable SysTick interrupt /9 _8 ~+ S6 s; [* F' b
SET_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);2 M5 p: W% @% ^/ W8 {% e) Q
/ Re-configure the system clock /* v1 w' M5 c& d. o4 P0 _
SystEMClock_ReConfig();
0 x. \7 Q* Q) S: N' @' l0 F5 [break;
9 L4 V4 l; X) Vcase PM_SLEEP_MODE_STANDBY: }/ q0 C3 s& J& e+ a/ P/ z
case PM_SLEEP_MODE_SHUTDOWN:
' q* H* o9 o6 L' X3 u) T__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);: Q2 Q0 {2 }; \' [4 s
/ Enter STANDBY mode */: n$ h/ B4 o% _3 n- |1 T$ |5 s. `
HAL_PWR_EnterSTANDBYMode();7 N* l/ x0 T0 z% F. [- ^
break;
9 f5 ~! S" k: X6 m. h' K, cdefault:
* k8 J2 ?9 L' u" }% e! W$ |RT_ASSERT(0);/ A: q- S$ a* I: {. _2 y7 F& e# G
break;. v4 ?$ t$ F s* G. u8 S$ x
}- l. R$ {3 L- Y8 A4 ~
}
) C7 O8 @! X/ D" }5 R8 I3 a: c; r9 X5 B6 E" u5 x- D+ H
' D# Q$ @% [+ u: b5 Y
0; Y9 j! o) U1 l2 I
- {8 e! f2 H5 H: q) a1 p; o |
|