Стоп Момде, Алларм и stm32L152RE
У меня есть NUCLEO STM32L152RE. Я хочу использовать функции малой мощности этой платы и написал этот простой пример. Я использую CubeMX для настройки платы.
Я хочу просыпаться каждые 3 минуты, но через 6 минут система зависает.
/* Private variables */
ADC_HandleTypeDef hadc;
I2C_HandleTypeDef hi2c1;
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim11;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC_Init(void);
static void MX_I2C1_Init(void);
static void MX_TIM3_Init(void);
static void MX_TIM11_Init(void);
static void MX_USART3_UART_Init(void);
uint8_t data[]={3,3};
uint8_t data2[]={2,3};
uint8_t data3[]={5,6};
uint8_t dataS4[]={4,4};
uint8_t dataS5[]={5,5};
uint8_t dataS6[]={6,6};
uint8_t dataS7[]={9,9};
uint8_t dataD[]={7,7};
uint8_t dataS1[]={1,1};
uint8_t command1[]="default;"; //
uint8_t command2[]="up;"; // THE SYSTEM UP
int i = 0;
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
HAL_PWR_EnableBkUpAccess(); //enable PWR backup domain access (RTC,BKReg)
__HAL_RCC_RTC_ENABLE(); //Enable RTC. not created by cube because the RTC can run.
/* USER CODE END 1 */
/* MCU Configuration------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_ADC_Init();
MX_I2C1_Init();
MX_TIM3_Init();
MX_TIM11_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart2,data,2,1000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// here i have code.......
HAL_Delay(500);
HAL_UART_Transmit(&huart2,dataS7,2,1000);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI); // stop mode
}
}
Инициализация RTC
/* RTC init function */
static void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_AlarmTypeDef sAlarm;
/**Initialize RTC Only */
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/**Initialize RTC and set the Time and Date */
sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/**Enable the Alarm A */
sAlarm.AlarmTime.Hours = 0x0;
sAlarm.AlarmTime.Minutes = 0x3;
sAlarm.AlarmTime.Seconds = 0x0;
sAlarm.AlarmTime.SubSeconds = 0x0;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask =RTC_ALARMMASK_NONE;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 0x1;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
}
Здесь у меня есть код для обработки прерывания:
/* interrupt callback */
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
RTC_AlarmTypeDef sAlarm;
HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_A,FORMAT_BIN);
if(sAlarm.AlarmTime.Minutes>58){
sAlarm.AlarmTime.Minutes=0;
}else{
sAlarm.AlarmTime.Minutes=sAlarm.AlarmTime.Minutes+1;
}
while(HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN)!=HAL_OK){}
SystemClock_Config(); // UP THE SYSTEM
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); //TAGGLE THE LED
HAL_UART_Transmit(&huart2,data3,2,1000);
HAL_UART_Transmit(&huart1,command2,sizeof(command2),1000);
}
Я хочу, чтобы каждые 3 минуты система просыпалась, а затем переходила в режим остановки, но система не работает. Через 60 минут система ничего не делает. Вы можете мне помочь?