关于stm32 内核几个接口的疑问
本帖最后由 litter学生 于 2018-5-10 15:27 编辑大家好,在st低功耗相关代码里发现下面一段:
/**
* @brief Enters Low Power Stop Mode
* @note ARM exists the function when waking up
* @param none
* @retval none
*/
void HW_EnterStopMode( void)
{
BACKUP_PRIMASK();
DISABLE_IRQ( );
HW_DeInit( );
/*clear wake up flag*/
SET_BIT(PWR->CR, PWR_CR_CWUF);
RESTORE_PRIMASK( );
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode ( PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI );
}请问,BACKUP_PRIMASK和RESTORE_PRIMASK在这里主要作用是什么?像是对中断某些掩码的压栈出栈,具体在这里什么意思呢?感谢
BACKUP_PRIMASK
我觉得是进入低功耗前,执行禁止全局中断 。
RESTORE_PRIMASK
这个是还原全局中断。
具体要查看相关子程序的代码。 你跟进去看它具体的代码啊,应该是用汇编写的, 具体用到哪些的寄存器你参考CM3权威指南 没有研究过,楼主搞明白了记得贴出来给大家分享一下 #define BACKUP_PRIMASK()uint32_t primask_bit= __get_PRIMASK()//中断掩码压栈
#define DISABLE_IRQ() __disable_irq()//屏蔽中断
#define ENABLE_IRQ() __enable_irq()
#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
/**
\brief Get Priority Mask
\details Returns the current state of the priority mask bit from the Priority Mask Register.
\return Priority Mask value
*/
__STATIC_INLINE uint32_t __get_PRIMASK(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
/**
\brief Set Priority Mask
\details Assigns the given value to the Priority Mask Register.
\param priMaskPriority Mask
*/
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
心里有点概念但是还是不清晰,特别是感觉和DISABLE_IRQ()重复 按照STM的设置流程,应该是先关中断,而后设置各个中断和级别,再打开设置好的中断允许。此程序段为进入stop模式,stop属于外部中断唤醒,因此这些设置应该满足实现这个功能。想想是吗? zhjb1 发表于 2018-5-14 08:13
按照STM的设置流程,应该是先关中断,而后设置各个中断和级别,再打开设置好的中断允许。此程序段为进入sto ...
唤醒是RTC_alarmA中断唤醒~目前我处理方式和他有一点不同没发现问题,查了权威指南,但是还是理解不到位~源码http://www.st.com/en/embedded-software/i-cube-lrwan.html
页:
[1]