Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F100 три вопроса
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
RomanRom
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)?
adnega
Цитата(RomanRom @ Dec 17 2013, 17:38) *
1) Имеется плата STM32F100 с подключенным кварцевым резонатором 8 МГц. В CoIDE загружен тестовый пример мигания Blink, выставлен период мигания светодиодов 1 с.

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

В фирменном примере от CooCoxа интервал отсчитывается по тактам процессора. Но я проверял аналогичную программу по таймеру на прерываниях. Эффект тот же, то есть длительность мигания увеличивается в 6 раз при срыве генерации.
coolbassnik
Вы ничего не напутали с замерами времени моргания?
Надеюсь это понятно что для мигания светодиода раз в секунду, нужно на пол секунды зажечь его и на пол секунды потушить (для равномерного мигания). Это значит для частоты 8 Мгц у вас должно быть время свечения 1.5 сек и время в потушенном состоянии тоже 1.5 сек (при равных отсчетах потушеного и зажженного светодиода), короче период мигания (учитывая время зажженного и потушенного состояния) должен быть равен 3 сек.
Извините, но я тоже не могу понять как у вас так получилось, если вы все правильно посчитали.
RomanRom
Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?
adnega
Цитата(RomanRom @ Dec 17 2013, 20:25) *
Нет, отсчитывал по секундомеру одинаковые интервалы. Сам удивляюсь, может быть кто-то повторит этот эксперимент на фирменном примере CooCoxa?

А выложить можете?
RomanRom
Цитата(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++);
}
}
Falkon_99
Цитата(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 после инициализации контроллера
RomanRom
Цитата(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 (выводы подключения кварцевого резонатора)?
uriy
Системную частоту можно вывести на ногу с сигналом MCO. И там осцилом глнять какая у вас действительно частота ядра.
Falkon_99
Можно и так (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-го вопросса.

да и еще: чудес не бывает))
Сергей Борщ
Цитата(RomanRom @ Dec 17 2013, 23:26) *
А почему бы не так:
А зачем гадать? У вас есть исходник - в нем написано, как оно есть на самом деле. Если очень лень разбираться в лестницах макросов от ST, то у вас есть живая плата и отладчик - считайте состояние регистров и все увидите. Гадать можно сколько угодно.
ViKo
Все можно увидеть в отладчике Keil. И на картинке RCC видно, что частота HSI делится на 2, прежде чем подается на PLL.
adnega
Цитата(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)?).
andrey74
Добрый день! Имеется МК 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);
Ulianov_Lenin
Товарищи, мне кажется, у меня аналогичная непонятка.
SYSCLK на MCO 8мгц, из HSI, судя по коду и регистрам в debug.
А код, аналогичный gpio_toggle из примеров от stm32f303 выдаёт на ножке 2мгц, вместо 4мгц. Смотрю осциллографом.
Делители AHB,APB1,APB2 = единицы. Компилятор оптимизирует код. Пошаговое исполнение asm инструкций меняет состояние выхода с каждым шагом.
STM32F303 я уже изучил неплохо, а вот тут F100 меня сбивает с толку.

Инициализация сгенерирована coide, разве что закомментировал вызов SetSysClockTo24(), в которой мк пытается запустить HSE+PLL.

Поведение HSI+PLL адекватное, но частота на выходе gpio всёравно в 2 раза ниже ожидаемой.

дизассемблер:
26 GPIOC->BRR = GPIO_Pin_9;
0800063a: str r1, [r0, #20]
27 GPIOC->BSRR = GPIO_Pin_9;
0800063c: str r1, [r0, #16]
28 GPIOC->BRR = GPIO_Pin_9;
0800063e: str r1, [r0, #20]
29 GPIOC->BSRR = GPIO_Pin_9;
08000640: str r1, [r0, #16]

Коммент к аналогичному коду из документации к F3Discovery:
In this example, HCLK is configured at 72 MHz so PE14 and PE15 toggles at 36MHz.
To achieve the maximum IO toggling frequency, you have to configure your compiler
options for high speed optimization.

Мне кажется, автор темы столкнулся с такой-же непоняткой, но ответа я так и не вижу.

вот нашел в одной статье:

The User Manual for the STM32F0 claims that the the output pins fastest toggle speed is every two clock cycles. Assuming a maximum operation speed of 48MHz, the fastest toggle speed for the GPIO on the STM32f0 is 24 MHZ, which means the highest frequency square wave that can be produced by the GPIO is 12MHz.

видимо и нас с F100 касается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.