Часы реального времени без HSE
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Часы реального времени без HSE
Здравствуйте!
Нужно реализовать часы реального времени на STM32L151. В частности, с помощью светодиода мигать каждый раз когда срабатывает прерывание по AlarmA. Для часов используется внешний LSE. На макетной плате с внешним HSE все прекрасно работает, как только достаю внешний кварц, проект зависает.
По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ? Заранее спасибо
Нужно реализовать часы реального времени на STM32L151. В частности, с помощью светодиода мигать каждый раз когда срабатывает прерывание по AlarmA. Для часов используется внешний LSE. На макетной плате с внешним HSE все прекрасно работает, как только достаю внешний кварц, проект зависает.
По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ? Заранее спасибо
- Реклама
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Чтобы это работало нужно включить CSS , это бит CSSON в регистре RCC_CR. Тогда при сбое внешнего генератора он будет отключен как и pll, а тактирование переключится на MSI. Еще будет возникать прерывание, в котором можно перенастроить плл на внутренний генератор.evilbob писал(а):По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ?
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Проблема в обработке прерывания по аларму от часов
Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Проблема в обработке прерывания по аларму от часов
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Дело не в прерывании, сам механизм переключения на другой источник тактов не работает если CSS не включен. При пропадании HSE если мк работал от PLL , то частота тактов мк сместится в произвольном направлении, на моей макетке например она стала равна ~200к(с кучей глитчей) при отключеном кварце. Если тактирование было напрямую от HSE, то мк будет тактироваться просто наводками на пины внешнего генератора.evilbob писал(а):За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Он не может произойти автоматически если CSS выключен. То, что ты наблюдаешь, скорее всего какие то фантомные такты , результат наводок на генератор HSE. В таких условиях все не должно работать , не то что часы.evilbob писал(а):Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Спасибо за ответ (хоть кто-то отвечает
)
Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть). Далее уже идет настройка источника тактирования: или включить HSE используя непосредственно кварц, либо внешний генератор с включеным битом HSEBYP, либо настроить PLL от этих источников; или включить внутренний HSI и использовать его как генератор тактов (для L это 16МГц, для F вроде 8МГц), опять же можно настроить PLL и от него; либо оставить MSI.
CSS включается программно, после бита HSERDY и конотролирует сбои внешнего кварца/генератора (на часовой кварц так же есть подобная система). Так что клок секурити
систем является просто способом контроля.
Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть). Далее уже идет настройка источника тактирования: или включить HSE используя непосредственно кварц, либо внешний генератор с включеным битом HSEBYP, либо настроить PLL от этих источников; или включить внутренний HSI и использовать его как генератор тактов (для L это 16МГц, для F вроде 8МГц), опять же можно настроить PLL и от него; либо оставить MSI.
CSS включается программно, после бита HSERDY и конотролирует сбои внешнего кварца/генератора (на часовой кварц так же есть подобная система). Так что клок секурити
- Реклама
Re: Часы реального времени без HSE
В RM действительно неясности с изложением CSS. Может создастся впечатление ,что она служит только для прерывания, а переключение работает всегда. В datasheet более понятно что такое CSS.
If a HSE clock failure occurs, the master clock is automatically switched to HSI and a software interrupt is generated if enabled.
То есть прерывание идет в комплекте с переключением. Поэтому будет виснуть в любом случае. Если система отключена - то из-за пропадания тактирования, если включена, то из-за несброса соотв флага, или отсутвтия обработчика. Что бы оно работало нужно включать систему CSS и предусматривать обработчик со сбросом соотв флага.
Да в конце сказано что прерывание будет генерироваться если включено. Так вот бита отключения я не нашел. так что попробуйте предположить что все идет в комплекте и написать правильное прерывание.
Из RM тоже можно понять, что переключение идет только после включения системы. Поскольку, это включает clock detector, без которого детектироваться ничего не будет.
Вот и практик в след сообщении говорить то же самое.
If a HSE clock failure occurs, the master clock is automatically switched to HSI and a software interrupt is generated if enabled.
То есть прерывание идет в комплекте с переключением. Поэтому будет виснуть в любом случае. Если система отключена - то из-за пропадания тактирования, если включена, то из-за несброса соотв флага, или отсутвтия обработчика. Что бы оно работало нужно включать систему CSS и предусматривать обработчик со сбросом соотв флага.
Да в конце сказано что прерывание будет генерироваться если включено. Так вот бита отключения я не нашел. так что попробуйте предположить что все идет в комплекте и написать правильное прерывание.
Из RM тоже можно понять, что переключение идет только после включения системы. Поскольку, это включает clock detector, без которого детектироваться ничего не будет.
Вот и практик в след сообщении говорить то же самое.
Последний раз редактировалось Galizin Вт май 19, 2015 14:49:05, всего редактировалось 1 раз.
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил. Так вот без включеной CSS нету никакой смены источников тактирования. Мои ~200кгц не были тактами MSI это был просто выход PLL у которого нет входных тактов. И при восстановлении кварца тактирование тоже восстанавливалось, чего в принципе не может быть если уже используется другой генератор.evilbob писал(а):Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть).
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Не совсем понял на чем основано утверждение. Если можно, расшифруйте пожалуйста, что будет зависать.Galizin писал(а):Поэтому будет виснуть в любом случае.
Правильно, там есть только возможность сбросить флаг прерывания, ну и соответственно бит включения.Galizin писал(а):Так вот бита отключения я не нашел.
Ткните носом, а то немогу найти. То есть на место откуда можно понять что переключение идет только после вкл системыGalizin писал(а):Из RM тоже можно понять, что переключение идет только после включения системы. Поскольку, это включает clock detector, без которого детектироваться ничего не будет.
Можно увидет сам код? А то так мы долго будем разбиратся, это как из пушки по воробьямNeekeetos писал(а):Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил.
Домой прийду выложу свой код для демонстрации автопереключения тактирования, а пока на словах расскажу : макетка (правда под stm32f100), обычное мигание светодиодами, достал кварц - мигают медленнее - 2МГц, вставил - мигают быстрее - 8МГц. Понятное дело, быстрее-медленее это все абстрактно, но проделывал тот же фокус с миганием раз в секунду, все тоже самое. Тут просто из минимум кода наглядный пример отрабатывания переключения...
Делал, скидывал флаг перывания, опять же вечером подтвежу кодомGalizin писал(а):так что попробуйте предположить что все идет в комплекте и написать правильное прерывание.
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Даже так пробовал (с разным набором //), толку 0, прерывания по Аларму зависают, а с выключеным прерываниям АлармА - все робит
RCC_ClockSecuritySystemCmd(DISABLE);
RCC_ClearITPendingBit(RCC_IT_CSS);
RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_3,RCC_PLLDiv_2);
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HCLKConfig(RCC_SYSCLK_Div2);
RCC_MSICmd(DISABLE);
RCC_HSEConfig(RCC_HSE_OFF);
RCC_ClockSecuritySystemCmd(DISABLE);
RCC_ClearITPendingBit(RCC_IT_CSS);
RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_3,RCC_PLLDiv_2);
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HCLKConfig(RCC_SYSCLK_Div2);
RCC_MSICmd(DISABLE);
RCC_HSEConfig(RCC_HSE_OFF);
Re: Часы реального времени без HSE
http://easyelectronics.ru/repository.php?act=view&id=32 - Вот пример кода. Вроде все правильно настраивается и обработчик прерывания определен.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
Программа естественно, если обработчик написан неправильно или отсутствует. Причины описаны.evilbob писал(а):Если можно, расшифруйте пожалуйста, что будет зависать.
Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.evilbob писал(а):откуда можно понять что переключение идет только после вкл системы
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
, то и детектирование не работает и переключения значит не происходит. А уж что его тактирует и на какой частоте без кварца - это вопрос уже другой, и я думаю, на такие особенности не нужно завязыватся в разработке. Думаю, что навешивание резистора на землю на XIN приведет к отсутвию реагирования на наводки и останов тактирования - зависанию программы.evilbob писал(а):вставил - мигают быстрее - 8МГц
- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.evilbob писал(а): прерывания по Аларму зависают
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Я в первом посте все описал.....Изначально разрабатывал с внешним 8МГц кварцем (для часов свой внешний тоже) на макетке, прога основноую часть времени спит, просыпается раз в секунда по АлармуА от часов, меняет значение светодиода и засыпает и так далее....Сразу не обратил внимание на ТЗ, у заказчика нету внешнего кварца, и соответсвенно мой код у них не заработал (хотя у меня все прекрастно работало). Я и у себя убрал внешний кварц, в итоге так же перестало работать. Прога просто зависает. Стоит только закомментировать включение прерывания АлармА и все работает...Galizin писал(а):- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.
Последний раз редактировалось evilbob Вт май 19, 2015 16:55:20, всего редактировалось 1 раз.
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Опять же, я так понимаю система детектирования это просто приятная плюшка, особо не влияющая на основную работу, хочешь что-то доп контролировать - включай, нет - не включай....При первом запуске всегда все работает от MSI, дальше уже настраивается нужный генератор. Кстати при работе с энергосберегающими режимами это все наглядно демонстрируется. И еще такой нюанс, при первом запуске система не перейдет на тактирование от внешенго генератора если бит HSERDY не установлен, так что без внешенго физ кварца даже думать за него не надо, а вот настройка внутреннего HSI вполне себе возможна.Galizin писал(а):evilbob писал(а):
откуда можно понять что переключение идет только после вкл системы
Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
Мне кажется тут изначально не в то русло диалог пошел, схема изначально уже состоит без внешенго кварца поэтому как таковую систему переключения можно не рассматривать.
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
А в какое он русло должен попасть? Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы. Вроде уже понятно объяснили что при отключении кварца без включеной CSS система питается непонятно какими тактами, не удивительно что прерывание часов не работает, там и сам мк может зависнуть. Вот сделал пример. Если кварц есть то переходит на него, если нету то на мси. Такты ядра можно посмотреть на ПА8 лампочка статуса генератора ПБ7, моргалка на ПБ6 (это на дискавери-л так распаяны светодиоды)evilbob писал(а):Мне кажется тут изначально не в то русло диалог пошел, схема изначально уже состоит без внешенго кварца поэтому как таковую систему переключения можно не рассматривать.
Спойлер
Код: Выделить всё
int main(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN |RCC_AHBENR_GPIODEN |RCC_AHBENR_GPIOEEN;
RCC->CR &= ~(RCC_CR_HSEON|RCC_CR_HSION);
GPIOA->OTYPER = 0;
GPIOA->AFR[0] = 0;
GPIOA->AFR[1] = 0;
GPIOA->MODER = GPIO_MODER_MODER13_1|GPIO_MODER_MODER14_1 // SWD
| GPIO_MODER_MODER8_1 // MCO
;
GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR13|GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8;
GPIOA->PUPDR = 0;
GPIOB->OTYPER = 0;
GPIOB->AFR[0] = 0;
GPIOB->AFR[1] = 0;
GPIOB->MODER = GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0 ; // led
GPIOB->OSPEEDR = GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7;
GPIOB->PUPDR = 0 ;
GPIOC->OTYPER = 0;
GPIOC->MODER = 0;
GPIOC->OSPEEDR = 0;
GPIOC->PUPDR = 0xAAAAAAAA;
GPIOD->OTYPER = 0;
GPIOD->MODER = 0;
GPIOD->OSPEEDR = 0;
GPIOD->PUPDR = 0xAAAAAAAA;
GPIOE->OTYPER = 0;
GPIOE->MODER = 0;
GPIOE->OSPEEDR = 0;
GPIOE->PUPDR = 0xAAAAAAAA;
// mco out
RCC->CFGR &= ~RCC_CFGR_MCOPRE;
RCC->CFGR |= RCC_CFGR_MCO_SYSCLK;
RCC->CR |= RCC_CR_CSSON;
// slow flash enable
FLASH->ACR=FLASH_ACR_ACC64;
FLASH->ACR|=FLASH_ACR_LATENCY;
FLASH->ACR|=FLASH_ACR_PRFTEN;
GPIOB->BSRRL = GPIO_BSRR_BS_7; // light up , we are on MSI clocks
while(1)
{
GPIOB->BSRRL = GPIO_BSRR_BS_6; // blue on
for(int i =0;i<100000;i++)__NOP();
GPIOB->BSRRH = GPIO_BSRR_BS_6; // blue off
for(int i =0;i<100000;i++)__NOP();
if(! (RCC->CR & RCC_CR_HSEON))
{
int to = 1000000;
RCC->CR |= RCC_CR_HSEON;
while ( (!(RCC->CR & RCC_CR_HSERDY)) && (to-- >= 0 ) );
if( RCC->CR & RCC_CR_HSERDY )
{
RCC->CFGR &= ~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLDIV|RCC_CFGR_PLLMUL);
RCC->CFGR|=RCC_CFGR_PLLSRC_HSE;
RCC->CFGR|=RCC_CFGR_PLLDIV2 | RCC_CFGR_PLLMUL8;
RCC->CR|=RCC_CR_PLLON;
to = 100000;
while ( (!(RCC->CR & RCC_CR_PLLRDY)) && (to-- >= 0 ));
if( RCC->CR & RCC_CR_PLLRDY )
{
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR|=RCC_CFGR_SW_PLL;
GPIOB->BSRRH = GPIO_BSRR_BS_7; // disable light , we are on PLL clocks
}else{ RCC->CR &= ~RCC_CR_PLLON; }
}else{ RCC->CR &= ~RCC_CR_HSEON;} // if hse not ready disable it
} // if hse on
} // while
} // main
void NMI_Handler(void)
{
if(RCC->CIR & RCC_CIR_CSSF)
{
GPIOB->BSRRL = GPIO_BSRR_BS_7; // light up , we are on MSI clocks
RCC->CIR = RCC_CIR_CSSC;
}
}
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
И? Да, тот топик тоже я создал. Он немного не причесан, я там уже все пробовал, даже нелепые варианты принудительного оключения CSS.Galizin писал(а):Вот нашел код
https://my.st.com/public/STe2ecommuniti ... =interrupt
Скорее всего автор тот же.
Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)Neekeetos писал(а):А в какое он русло должен попасть? Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы.
Чего вы вцепились в этот CSS? Если это из-за того что в топике написал про переключение, то прошу прощения, мог ввести в заблуждение.
Суть такова, проект настроен на работу от HSI и все работает, кроме прерывания от АлармаА
Видео работоспособности кода https://www.youtube.com/watch?v=QyxoeEO36FE
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Я так полагаю, что раз при отключении кварца все перестает работать, то кварц все же используется для тактирования мк, отсюда все проблемы иevilbob писал(а):Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)
Проверь в своем проекте файл system_stm32l1xx.c , там есть функция SystemInit которая вызывается при сбросе мк и настраивает его на работу с нужными тактами, переключая с изначального MSI, если закомментишь вызов SetSysClock() , то вся эта борода с часами заработает но медленно (поскольку такты с HSI у тебя настраиваются только внутри прерывания)Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы. Вроде уже понятно объяснили что при отключении кварца без включеной CSS система
питается непонятно какими тактами, не удивительно что прерывание часов не работает
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);Neekeetos писал(а):Я так полагаю, что раз при отключении кварца все перестает работать
Не совсем так, сначала при старте функция init настраивает тактирование, а дальше в прерывании происходит повторная настройка так как мк вышел из стоп режима.Neekeetos писал(а):поскольку такты с HSI у тебя настраиваются только внутри прерывания
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Ну выведи на MCO сигнал SYSCLK и посмотри что происходит с подключеным кварцем и без. Если же ты наткнулся на такую проблему, что при выключеном (по твоим словам) HSE подключение/отключение кварца влияет на работу чипа, то это очень интересное явление, его надо изолировать и создать кейс на сайте ст. Но я лично пока не вижу каких либо подтверждений этому, просто кривой код. Было бы еще понятнее если бы были полные исходники проекта.evilbob писал(а):В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
Информация по RLC mini находится >тут<
- evilbob
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Вт авг 27, 2013 10:51:04
- Откуда: Донецк, Украина
Re: Часы реального времени без HSE
Из моих слов следует что "подключение/отключение кварца влияет на работу чипа" (без уточнения включен или отключен HSE программно, то есть в коде нигде не прописывается непосредственное отключение) это и так видно при смене частоты мигания светодиодов.Neekeetos писал(а):при выключеном (по твоим словам) HSE подключение/отключение кварца влияет на работу чипа
Можно конкретно указать на кривые моменты? А то как-то грубо звучит.Neekeetos писал(а):просто кривой код
Выше уже была ссылка на прошивку из форума на сайте стNeekeetos писал(а):Было бы еще понятнее если бы были полные исходники проекта.
Спойлер
Код: Выделить всё
#include "stm32l1xx.h"
#define K1 GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define K2 GPIO_SetBits(GPIOC,GPIO_Pin_7)
#define K3 GPIO_SetBits(GPIOC,GPIO_Pin_6)
#define K4 GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define K5 GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define K6 GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define K7 GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define K8 GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define STATUS_LED GPIO_ToggleBits(GPIOC,GPIO_Pin_9);
void RTC_Config(void);
void RTC_TimeRegulate(void);
void init(void);
void sleep(void);
GPIO_InitTypeDef GPIO_InitStructure;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_InitTypeDef RTC_InitStructure;
RTC_AlarmTypeDef RTC_AlarmStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
__IO uint32_t AsynchPrediv = 0, SynchPrediv = 0;
uint32_t hour=8,minute=0,second=00;
uint32_t alarm_hour=8,alarm_minute=0,alarm_second=01;
uint8_t k_led=0;
void RTC_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_RTCAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
}
void sleep(void)
{
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
PWR_UltraLowPowerCmd(ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}
void RTC_TimeRegulate(void)
{
RTC_TimeStructure.RTC_Hours = hour;
RTC_TimeStructure.RTC_Minutes = minute;
RTC_TimeStructure.RTC_Seconds = second;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = alarm_hour;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = alarm_minute;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = alarm_second;
RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
}
void RTC_Alarm_IRQHandler (void)
{
EXTI_ClearITPendingBit(EXTI_Line17);
alarm_second++;
if (alarm_second==60)
{
alarm_second=0;
alarm_minute++;
if (alarm_minute==60)
{
alarm_minute=0;
alarm_hour++;
if (alarm_hour==24) alarm_hour=0;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = alarm_hour;
}
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = alarm_minute;
}
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = alarm_second;
k_led++;if(k_led==9)k_led=0;
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
RTC_ClearFlag(RTC_FLAG_ALRAF);
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HCLKConfig(RCC_SYSCLK_Div2);
switch (k_led){
case (0):
{GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);break;}
case (1): {K1;break;}
case (2): {K2;break;}
case (3): {K3;break;}
case (4): {K4;break;}
case (5): {K5;break;}
case (6): {K6;break;}
case (7): {K7;break;}
case (8): {K8;break;}
}
STATUS_LED;
}
void init(void)
{
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HCLKConfig(RCC_SYSCLK_Div2);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_9);
EXTI_DeInit();
PWR_RTCAccessCmd(ENABLE);
RTC_WaitForSynchro();
RTC_ClearFlag(RTC_FLAG_ALRAF);
EXTI_ClearITPendingBit(EXTI_Line17);
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_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
{
RTC_Config();
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
}
RTC_TimeRegulate();
}
int main(void)
{
init();
while(1)
{
sleep();
}
}- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
Re: Часы реального времени без HSE
Ну и отключи его программно. Правда разумнее найти где он включается и там убрать, пусть все работает по даташиту от 2МГц MSI.evilbob писал(а):Из моих слов следует что "подключение/отключение кварца влияет на работу чипа" (без уточнения включен или отключен HSE программно, то есть в коде нигде не прописывается непосредственное отключение) это и так видно при смене частоты мигания светодиодов.
Ничего особенного не имел в виду, сам так когда то писал. Из косяков например настройка тактов процессора в прерывании. Сам код создает ощущение что ты не знаешь что тебе нужно, прерывание от часов настраивается двумя строчками а не четырьмя листами мусора.evilbob писал(а):Можно конкретно указать на кривые моменты? А то как-то грубо звучит.
А можно просто взять файлы проекта и запаковать в архив, эти так называемые исходники с сайта представляют из себя копипасту а не полноценный код, собрать их и проверить нельзя.evilbob писал(а):Выше уже была ссылка на прошивку из форума на сайте ст
У тебя же все работает. Просто убери смену тактирования из прерывания часов и оно перестанет зависать.evilbob писал(а):Хорошо, сформулирую вопрос иначе: "Как настроить секундное (раз в секунду) прерывание по аларму для часов реального времени при тактировании от HSI"
Информация по RLC mini находится >тут<


