Часы реального времени без HSE

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Часы реального времени без HSE

Сообщение evilbob »

Здравствуйте!
Нужно реализовать часы реального времени на STM32L151. В частности, с помощью светодиода мигать каждый раз когда срабатывает прерывание по AlarmA. Для часов используется внешний LSE. На макетной плате с внешним HSE все прекрасно работает, как только достаю внешний кварц, проект зависает.
По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ? Заранее спасибо
Реклама
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):По идеи при сбое внешнего источника тактирования, камень включает свой внутренний MCO (как и при первом включении или после ресета) и дальше можно настроить внутренний высокочастотный генератор. Обычные функции типа помигать светодиодом или определить прерывание по внешнему пину работают, зависает только на прерывании от часов. Может кто-то сталкивался с подобной проблемой ?
Чтобы это работало нужно включить CSS , это бит CSSON в регистре RCC_CR. Тогда при сбое внешнего генератора он будет отключен как и pll, а тактирование переключится на MSI. Еще будет возникать прерывание, в котором можно перенастроить плл на внутренний генератор.
Информация по RLC mini находится >тут<
Реклама
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Проблема в обработке прерывания по аларму от часов
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):За контроль работы внешнего генератора я знаю, по сути, если его включить, то при срабатывании программа вываливается в прерывание и ждет когда бит сбросят, причем данное прерывание имеет приоритет выше программных. В том то и дело еслиб этот режим был включен тогда б зависание програмы легко объяснялось, а так я в замешательстве.
Дело не в прерывании, сам механизм переключения на другой источник тактов не работает если CSS не включен. При пропадании HSE если мк работал от PLL , то частота тактов мк сместится в произвольном направлении, на моей макетке например она стала равна ~200к(с кучей глитчей) при отключеном кварце. Если тактирование было напрямую от HSE, то мк будет тактироваться просто наводками на пины внешнего генератора.
evilbob писал(а):Причем, повторюсь, переход на внутренний генератор происходит автоматически без проблем, так же исправно настраивается внутренний HSI (наблюдаю по частоте мигания светодиода).
Он не может произойти автоматически если CSS выключен. То, что ты наблюдаешь, скорее всего какие то фантомные такты , результат наводок на генератор HSE. В таких условиях все не должно работать , не то что часы.
Информация по RLC mini находится >тут<
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

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

Re: Часы реального времени без HSE

Сообщение 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, без которого детектироваться ничего не будет.
Вот и практик в след сообщении говорить то же самое.
Последний раз редактировалось Galizin Вт май 19, 2015 14:49:05, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):Но позволь с тобой не согласится.
Исходя из Reference Manual на стмину, и в частности на stm32L1xx (просто ее как раз юзаю, хотя вроде в других аналогичный механизм), изначально при любом запуске будь то после ресета или выход из режима стоп\стендбай мк тактируется от внутреннего мультискоросного генератора MSI (по умолчанию 2 МГц, но у него 7 вариантов частоты вплоть до 65кГц. Кстати и твои ~200кГц там есть).
Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил. Так вот без включеной CSS нету никакой смены источников тактирования. Мои ~200кгц не были тактами MSI это был просто выход PLL у которого нет входных тактов. И при восстановлении кварца тактирование тоже восстанавливалось, чего в принципе не может быть если уже используется другой генератор.
Информация по RLC mini находится >тут<
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

Galizin писал(а):Поэтому будет виснуть в любом случае.
Не совсем понял на чем основано утверждение. Если можно, расшифруйте пожалуйста, что будет зависать.
Galizin писал(а):Так вот бита отключения я не нашел.
Правильно, там есть только возможность сбросить флаг прерывания, ну и соответственно бит включения.
Galizin писал(а):Из RM тоже можно понять, что переключение идет только после включения системы. Поскольку, это включает clock detector, без которого детектироваться ничего не будет.
Ткните носом, а то немогу найти. То есть на место откуда можно понять что переключение идет только после вкл системы
Neekeetos писал(а):Это все любопытно, но я просто вывел на макетке SYSCLK на MCO и проверил.
Можно увидет сам код? А то так мы долго будем разбиратся, это как из пушки по воробьям :kill:
Домой прийду выложу свой код для демонстрации автопереключения тактирования, а пока на словах расскажу : макетка (правда под stm32f100), обычное мигание светодиодами, достал кварц - мигают медленнее - 2МГц, вставил - мигают быстрее - 8МГц. Понятное дело, быстрее-медленее это все абстрактно, но проделывал тот же фокус с миганием раз в секунду, все тоже самое. Тут просто из минимум кода наглядный пример отрабатывания переключения...
Galizin писал(а):так что попробуйте предположить что все идет в комплекте и написать правильное прерывание.
Делал, скидывал флаг перывания, опять же вечером подтвежу кодом
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение 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);
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: Часы реального времени без HSE

