|
STM32F100 три вопроса, Аварийный генератор, настройка GPIO |
|
|
|
Dec 17 2013, 13:38
|
Местный
  
Группа: Участник
Сообщений: 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)?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Dec 17 2013, 15:13
|
Местный
  
Группа: Участник
Сообщений: 231
Регистрация: 14-02-05
Пользователь №: 2 635

|
Цитата(adnega @ Dec 17 2013, 17:52)  А каким образом отсчитывается этот интервал? По таймеру? По числу тактов процессора? В фирменном примере от CooCoxа интервал отсчитывается по тактам процессора. Но я проверял аналогичную программу по таймеру на прерываниях. Эффект тот же, то есть длительность мигания увеличивается в 6 раз при срыве генерации.
|
|
|
|
|
Dec 17 2013, 19:43
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 17 2013, 20:48
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 17 2013, 21:26
|
Местный
  
Группа: Участник
Сообщений: 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 (выводы подключения кварцевого резонатора)?
|
|
|
|
|
Dec 18 2013, 07:17
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 18 2013, 09:36
|
Гуру
     
Группа: Свой
Сообщений: 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)?).
|
|
|
|
|
Jul 8 2014, 03: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
|
|
|
|
|
Dec 29 2014, 08:25
|
Группа: Новичок
Сообщений: 2
Регистрация: 29-12-14
Пользователь №: 84 343

|
Товарищи, мне кажется, у меня аналогичная непонятка. 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 касается.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|