реклама на сайте
подробности

 
 
> STM32F100 три вопроса, Аварийный генератор, настройка GPIO
RomanRom
сообщение Dec 17 2013, 13:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635



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)?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
adnega
сообщение Dec 17 2013, 14:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(RomanRom @ Dec 17 2013, 17:38) *
1) Имеется плата STM32F100 с подключенным кварцевым резонатором 8 МГц. В CoIDE загружен тестовый пример мигания Blink, выставлен период мигания светодиодов 1 с.

А каким образом отсчитывается этот интервал? По таймеру? По числу тактов процессора?
Go to the top of the page
 
+Quote Post
RomanRom
сообщение Dec 17 2013, 15:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635



Цитата(adnega @ Dec 17 2013, 17:52) *
А каким образом отсчитывается этот интервал? По таймеру? По числу тактов процессора?

В фирменном примере от CooCoxа интервал отсчитывается по тактам процессора. Но я проверял аналогичную программу по таймеру на прерываниях. Эффект тот же, то есть длительность мигания увеличивается в 6 раз при срыве генерации.
Go to the top of the page
 
+Quote Post
coolbassnik
сообщение Dec 17 2013, 16:15
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 22-10-10
Из: Украина
Пользователь №: 60 348



Вы ничего не напутали с замерами времени моргания?
Надеюсь это понятно что для мигания светодиода раз в секунду, нужно на пол секунды зажечь его и на пол секунды потушить (для равномерного мигания). Это значит для частоты 8 Мгц у вас должно быть время свечения 1.5 сек и время в потушенном состоянии тоже 1.5 сек (при равных отсчетах потушеного и зажженного светодиода), короче период мигания (учитывая время зажженного и потушенного состояния) должен быть равен 3 сек.
Извините, но я тоже не могу понять как у вас так получилось, если вы все правильно посчитали.
Go to the top of the page
 
+Quote Post
RomanRom
сообщение Dec 17 2013, 16:25
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635



Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 17 2013, 18:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(RomanRom @ Dec 17 2013, 20:25) *
Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?

А выложить можете?
Go to the top of the page
 
+Quote Post
RomanRom
сообщение Dec 17 2013, 19:43
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635



Цитата(adnega @ Dec 17 2013, 21:03) *
А выложить можете?

Провел аналогичный эксперимент на 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 - Dec 17 2013, 19:45
Go to the top of the page
 
+Quote Post
Falkon_99
сообщение Dec 17 2013, 20:48
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



Цитата(RomanRom @ Dec 17 2013, 15:38) *
... Как я понимаю, по умолчанию в проектах 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 - Dec 17 2013, 20:55
Go to the top of the page
 
+Quote Post
RomanRom
сообщение Dec 17 2013, 21:26
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635



Цитата(Falkon_99 @ Dec 17 2013, 23:48) *
не совсем, а точнее так:
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 (выводы подключения кварцевого резонатора)?
Go to the top of the page
 
+Quote Post
uriy
сообщение Dec 18 2013, 05:13
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Системную частоту можно вывести на ногу с сигналом MCO. И там осцилом глнять какая у вас действительно частота ядра.
Go to the top of the page
 
+Quote Post
Falkon_99
сообщение Dec 18 2013, 07:17
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



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

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


Цитата(RomanRom @ Dec 17 2013, 15:38) *
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 - Dec 18 2013, 07:19
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 18 2013, 07:24
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(RomanRom @ Dec 17 2013, 23:26) *
А почему бы не так:
А зачем гадать? У вас есть исходник - в нем написано, как оно есть на самом деле. Если очень лень разбираться в лестницах макросов от ST, то у вас есть живая плата и отладчик - считайте состояние регистров и все увидите. Гадать можно сколько угодно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 18 2013, 08:46
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Все можно увидеть в отладчике Keil. И на картинке RCC видно, что частота HSI делится на 2, прежде чем подается на PLL.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 18 2013, 09:36
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(RomanRom @ Dec 17 2013, 23:43) *
Провел аналогичный эксперимент на STM32VLDiscovery. Создал новый проект CoIDE-1.7.5...

А где же самое интересное? Обработчики прерываний в частности NMI?
И насколько я понял CSS при сбое внешнего HSE переключает системную частоту на HSI, отключая PLL.
При восстановлении HSE контроллер сам ничего не восстанавливает - включать PLL нужно ручками.
Дык, вот код включения Вы не привели (прерывания NMI и RCC со всеми зависимостями + SystemInit, который вызывается до main).
Пред while(1) лучше прерывания отключить, чтобы временные интервалы были стабильными (может у Вас периодически обрабатываются
прерывания, удлиняющие цикл в while(1)?).
Go to the top of the page
 
+Quote Post
andrey74
сообщение Jul 8 2014, 03:15
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 14-02-11
Пользователь №: 62 953



Добрый день! Имеется МК 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 - Jul 8 2014, 03:22
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01565 секунд с 7
ELECTRONIX ©2004-2016