Страница 1 из 2
Часы реального времени без HSE
Добавлено: Ср май 06, 2015 21:39:47
evilbob
Здравствуйте!
Нужно реализовать часы реального времени на STM32L151. В частности, с помощью светодиода мигать каждый раз когда срабатывает прерывание по AlarmA. Для часов используется внешний LSE. На макетной плате с внешним HSE все прекрасно работает, как только достаю внешний кварц, проект зависает.
По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ? Заранее спасибо
Re: Часы реального времени без HSE
Добавлено: Чт май 07, 2015 07:50:42
Neekeetos
evilbob писал(а):По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ?
Чтобы это работало нужно включить CSS , это бит CSSON в регистре RCC_CR. Тогда при сбое внешнего генератора он будет отключен как и pll, а тактирование переключится на MSI. Еще будет возникать прерывание, в котором можно перенастроить плл на внутренний генератор.
Re: Часы реального времени без HSE
Добавлено: Пн май 18, 2015 09:05:39
evilbob
За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Проблема в обработке прерывания по аларму от часов
Re: Часы реального времени без HSE
Добавлено: Пн май 18, 2015 19:03:27
Neekeetos
evilbob писал(а):За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Дело не в прерывании, сам механизм переключения на другой источник тактов не работает если CSS не включен. При пропадании HSE если мк работал от PLL , то частота тактов мк сместится в произвольном направлении, на моей макетке например она стала равна ~200к(с кучей глитчей) при отключеном кварце. Если тактирование было напрямую от HSE, то мк будет тактироваться просто наводками на пины внешнего генератора.
evilbob писал(а):Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Он не может произойти автоматически если CSS выключен. То, что ты наблюдаешь, скорее всего какие то фантомные такты , результат наводок на генератор HSE. В таких условиях все не должно работать , не то что часы.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 08:42:01
evilbob
Спасибо за ответ (хоть кто-то отвечает

)
Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть). Далее уже идет настройка источника тактирования: или включить HSE используя непосредственно кварц, либо внешний генератор с включеным битом HSEBYP, либо настроить PLL от этих источников; или включить внутренний HSI и использовать его как генератор тактов (для L это 16МГц, для F вроде 8МГц), опять же можно настроить PLL и от него; либо оставить MSI.
CSS включается программно, после бита HSERDY и конотролирует сбои внешнего кварца/генератора (на часовой кварц так же есть подобная система). Так что клок секурити

