Перейти к содержанию
    

1) Имеется плата STM32F100 с подключенным кварцевым резонатором 8 МГц. В CoIDE загружен тестовый пример мигания Blink, выставлен период мигания светодиодов 1 с. Проект нормально компилируется, светодиоды мигают. Как я понимаю, по умолчанию в проектах CooCox выставляется режим работы от кварцевого генератора с внутренним умножением частоты на 3, то есть тактовая частота 24 МГц.

 

Теперь я срываю генерацию кварца прикосновением пинцета, при этом период мигания светодиодов увеличивается в 6 раз. Если пинцет убираю, то вновь период возвращается к 1 с. В доках пишут, что при аварии внешнего тактового сигнала начинает работать внутренний генератор частотой 8 МГц. То есть, по идее период мигания должен увеличиться в 3 раза, а не в 6 раз. Вопрос - почему?

 

2) Если подключается кварцевый резонатор к линиям PD0, PD1, то в какой режим надо переводить регистры GPIO - вход, вход-pull-up/down, выход или ресет? Надо ли вообще активировать тактирование порта PD?

 

3) Аналогичный пункту 2 вопрос, если вместо кварцевого резонатора подключается внешний цифровой сигнал на линию PD0 (то есть как настраивать линии PD0 и PD1 по GPIO)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Имеется плата STM32F100 с подключенным кварцевым резонатором 8 МГц. В CoIDE загружен тестовый пример мигания Blink, выставлен период мигания светодиодов 1 с.

А каким образом отсчитывается этот интервал? По таймеру? По числу тактов процессора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А каким образом отсчитывается этот интервал? По таймеру? По числу тактов процессора?

В фирменном примере от CooCoxа интервал отсчитывается по тактам процессора. Но я проверял аналогичную программу по таймеру на прерываниях. Эффект тот же, то есть длительность мигания увеличивается в 6 раз при срыве генерации.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы ничего не напутали с замерами времени моргания?

Надеюсь это понятно что для мигания светодиода раз в секунду, нужно на пол секунды зажечь его и на пол секунды потушить (для равномерного мигания). Это значит для частоты 8 Мгц у вас должно быть время свечения 1.5 сек и время в потушенном состоянии тоже 1.5 сек (при равных отсчетах потушеного и зажженного светодиода), короче период мигания (учитывая время зажженного и потушенного состояния) должен быть равен 3 сек.

Извините, но я тоже не могу понять как у вас так получилось, если вы все правильно посчитали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?

А выложить можете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А выложить можете?

Провел аналогичный эксперимент на STM32VLDiscovery. Создал новый проект CoIDE-1.7.5, компилятор 2012q4, дальше ни единой строчки сам не пишу, а только добавляю из пункта "GPIO (with 10 examples)" функцию GPIO_Blink (add). Компилирую с ключом О0, получаю мигающий зеленый светодиод с периодом чуть больше 2 с. Затем, не выключая питание, вынимаю кварцевый резонатор 8 МГц из панельки. Период увеличивается до 17 с.

Компилирую с ключом О1, получаю мигание с кварцем 0,5 с, без кварца 4 с. Когда кварц ставлю обратно в панельку (не выключая питание), то быстрое мигание опять восстанавливается.

 

void GPIO_Blink(void);

 

int main(void)

{

 

//automatically added by CoIDE

GPIO_Blink();

 

while(1)

{

}

}

/**

******************************************************************************

* @file GPIO/GPIO_Blink/main.c

* @author MCD Application Team

* @version V1.0.0

* @date 30-October-2010

* @brief Main program body

******************************************************************************

* @attention

*

* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY

* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

*

* <h2><center>© COPYRIGHT 2010 STMicroelectronics</center></h2>

******************************************************************************

*/

 

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

 

 

void GPIO_Blink(void)

{

int i;

/* Initialize Leds mounted on STM32 board */

GPIO_InitTypeDef GPIO_InitStructure;

/* Initialize LED which connected to PC6,9, Enable the Clock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

/* Configure the GPIO_LED pin */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

 

 

 

while (1)

{

/* Toggle LEDs which connected to PC6*/

GPIOC->ODR ^= GPIO_Pin_6;

 

 

/* delay */

for(i=0;i<0x100000;i++);

 

/* Toggle LEDs which connected to PC9*/

 

GPIOC->ODR ^= GPIO_Pin_9;

 

/* delay */

for(i=0;i<0x100000;i++);

}

}

Изменено пользователем RomanRom

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Как я понимаю, по умолчанию в проектах CooCox выставляется режим работы от кварцевого генератора с внутренним умножением частоты на 3, то есть тактовая частота 24 МГц....

не совсем, а точнее так:

PLL configuration = (HSE / 2) * 6 = 24 MHz, где HSE = 8MHz - сам кварц.

 

При сбое генератора HSE, он выключается на аппаратном уровне и включается HSI (8MHz). Срабатывает Clock security system (CSS).

