int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, ("Hello"), sizeof("Hello"), 0xff);
HAL_Delay(1000);
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
HAL_UART_Transmit(&huart1, ("Hello"), sizeof("Hello"), 0xff);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这是我的main()函数。当进入stop模式按道理应该是已经关闭了systick的,但是根据串口注释看hello 一直在被发送。
这是我的WKUP引脚的配置,当我按下这个按钮的时候,依然无法唤起stm32.这是为什么 |
SysTick->CTRL &=(~SysTick_CTRL_ENABLE_Msk);
唤醒后,再启动systick计数器。可以像下面一样操作:
SysTick->CTRL |=(SysTick_CTRL_ENABLE_Msk); //唤醒后恢复SYSTICK计数的使能
当然,你调用库函数也可以。
HAL_SuspendTick(void);
HAL_ResumeTick(void);
至于,WKUP脚的唤醒,没啥特别的。芯片可能有多个WKUP脚,配置时别选错脚了。
/* Disable used wakeup source: PWR_WAKEUP_PINx */
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PINx );
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/* Enable wakeup pin WKUP1 */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH);
触发极性的选择,软硬件要匹配。
。。。。。。进入低功耗模式。。。。。。
我设置为进入stop模式,应该是不需要失能systick的,但是为什么systick会频繁触发中断唤醒设备。而且我的mcu在stop模式下可以直接烧录。太奇怪了
我用过外部中断唤醒的方式,在进入STOP模式前,清除所有外部中断标志位,其他(比如systick)不做处理,是正常没问题的。另外可以检查下WAKE_UP引脚的上下拉状态,是不是一直处于唤醒电平。