систем является просто способом контроля.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 14:28:55
Galizin
В 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, без которого детектироваться ничего не будет.
Вот и практик в след сообщении говорить то же самое.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 14:43:19
Neekeetos
evilbob писал(а):Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть).
Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил. Так вот без включеной CSS нету никакой смены источников тактирования. Мои ~200кгц не были тактами MSI это был просто выход PLL у которого нет входных тактов. И при восстановлении кварца тактирование тоже восстанавливалось, чего в принципе не может быть если уже используется другой генератор.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 15:43:58
evilbob
Galizin писал(а):Поэтому будет виснуть в любом случае.
Не совсем понял на чем основано утверждение. Если можно, расшифруйте пожалуйста, что будет зависать.
Galizin писал(а):Так вот бита отключения я не нашел.
Правильно, там есть только возможность сбросить флаг прерывания, ну и соответственно бит включения.
Galizin писал(а):Из RM тоже можно понять, что переключение идет только после включения системы. Поскольку, это включает clock detector, без которого детектироваться ничего не будет.
Ткните носом, а то немогу найти. То есть на место откуда можно понять что переключение идет только после вкл системы
Neekeetos писал(а):Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил.
Можно увидет сам код? А то так мы долго будем разбиратся, это как из пушки по воробьям
Домой прийду выложу свой код для демонстрации автопереключения тактирования, а пока на словах расскажу : макетка (правда под stm32f100), обычное мигание светодиодами, достал кварц - мигают медленнее - 2МГц, вставил - мигают быстрее - 8МГц. Понятное дело, быстрее-медленее это все абстрактно, но проделывал тот же фокус с миганием раз в секунду, все тоже самое. Тут просто из минимум кода наглядный пример отрабатывания переключения...
Galizin писал(а):так что попробуйте предположить что все идет в комплекте и написать правильное прерывание.
Делал, скидывал флаг перывания, опять же вечером подтвежу кодом
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 15:56:42
evilbob
Даже так пробовал (с разным набором //), толку 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);
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 16:22:17
Galizin
http://easyelectronics.ru/repository.php?act=view&id=32 - Вот пример кода. Вроде все правильно настраивается и обработчик прерывания определен.
evilbob писал(а):Если можно, расшифруйте пожалуйста, что будет зависать.
Программа естественно, если обработчик написан неправильно или отсутствует. Причины описаны.
evilbob писал(а):откуда можно понять что переключение идет только после вкл системы
Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
evilbob писал(а):вставил - мигают быстрее - 8МГц
, то и детектирование не работает и переключения значит не происходит. А уж что его тактирует и на какой частоте без кварца - это вопрос уже другой, и я думаю, на такие особенности не нужно завязыватся в разработке. Думаю, что навешивание резистора на землю на XIN приведет к отсутвию реагирования на наводки и останов тактирования - зависанию программы.
evilbob писал(а): прерывания по Аларму зависают
- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 16:39:51
evilbob
Galizin писал(а):- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.
Я в первом посте все описал.....Изначально разрабатывал с внешним 8МГц кварцем (для часов свой внешний тоже) на макетке, прога основноую часть времени спит, просыпается раз в секунда по АлармуА от часов, меняет значение светодиода и засыпает и так далее....Сразу не обратил внимание на ТЗ, у заказчика нету внешнего кварца, и соответсвенно мой код у них не заработал (хотя у меня все прекрастно работало). Я и у себя убрал внешний кварц, в итоге так же перестало работать. Прога просто зависает. Стоит только закомментировать включение прерывания АлармА и все работает...
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 16:49:44
evilbob
Galizin писал(а):evilbob писал(а):
откуда можно понять что переключение идет только после вкл системы
Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
Опять же, я так понимаю система детектирования это просто приятная плюшка, особо не влияющая на основную работу, хочешь что-то доп контролировать - включай, нет - не включай....При первом запуске всегда все работает от MSI, дальше уже настраивается нужный генератор. Кстати при работе с энергосберегающими режимами это все наглядно демонстрируется. И еще такой нюанс, при первом запуске система не перейдет на тактирование от внешенго генератора если бит HSERDY не установлен, так что без внешенго физ кварца даже думать за него не надо, а вот настройка внутреннего HSI вполне себе возможна.
Мне кажется тут изначально не в то русло диалог пошел, схема изначально уже состоит без внешенго кварца поэтому как таковую систему переключения можно не рассматривать.
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 17:25:55
Neekeetos
evilbob писал(а):Мне кажется тут изначально не в то русло диалог пошел, схема изначально уже состоит без внешенго кварца поэтому как таковую систему переключения можно не рассматривать.
А в какое он русло должен попасть? Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы. Вроде уже понятно объяснили что при отключении кварца без включеной CSS система питается непонятно какими тактами, не удивительно что прерывание часов не работает, там и сам мк может зависнуть. Вот сделал пример. Если кварц есть то переходит на него, если нету то на мси. Такты ядра можно посмотреть на ПА8 лампочка статуса генератора ПБ7, моргалка на ПБ6 (это на дискавери-л так распаяны светодиоды)
Спойлер
Код: Выделить всё
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;
}
}
Re: Часы реального времени без HSE
Добавлено: Вт май 19, 2015 18:14:35
Galizin
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 00:08:46
evilbob
И? Да, тот топик тоже я создал. Он немного не причесан, я там уже все пробовал, даже нелепые варианты принудительного оключения CSS.
Neekeetos писал(а):А в какое он русло должен попасть? Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы.
Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)
Чего вы вцепились в этот CSS? Если это из-за того что в топике написал про переключение, то прошу прощения, мог ввести в заблуждение.
Суть такова, проект настроен на работу от HSI и
все работает, кроме прерывания от АлармаА
Видео работоспособности кода
https://www.youtube.com/watch?v=QyxoeEO36FE
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 08:05:33
Neekeetos
evilbob писал(а):Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)
Я так полагаю, что раз при отключении кварца все перестает работать, то кварц все же используется для тактирования мк, отсюда все проблемы и
Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы. Вроде уже понятно объяснили что при отключении кварца без включеной CSS система
питается непонятно какими тактами, не удивительно что прерывание часов не работает
Проверь в своем проекте файл system_stm32l1xx.c , там есть функция SystemInit которая вызывается при сбросе мк и настраивает его на работу с нужными тактами, переключая с изначального MSI, если закомментишь вызов SetSysClock() , то вся эта борода с часами заработает но медленно (поскольку такты с HSI у тебя настраиваются только внутри прерывания)
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 08:42:07
evilbob
Neekeetos писал(а):Я так полагаю, что раз при отключении кварца все перестает работать
В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
Neekeetos писал(а):поскольку такты с HSI у тебя настраиваются только внутри прерывания
Не совсем так, сначала при старте функция init настраивает тактирование, а дальше в прерывании происходит повторная настройка так как мк вышел из стоп режима.
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 09:48:13
Neekeetos
evilbob писал(а):В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
Ну выведи на MCO сигнал SYSCLK и посмотри что происходит с подключеным кварцем и без. Если же ты наткнулся на такую проблему, что при выключеном (по твоим словам) HSE подключение/отключение кварца влияет на работу чипа, то это очень интересное явление, его надо изолировать и создать кейс на сайте ст. Но я лично пока не вижу каких либо подтверждений этому, просто кривой код. Было бы еще понятнее если бы были полные исходники проекта.
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 10:19:02
evilbob
Neekeetos писал(а):при выключеном (по твоим словам) HSE подключение/отключение кварца влияет на работу чипа
Из моих слов следует что "подключение/отключение кварца влияет на работу чипа" (без уточнения включен или отключен 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();
}
}
Хорошо, сформулирую вопрос иначе: "Как настроить секундное (раз в секунду) прерывание по аларму для часов реального времени при тактировании от HSI"
Re: Часы реального времени без HSE
Добавлено: Ср май 20, 2015 10:55:02
Neekeetos
evilbob писал(а):Из моих слов следует что "подключение/отключение кварца влияет на работу чипа" (без уточнения включен или отключен HSE программно, то есть в коде нигде не прописывается непосредственное отключение) это и так видно при смене частоты мигания светодиодов.
Ну и отключи его программно. Правда разумнее найти где он включается и там убрать, пусть все работает по даташиту от 2МГц MSI.
evilbob писал(а):Можно конкретно указать на кривые моменты? А то как-то грубо звучит.
Ничего особенного не имел в виду, сам так когда то писал. Из косяков например настройка тактов процессора в прерывании. Сам код создает ощущение что ты не знаешь что тебе нужно, прерывание от часов настраивается двумя строчками а не четырьмя листами мусора.
evilbob писал(а):Выше уже была ссылка на прошивку из форума на сайте ст
А можно просто взять файлы проекта и запаковать в архив, эти так называемые исходники с сайта представляют из себя копипасту а не полноценный код, собрать их и проверить нельзя.
evilbob писал(а):Хорошо, сформулирую вопрос иначе: "Как настроить секундное (раз в секунду) прерывание по аларму для часов реального времени при тактировании от HSI"
У тебя же все работает. Просто убери смену тактирования из прерывания часов и оно перестанет зависать.