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

关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版