Сообщение Galizin »

http://easyelectronics.ru/repository.php?act=view&id=32 - Вот пример кода. Вроде все правильно настраивается и обработчик прерывания определен.
evilbob писал(а):Если можно, расшифруйте пожалуйста, что будет зависать.
Программа естественно, если обработчик написан неправильно или отсутствует. Причины описаны.
evilbob писал(а):откуда можно понять что переключение идет только после вкл системы
Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
evilbob писал(а):вставил - мигают быстрее - 8МГц
, то и детектирование не работает и переключения значит не происходит. А уж что его тактирует и на какой частоте без кварца - это вопрос уже другой, и я думаю, на такие особенности не нужно завязыватся в разработке. Думаю, что навешивание резистора на землю на XIN приведет к отсутвию реагирования на наводки и останов тактирования - зависанию программы.
evilbob писал(а): прерывания по Аларму зависают
- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

Galizin писал(а):- так может быть ошибка в этом прерывании или отсутвии его обработчика? Стоит отделить мух от котлет. Зависание по причине сбоя кварца и зависание когда приходит прерывание по alarm.
Я в первом посте все описал.....Изначально разрабатывал с внешним 8МГц кварцем (для часов свой внешний тоже) на макетке, прога основноую часть времени спит, просыпается раз в секунда по АлармуА от часов, меняет значение светодиода и засыпает и так далее....Сразу не обратил внимание на ТЗ, у заказчика нету внешнего кварца, и соответсвенно мой код у них не заработал (хотя у меня все прекрастно работало). Я и у себя убрал внешний кварц, в итоге так же перестало работать. Прога просто зависает. Стоит только закомментировать включение прерывания АлармА и все работает...
Последний раз редактировалось evilbob Вт май 19, 2015 16:55:20, всего редактировалось 1 раз.
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

Galizin писал(а):evilbob писал(а):
откуда можно понять что переключение идет только после вкл системы

Я уже говорил, что это написано в даташите. Предлодение приводил. Косвенно можно судить по слову clock detector который включается при включении CSS. То есть без CSS этот детектор выключен. А если он выключен, то и детектироваться ничего не будет.
Ну и кроме того в последнем абзаце: декретированный сбой приведет к переключению системного тактирования и выключит HSE. А детектируется сбой чем? Правильно, детектором. Поскольку у Вас не происходит отключения HSE
Опять же, я так понимаю система детектирования это просто приятная плюшка, особо не влияющая на основную работу, хочешь что-то доп контролировать - включай, нет - не включай....При первом запуске всегда все работает от MSI, дальше уже настраивается нужный генератор. Кстати при работе с энергосберегающими режимами это все наглядно демонстрируется. И еще такой нюанс, при первом запуске система не перейдет на тактирование от внешенго генератора если бит HSERDY не установлен, так что без внешенго физ кварца даже думать за него не надо, а вот настройка внутреннего HSI вполне себе возможна.
Мне кажется тут изначально не в то русло диалог пошел, схема изначально уже состоит без внешенго кварца поэтому как таковую систему переключения можно не рассматривать.
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение 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;
  }

}
Информация по RLC mini находится >тут<
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: Часы реального времени без HSE

Сообщение Galizin »

Вот нашел код
https://my.st.com/public/STe2ecommuniti ... =interrupt
Скорее всего автор тот же.
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

