|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设备为stm32L071,rtt是github上下载的最新版4.1.1。在调试pm功能时遇到问题:
4 k3 z6 u" f& ^, ]1.可以进入STOP模式,tickless使用lptim,工作正常,软件定时器可以主动唤醒。
" [" ~2 p- U: B- d2.当使用外部中断唤醒stop模式后,串口工作不正常,debug发现唤醒后竟然先执行了中断服务函数,然后切换到等待信号量的线程,直到idle后才会执行中的睡眠前的代码处,这时才执行恢复时钟函数。
- {5 l- Q4 o# e3 ^+ Hpm睡眠前应该是禁用了全局中断的,只发生pending不执行ISR才对,为什么会有这种问题呢?% ?0 n: r! h( d+ \9 j" K# g* t
! j. H1 p1 L: O; ]9 Kstatic void rx_thread_entry(void *param), Y: n8 S& a2 ~2 {5 u u/ U( w
{+ j) H2 f4 @$ @5 v( H. z
while(1)
# f# g1 q8 ^2 l( U s{
* Q( {8 H, _$ ~+ {* b& J$ y$ aif (rt_sem_take(rx_sem, RT_WAITING_FOREVER) == RT_EOK)
8 p9 r8 \3 v$ F* E' W{) y0 p9 m% a5 D
rt_pm_sleep_request(PM_BOARD_ID, PM_SLEEP_MODE_NONE);
8 P. n9 g- f6 `do something //此时串口异常,LOG等功能输出乱码- b1 L3 I# _, D3 |9 ~4 d3 `( b
rt_thread_mdelay(5); //执行到此处,才跳转到睡眠前位置,恢复时钟
' A) z: q1 m' h% Z( E2 R# k. d: art_thread_mdelay(5000);
2 M2 m S2 ^$ x3 w9 b3 R3 j* b9 c/ \rt_pm_sleep_release(PM_BOARD_ID, PM_SLEEP_MODE_NONE);0 i2 V9 U3 w0 G g2 l" Q
}$ n# E/ H8 A* I+ Y9 `- K" B5 ]: X8 S
}% @/ \5 ~; k. J
}
; N3 Y3 `& w v* {void lora_rx_irq_callback(void *parameter)
L- _; b/ l+ R/ Q{1 h$ ?# d9 I# l1 y6 |
rt_sem_release(rx_sem); //先执行此行,释放信号量& c# a8 _1 S0 t" L
}) k2 a; h/ W3 |8 |1 ]: w B9 r
pm适配代码如下:
+ |: [$ p: u: g) }# H# i- A- \6 _5 d2 ~- ]
static void sleep(struct rt_pm *pm, uint8_t mode)1 H D1 v9 X3 v, c
{
0 O/ e# P; u% r, p9 {switch (mode)
% T$ G, y; {$ _1 }% [& [, ]{
+ a& h5 p# ~; l/ V9 y: ?case PM_SLEEP_MODE_NONE:& V7 j0 L! k8 v! E+ M. u3 v6 j: f
break;
) c! B/ N- w5 s K! R0 fcase PM_SLEEP_MODE_IDLE:
, _0 R% L" v+ Icase PM_SLEEP_MODE_LIGHT:
2 @% C; c; X: Y2 b/* Enter SLEEP Mode, Main regulator is ON /
; h1 I5 l S8 u6 v- H& qHAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
; G7 w% b4 u( K! c$ `0 qbreak;
# ^( ?. f8 g0 p9 o( O% ycase PM_SLEEP_MODE_DEEP:: i% E) [7 v) B9 S+ i) [* E$ x
/ Disable SysTick interrupt /# z' o' X/ R; g
CLEAR_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);
/ H+ [3 U _9 f! \: `/ Enable the Ultra Low Power mode and the fast wake up /
) M+ {/ g, y- H' C6 A, c. oSET_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);( u4 H* o0 h! J% B! M+ H
/ Select HSI as system clock source after Wake Up from Stop mode /! Y" f* ?5 | j
//__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);! k/ Q+ c! o% U8 z
/ Enter STOP mode /$ p5 J! B* C0 P. @2 O
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);: M$ x0 c" I+ {' d' l6 e. b
/ Disable the Ultra Low Power mode and the fast wake up /
+ U6 ]+ `# X5 W5 vCLEAR_BIT(PWR->CR, PWR_CR_ULP | PWR_CR_FWU);
8 _ \9 O& j8 a S7 s: P/ Enable SysTick interrupt /
) w$ j, V, ? |SET_BIT(SysTick->CTRL, (rt_uint32_t)SysTick_CTRL_TICKINT_Msk);
5 O# C/ U- [% F& o0 `2 V1 m/ Re-configure the system clock /
! ?/ n; w/ ~+ nSystEMClock_ReConfig();
9 J9 g- c: @' L' {0 |break;
8 r) d4 V, A6 h) F6 J+ hcase PM_SLEEP_MODE_STANDBY:
, x% M, E4 d: x6 ]. t! r3 `& Kcase PM_SLEEP_MODE_SHUTDOWN:
/ c: o1 m x2 a. B__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);) k) p$ a8 x: ~( l7 a. X5 V& m
/ Enter STANDBY mode */
& T+ @; K5 [2 ?2 c# w( tHAL_PWR_EnterSTANDBYMode();
- r: s- f6 p$ p& l7 Mbreak;. Y, D- `: [4 ` p }; p# w
default:) u m2 o" l2 c) m+ o0 g% }
RT_ASSERT(0);
7 f; ~2 H: w0 |( pbreak;0 o& k& h5 I6 _; Z- z z. L/ u$ }
}
5 U3 n3 ~" l X, ?- t}
: v$ p& V2 L' \" ] v$ s3 G
: D! E" {) }* n! R- m( t( L* F' r- m
0# }6 ^# M2 s, t& C$ ?
! `7 m \2 J5 h$ T8 l. _ |
|