If the HSE oscillator is used directly or indirectly as the system clock (indirectly means: it is

used as PLL input clock, and the PLL clock is used as system clock), a detected failure

causes a switch of the system clock to the HSI oscillator and the disabling of the HSE

oscillator. If the HSE clock (divided or not) is the clock entry of the PLL used as system clock

when the failure occurs, the PLL is disabled too.

Тобиш PLL тоже выключается, остаётся только HSI (8MHz) !!! Вот такая математика.

 

 

Пожалуйста посмотрите и покажите нам значение регистра RCC_CFGR и RCC_CFGR2 после инициализации контроллера

Изменено пользователем Falkon_99

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не совсем, а точнее так:

PLL configuration = (HSE / 2) * 6 = 24 MHz, где HSE = 8MHz - сам кварц.

А почему бы не так:

PLL configuration = (HSE * 1) *3 = 24 MHz, где HSE = 8MHz - сам кварц

 

В этом случае через регистр PREDIV1 частота умножается на 1, а через регистр PLLMUL - умножается на 3. Могут быть и другие сочетания коэффициентов.

 

Логичное объяснение разницы периодов мигания в 6 раз может быть в том, что ФАПЧ действительно в аварийном режиме отключается, причем под отключением понимается не переброс регистра SW на коммутацию от HSI, а установка коэффициента умножения регистра PLLMUL в 1. Тогда получается HSI / 2 * 1=4 МГц, то есть в 6 раз меньше, чем 24 МГц.

 

Единственное, что меня смущает, это отличие периода мигания в STM32VLDiscovery не в 6 раз, а где-то в 8 раз, что не вписывается в данную теорию. Но раньше на другой плате (не Discovery) я видел отличие ровно в 6 раз.

 

P.S. А как насчет двух других моих вопросов про входы/выходы GPIO для PD0-PD1 (выводы подключения кварцевого резонатора)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Системную частоту можно вывести на ногу с сигналом MCO. И там осцилом глнять какая у вас действительно частота ядра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно и так (8/1)*3=24 , но если используется не стандартный стартАп

 

интересно, можно ли повторить аварийную ситуацию с кварцем, при подключённом отладчике? Тогда глядя на регистры RCC станет понятно какие предделители включаются, и напрямую определить частоту.

 

 

2) Если подключается кварцевый резонатор к линиям PD0, PD1, то в какой режим надо переводить регистры GPIO - вход, вход-pull-up/down, выход или ресет? Надо ли вообще активировать тактирование порта PD?

The pins number 2 and 3 in the VFQFPN36 package, 5 and 6 in the LQFP48 and LQFP64 packages and C1 and C2 in the TFBGA64 package are configured as OSC_IN/OSC_OUT after reset, however the functionality of PD0 and PD1 can be remapped by software on these pins. For more details, refer to the Alternate function I/O and debug configuration section in

the STM32F10xxx reference manual.

тоесть регистр GPIO отведенный под кварц можно вообще не трогать. Думаю тоже самое касается и 3-го вопросса.

 

да и еще: чудес не бывает))

Изменено пользователем Falkon_99

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему бы не так:
А зачем гадать? У вас есть исходник - в нем написано, как оно есть на самом деле. Если очень лень разбираться в лестницах макросов от ST, то у вас есть живая плата и отладчик - считайте состояние регистров и все увидите. Гадать можно сколько угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все можно увидеть в отладчике Keil. И на картинке RCC видно, что частота HSI делится на 2, прежде чем подается на PLL.

post-10362-1387356410_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Провел аналогичный эксперимент на STM32VLDiscovery. Создал новый проект CoIDE-1.7.5...

А где же самое интересное? Обработчики прерываний в частности NMI?

И насколько я понял CSS при сбое внешнего HSE переключает системную частоту на HSI, отключая PLL.

При восстановлении HSE контроллер сам ничего не восстанавливает - включать PLL нужно ручками.

Дык, вот код включения Вы не привели (прерывания NMI и RCC со всеми зависимостями + SystemInit, который вызывается до main).

Пред while(1) лучше прерывания отключить, чтобы временные интервалы были стабильными (может у Вас периодически обрабатываются

прерывания, удлиняющие цикл в while(1)?).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Имеется МК STM32F103. Хочу сделать remapping и активировать порты PD0 и PD1 вместо OSC_IN OSC_out. Почему после инициализации на порте PD1 у меня 1,12 Вольт, хотя есть внешняя и внутренняя подтяжка к 3,3 В питания через 4,7 кОм?

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);     // подключаем альтернативные функции
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //включаем тактирование порта D на вход для опроса адреса платы:
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);// разрешаем ремап
/* Configure PD0 PD1 (oscillator) as input pull-up */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // на вход, поддяжка к питанию
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// тактирование 50 МГц
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);

Изменено пользователем andrey74

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...