Galizin писал(а):Вот нашел код
https://my.st.com/public/STe2ecommuniti ... =interrupt
Скорее всего автор тот же.
И? Да, тот топик тоже я создал. Он немного не причесан, я там уже все пробовал, даже нелепые варианты принудительного оключения CSS.
Neekeetos писал(а):А в какое он русло должен попасть? Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы.
Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)
Чего вы вцепились в этот CSS? Если это из-за того что в топике написал про переключение, то прошу прощения, мог ввести в заблуждение.
Суть такова, проект настроен на работу от HSI и все работает, кроме прерывания от АлармаА

Видео работоспособности кода https://www.youtube.com/watch?v=QyxoeEO36FE
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):Нет. Он изначально работает от внутреннего генератора. За внешний кварц я писал, чтоб объяснить что код полностью рабочий (если использовать внешний кварц)
Я так полагаю, что раз при отключении кварца все перестает работать, то кварц все же используется для тактирования мк, отсюда все проблемы и
Изначально мк работал от кварца и плл, кварц сломался и перестали работать часы. Вроде уже понятно объяснили что при отключении кварца без включеной CSS система
питается непонятно какими тактами, не удивительно что прерывание часов не работает
Проверь в своем проекте файл system_stm32l1xx.c , там есть функция SystemInit которая вызывается при сбросе мк и настраивает его на работу с нужными тактами, переключая с изначального MSI, если закомментишь вызов SetSysClock() , то вся эта борода с часами заработает но медленно (поскольку такты с HSI у тебя настраиваются только внутри прерывания)
Информация по RLC mini находится >тут<
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение evilbob »

Neekeetos писал(а):Я так полагаю, что раз при отключении кварца все перестает работать
В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
Neekeetos писал(а):поскольку такты с HSI у тебя настраиваются только внутри прерывания
Не совсем так, сначала при старте функция init настраивает тактирование, а дальше в прерывании происходит повторная настройка так как мк вышел из стоп режима.
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):В том то и дело что все работает при отключении кварца, кроме часового прерывания. Повторюсь, не надо рассматривать вариант случайного сбоя внешенго кварца, его сразу нет. В программе настроено тактирование от HSI и все работает с закомментированной строчкой RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
Ну выведи на MCO сигнал SYSCLK и посмотри что происходит с подключеным кварцем и без. Если же ты наткнулся на такую проблему, что при выключеном (по твоим словам) HSE подключение/отключение кварца влияет на работу чипа, то это очень интересное явление, его надо изолировать и создать кейс на сайте ст. Но я лично пока не вижу каких либо подтверждений этому, просто кривой код. Было бы еще понятнее если бы были полные исходники проекта.
Информация по RLC mini находится >тут<
Аватара пользователя
evilbob
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Re: Часы реального времени без HSE

Сообщение 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"
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Часы реального времени без HSE

Сообщение Neekeetos »

evilbob писал(а):Из моих слов следует что "подключение/отключение кварца влияет на работу чипа" (без уточнения включен или отключен HSE программно, то есть в коде нигде не прописывается непосредственное отключение) это и так видно при смене частоты мигания светодиодов.
Ну и отключи его программно. Правда разумнее найти где он включается и там убрать, пусть все работает по даташиту от 2МГц MSI.
evilbob писал(а):Можно конкретно указать на кривые моменты? А то как-то грубо звучит.
Ничего особенного не имел в виду, сам так когда то писал. Из косяков например настройка тактов процессора в прерывании. Сам код создает ощущение что ты не знаешь что тебе нужно, прерывание от часов настраивается двумя строчками а не четырьмя листами мусора.
evilbob писал(а):Выше уже была ссылка на прошивку из форума на сайте ст
А можно просто взять файлы проекта и запаковать в архив, эти так называемые исходники с сайта представляют из себя копипасту а не полноценный код, собрать их и проверить нельзя.
evilbob писал(а):Хорошо, сформулирую вопрос иначе: "Как настроить секундное (раз в секунду) прерывание по аларму для часов реального времени при тактировании от HSI"
У тебя же все работает. Просто убери смену тактирования из прерывания часов и оно перестанет зависать.
Информация по RLC mini находится >тут<
Ответить

Вернуться в «ARM»