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

【经验分享】MCU 在 STOP 状态下通过 UART 唤醒分析

[复制链接]
STMCU小助手 发布时间:2022-2-12 19:26
前言
最近有客户反映 STM32F103 进入 STOP 模式后无法通过串口唤醒。

一 问题分析
唤醒机制:在 MCU 进入 STOP 状态后,不能直接通过 UART 等中断外设唤醒,只能通过 EXTI 外部中断方式唤醒。但是我们可以在 MCU 进入 STOP 前将 RX 脚设为 EXTI 模式,并使能对应的中断来实现。相关代码在 STM3210B-EVAL 上测试可以实现该功能。

二 相关测试代码



  1. int main(void)
  2. {
  3. #ifdef DEBUG
  4. debug();
  5. #endif

  6. // System Init...
  7. System_Init();


  8. PWR_DeInit();

  9. UART_Init();

  10. // Global Variables Init...
  11. Global_Variables_Init(); // + by dsg for global variables init...
  12. while(1)
  13. {

  14. /* Request to enter STOP mode with regulator in low power mode*/
  15. PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  16. }

  17. }
  18. void EXTIX_Init(void)
  19. {
  20. EXTI_InitTypeDef EXTI_InitStructure;
  21. NVIC_InitTypeDef NVIC_InitStructure;
  22. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  23. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);
  24. EXTI_InitStructure.EXTI_Line=EXTI_Line11; //GPIOA.3 UART2_RX
  25. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  26. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  27. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  28. EXTI_Init(&EXTI_InitStructure);

  29. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
  30. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  31. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  32. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  33. NVIC_Init(&NVIC_InitStructure);
  34. }
  35. /*******************************************************************************
  36. * Function Name : EXTI15_10_IRQHandler
  37. * Description : This function handles External lines 15 to 10 interrupt request.
  38. * Input : None
  39. * Output : None
  40. * Return : None
  41. *******************************************************************************/
  42. void EXTI15_10_IRQHandler(void)
  43. {
  44. EXTI_ClearITPendingBit(EXTI_Line11);


  45. NVIC_GenerateSystemReset();
  46. }
  47. void PWR_EnterSTOPMode(u32 PWR_Regulator, u8 PWR_STOPEntry)
  48. {
  49. // Change the UART RX PIN to external interrupt mode
  50. EXTIX_Init();

  51. GPIO_ResetBits(GPIOC, GPIO_Pin_6);
  52. GPIO_ResetBits(GPIOC, GPIO_Pin_7);
  53. GPIO_ResetBits(GPIOC, GPIO_Pin_8);

  54. u32 tmpreg = 0;
  55. /* Check the parameters */
  56. assert_param(IS_PWR_REGULATOR(PWR_Regulator));
  57. assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));

  58. /* Select the regulator state in STOP mode ---------------------------------*/
  59. tmpreg = PWR->CR;
  60. /* Clear PDDS and LPDS bits */
  61. tmpreg &= CR_DS_Mask;
  62. /* Set LPDS bit according to PWR_Regulator value */
  63. tmpreg |= PWR_Regulator;
  64. /* Store the new value */
  65. PWR->CR = tmpreg;
  66. /* Set SLEEPDEEP bit of Cortex System Control Register */
  67. *(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;

  68. /* Select STOP mode entry --------------------------------------------------*/
  69. if(PWR_STOPEntry == PWR_STOPEntry_WFI)
  70. {
  71. /* Request Wait For Interrupt */
  72. __WFI();
  73. }
  74. else
  75. {
  76. /* Request Wait For Event */
  77. __WFE();
  78. }
  79. }
  80. void UART_Init(void)
  81. {
  82. GPIO_InitTypeDef GPIO_InitStructure;
  83. USART_InitTypeDef USART_InitStructure;
  84. NVIC_InitTypeDef NVIC_InitStructure;

  85. /* Enable USART3 clock */
  86. RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART3, ENABLE);

  87. // GPIO Settings for USART3
  88. // PB10: TXD_ROOM
  89. GPIO_StructInit(&GPIO_InitStructure);
  90. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  91. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  92. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  93. GPIO_Init(GPIOB, &GPIO_InitStructure);
  94. // PB11: RXD_ROOM
  95. GPIO_StructInit(&GPIO_InitStructure);
  96. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  97. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  98. //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  99. GPIO_Init(GPIOB, &GPIO_InitStructure);

  100. /* USARTx configuration ------------------------------------------------------*/
  101. /* USARTx configured as follow:
  102. - BaudRate = 600 baud
  103. - Word Length = 8 Bits
  104. - Two Stop Bit
  105. - Even parity
  106. - Hardware flow control disabled (RTS and CTS signals)
  107. - Receive and transmit enabled
  108. */

  109. USART_DeInit(USART3);
  110. USART_InitStructure.USART_BaudRate =9600;
  111. USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  112. USART_InitStructure.USART_StopBits = USART_StopBits_2;
  113. USART_InitStructure.USART_Parity = USART_Parity_Even;
  114. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  115. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  116. USART_Init(USART3, &USART_InitStructure);

  117. UartRxON();

  118. // In initial state, waiting for indoor data...
  119. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  120. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  121. UART_State=UART_RX; //0; // 0: received state 1: transmit state

  122. /* Enable the USART3 Interrupt */
  123. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
  124. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  125. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  126. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  127. NVIC_Init(&NVIC_InitStructure);

  128. /* Enable USART3 */
  129. USART_Cmd(USART3, ENABLE);

  130. }
复制代码



收藏 评论0 发布时间:2022-2-12 19:26

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版