你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32 内核几个接口的疑问

[复制链接]
litter学生 提问时间:2018-5-10 15:26 /
本帖最后由 litter学生 于 2018-5-10 15:27 编辑

大家好,在st低功耗相关代码里发现下面一段:
  1. /**
  2.   * @brief Enters Low Power Stop Mode
  3.   * @note ARM exists the function when waking up
  4.   * @param none
  5.   * @retval none
  6.   */
  7. void HW_EnterStopMode( void)
  8. {
  9.   BACKUP_PRIMASK();

  10.   DISABLE_IRQ( );
  11.    
  12.   HW_DeInit( );
  13.   
  14.   /*clear wake up flag*/
  15.   SET_BIT(PWR->CR, PWR_CR_CWUF);
  16.   
  17.   RESTORE_PRIMASK( );

  18.   /* Enter Stop Mode */
  19.   HAL_PWR_EnterSTOPMode ( PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI );
  20. }
复制代码
请问,BACKUP_PRIMASK和RESTORE_PRIMASK在这里主要作用是什么?像是对中断某些掩码的压栈出栈,具体在这里什么意思呢?感谢

收藏 评论6 发布时间:2018-5-10 15:26

举报

6个回答
无薪税绵 回答时间:2018-5-11 11:05:47
BACKUP_PRIMASK
我觉得是进入低功耗前,执行禁止全局中断 。

RESTORE_PRIMASK
这个是还原全局中断。

具体要查看相关子程序的代码。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

聪聪 回答时间:2018-5-11 10:19:37
你跟进去看它具体的代码啊,应该是用汇编写的, 具体用到哪些的寄存器你参考CM3权威指南

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

xiajintaord 回答时间:2018-5-11 10:39:32
没有研究过,楼主搞明白了记得贴出来给大家分享一下
litter学生 回答时间:2018-5-11 14:46:08
#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 [in]    priMask  Priority Mask
*/
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{
  register uint32_t __regPriMask         __ASM("primask");
  __regPriMask = (priMask);
}

心里有点概念但是还是不清晰,特别是感觉和DISABLE_IRQ()重复
zhjb1 回答时间:2018-5-14 08:13:13
按照STM的设置流程,应该是先关中断,而后设置各个中断和级别,再打开设置好的中断允许。此程序段为进入stop模式,stop属于外部中断唤醒,因此这些设置应该满足实现这个功能。想想是吗?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

litter学生 回答时间:2018-5-14 08:32:36
zhjb1 发表于 2018-5-14 08:13
按照STM的设置流程,应该是先关中断,而后设置各个中断和级别,再打开设置好的中断允许。此程序段为进入sto ...

唤醒是RTC_alarmA中断唤醒~目前我处理方式和他有一点不同没发现问题,查了权威指南,但是还是理解不到位~源码http://www.st.com/en/embedded-software/i-cube-lrwan.html

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版