Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STOP-режим в STM32F10x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
omskradio
Доброго времени суток, специалисты !
Прощу помощи.

Задача такова... Надо загонять кристалл в STOP, пробуждаться при изменении состояния внешних линий и раз в хх сек. Кристалл тактируется от внутреннего HS, часы так же запускаю от внутреннего LS.

Загнать кристалл в STOP проблем не составляет. Проблема пробудить его от туда.

Пробовал как режим WFI, так и WFE... Суть дела не меняет.
По часам - такое ощущение, что LSI выключается при переходе в STOP. Однозначно остается включенным если задействован IWDT. Но мне решение с wd не очень нравиться... Если есть возможность - надо её использовать, а не строить обходные тропинки.
По внешним линиям... Мысли вообще нет. В этом примере использую PA0. Но в настоящем устройстве PA12-15. Этот пример - пытаюсь дома с дискавери понять в чем фикус.

В общем - прощу тех, кто с этой проблемой сталкивался - подскажите куда капать...

Заранее спасибо !

CODE
#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_bkp.h"
#include "misc.h"

/***************************************************************************//**
* Global variables
******************************************************************************/
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/***************************************************************************//**
* Declare function prototype
******************************************************************************/
void RCC_Configuration(void);
void RTC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void delay(void);

/***************************************************************************//**
*
******************************************************************************/
void RCC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
}

/***************************************************************************//**
*
******************************************************************************/
void RTC_Configuration(void)
{
PWR_BackupAccessCmd(ENABLE);

/* RTC clock source configuration ----------------------------------------*/
/* Reset Backup Domain */
BKP_DeInit();

// Enable LSE OSC
RCC_LSICmd(ENABLE);
// Wait till LSE is ready
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

// Select the RTC Clock Source
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);

/* RTC configuration -----------------------------------------------------*/
/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();

/* Set the RTC time base to 1s */
RTC_SetPrescaler(32767);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
RTC_SetCounter(0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set the RTC Alarm after 3s */
RTC_SetAlarm(3);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR,ENABLE);
}

/***************************************************************************//**
*
******************************************************************************/
void GPIO_Configuration(void)
{
// User button
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// LED's
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Switch off LED's
GPIO_ResetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9);
// Disable tamper pin. PORTA.0
PWR_WakeUpPinCmd(DISABLE);
}

/***************************************************************************//**
*
******************************************************************************/
void EXTI_Configuration(void)
{
GPIO_EventOutputConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
GPIO_EventOutputCmd(ENABLE);

EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}

/***************************************************************************//**
*
******************************************************************************/
void NVIC_Configuration(void)
{
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/* Enable the WAKEUP_BUTTON_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


/***************************************************************************//**
*
******************************************************************************/
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();

RCC_Configuration();
GPIO_Configuration();

GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay();
GPIO_ResetBits(GPIOC, GPIO_Pin_8);

RTC_SetCounter(0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();

/* Set the RTC Alarm after 3s */
RTC_SetAlarm(3);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();

}
}

/***************************************************************************//**
*
******************************************************************************/
void delay(void)
{
volatile unsigned int a=1000;
while(a--)
{
volatile unsigned int b=1000;
while(b--);
}
}

/***************************************************************************//**
*
******************************************************************************/
void main(void)
{
RCC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
RTC_Configuration();
NVIC_Configuration();

GPIO_SetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9);
delay();
GPIO_ResetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9);

while (1)
{
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);

if ( EXTI_GetFlagStatus(EXTI_Line0) == SET )
{
EXTI_ClearFlag(EXTI_Line0);

RCC_Configuration();
GPIO_Configuration();
GPIO_SetBits(GPIOC, GPIO_Pin_9);
delay();
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
}
}
kan35
Так как тактирование к правило настраивается в SystemInit - может быть, что у вас он работает от HSE?
не уверен, но, возможно EXTI питается так же от основного регулятора, а у вас PWR_Regulator_LowPower, попробуйте PWR_Regulator_ON. Разница в потреблении не такая уж великая будет если что.
LSx генераторы в STOP работать должны и без WDT.
vlad_new
Я не пользуюсь библиотеками от st, потому не могу судить о верности того, что вы написали. Но то что вы планировали реально работает. Я все это уже проверял. Именно режим stop, регулятор в режиме пониженного потребления. Кушает все это 13мка. Выход по лапкам и часам. С часиками пришлось повоевать. Там смысл в том, что сигнал аларм часов связан по одной из EXTI LINE. Так что эту линию то же надо активировать. Никакие сторожевики я не включал. Удачи.
nx6310
Возможно не включено тактирование альтернативных функций. RCC->APB2ENR |= RCC_APB2Periph_AFIO;
Прерывание от будильника RTC заведено на линию EXTI17 а оно у вас не настроено, надо дописать
Код
      EXTI_InitStructure.EXTI_Line = EXTI_Line17;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

У вас в NVIC настроено секундное прерывание RTC_IRQn которое у вас не включено, надо написать так
Код
     NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);

и название функции прерывания RTC_IRQHandler надо поменять на RTCAlarm_IRQHandler

чтобы настроить пробуждение по пинам надо настроить exti, потом раздрешить их в NVIC

Код
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); // настройка пина 1 на канал EXTI1
      EXTI_InitStructure.EXTI_Line = EXTI_Line1; //настройка внешнего прерывания по каналу 1
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; // разрешение прерывания в NVIC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


Учтите что для линий 5-9 и 10-15 прерывание одни EXTI9_5_IRQn и EXTI15_10_IRQn соответственно
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.