Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
1

Переключить тактовый генератор с HSI на LSI (STM8l-Discovery)

23.10.2015, 11:01. Просмотров 2874. Ответов 11
Метки нет (Все метки)

Здравствуйте, в качестве обучения захотелось переключить тактовый генератор
с HSI на LSI. Но сделать это почему-то не получилось хотя действовал вроде по инструкции.
Вот пример кода:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stm8l15x_conf.h"
 
void SomeDelay()
{
  for(unsigned long i=0; i < 5000; i++)
  {
    asm("NOP");
  }
}
 
int cs = 0;
void main(void)
{
        CLK->SWR |= 0x02; // turn on LSI
        CLK->SWCR |= 0x02; // Enables switching the system clock
        
           
        while((CLK->SWCR & 1) != 0 ) // validate SWBSY bit 
//                                      if SWBSY == 0 then turning to LSI is done
        {
          cs = CLK_GetSYSCLKSource();  // return the current clock source
//                                         cs = 1 HSI
//                                              2 LSI
//                                              4 HSE
//                                              8 LSE
        }
        
        cs = CLK_GetSYSCLKSource(); //return the current clock source
        GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); // initialize GPIO
        
        while(1)
        {
          GPIO_ToggleBits(GPIOE, GPIO_Pin_3); // Toggle current GPIO
          SomeDelay();
        }
        
}
При переключении бит SWBSY сбрасывается как и положено, т.е.
переключение вроде как произошло.

Но когда я использую функцию CLK_GetSYSCLKSource(), который
возвращает текущий номер генератор, он после срабатывания
SWBSY выдает 1 (т.е. текущий генератор все-еще HSI, а не LSI (для него должно быть 2) ).

Пробовал вручную проверять переключение генератора, путем
переключения напряжения на ножке PE3. Там в принципе тоже показывает
что генератор тактового сигнала тот же. Т.е. частота прямоугольных
импульсов как до, так и после осталась неизменной (50 Гц у меня получилось).

В чем тут загвоздка, как переключить генератор тактового сигнала ?
0
Вложения
Тип файла: zip 12_GPIO_Change_Clk_Source.zip (3.42 Мб, 3 просмотров)
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2015, 11:01
Ответы с готовыми решениями:

Тактовый генератор и ATMEGA328P-PU
Здравствуйте! Есть микроконтроллер ATMEGA328P-PU и некоторые вопросы, а именно: Какой нужен...

Настройка ЦАП в STM8L-Discovery
Здравствуйте, обучаюсь программированию МК с помощью stm8l-Discovery. Возникла проблема при...

10-канальный диммер на STM8L-DISCOVERY
Для школы, где учится мой младший, сделал 10-канальный диммер плавного управления яркостью...

STM8l + внешний низкочастотный тактовый генератор
Можно ли использовать stm8l с внешним низкочастотным(32.768КГЦ) генератором тактового...

11
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
23.10.2015, 11:17  [ТС] 2
Смотрел регистр CLK->SWR, почему-то
CLK->SWR |= 0x02;
не устанавливает биты, хотя в руководстве написано,
что они для чтения и записи.
0
Voland_
1756 / 1088 / 108
Регистрация: 04.01.2010
Сообщений: 3,782
23.10.2015, 17:37 3
foxis, регистры управления не смотрел, но, по логике рассуждений, после запуска LSI вам надо дождаться, пока он выставит флаг готовности. Ну, или по-другому себя как-то проявит ). Клоки никогда не стратуют моментально, и управление ими, и работа с ними всегда сопряжена с ожиданием реакции. После запроса на переключение вы ждете, но не ожидаете сам запуск LSI - команды управления идут друг за другом.
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
25.10.2015, 12:31 4
http://we.easyelectronics.ru/STM8/8l-kurs-chast-4-taktirovanie.html
0
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
26.10.2015, 09:33  [ТС] 5
Voland_
спасибо за рекомендации, но я работаю в режиме компиляции, поэтому между
выполнением команд проходит как минимум 1 сек. Мне кажется это более чем достаточно,
чтобы переключиться. Тем более в программе предусмотрено ожидание
пока бит SWBSY в регистре CLK_SWCR сброситься.

Витальич, спасибо за ссылку, я эту статью уже прочитал до дыр. Но она не особо сильно
мне помогла, т.к. там с HSI переключаются на HSE. А в stm8l-Discovery, HSE - отсутствует
(нужно дополнительно припаять к плате кварц, который по умолчанию в плате отсутствует).
Поэтому решил попробовать переключить c HSI на LSI.

Заметил интересную вещь если в регистре CLK_SWR бит не устанавливать (
C
1
CLK->SWR |= 0x02
), а
присваивать ему значение (
C
1
CLK->SWR = 0x02
) появляется ошибка при компиляции после
выполнения команды
C
1
CLK->SWR = 0x02
:

Failed to get execution status: SWIM error [30004]: Comm timeout.

Если же вместо присваивания, устанавливать бит (
C
1
CLK->SWR |= 0x02
), то
программа работает без ошибок, однако источник тактирование не меняется
это видно по статусному регистру CLK_SCSR, которые остается неизменным и равен
1 (т.е. включен HSI),а должен быть равен 2 (включение LSI).

Программку подредактировал и сократил для удобства:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stm8l15x_conf.h"
 
void main(void)
{
          CLK->ICKCR |= 0x04; // Enable LSI (set LSERDY)
          CLK->SWCR |= 0x02; // Enables switching the system clock (bit SWEN)
          CLK->SWR = 0x02;  //CLK->SWR |= 0x02; // choose LSI
  
          while( (CLK->SWCR & 0x01) == 1){}
    
        GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); // initialize GPIO
        
        while(1)
        {
          GPIO_ToggleBits(GPIOE, GPIO_Pin_3); // Toggle current GPIO
        }
        
        
}
Добавлено через 21 минуту
При это при установке бита
C
1
CLK->SWR |= 0x02
регистр после данной команды не изменяет своего значения.

Также пробовал присвоить
C
1
CLK->SWR = 0x04
т.е. переключиться на HSE (которого нет) все работает без ошибок
однако программа зацикливается на
C
1
while( (CLK->SWCR & 0x01) == 1){}
т.е. бит SWBSY (готовности) в регистре CLK_SWCR
не хочет сбрасываться, видимо это связано с отсутствием HSE .

Если CLK_SWCR присвоить значение
C
1
CLK->SWR = 0x08;
т.е. переключение на LSE, также идет
стопорение на
C
1
while( (CLK->SWCR & 0x01) == 1){}
но плюс возникают еще ошибки
Failed to read memory at 0x7FD: SWIM error [30004]: Comm timeout
Failed to read memory at 0x50C9: SWIM error [30004]: Comm timeout
и т.д.

Складывается такое ощущение, что все остальные тактовые генераторы
(LSI, HSI) являются специализированными и запускаются только для
определенной переферии, например LSI - для сторожевого таймера (IWDG)
LSE - для часов реального времени (RTC).

И единственными общедоступными генераторами для тактирования
процессора являются HSI, HSE. Причем второй у меня отсутствует,
поэтому выбора получается у меня и нету .
0
Voland_
1756 / 1088 / 108
Регистрация: 04.01.2010
Сообщений: 3,782
26.10.2015, 23:25 6
Лучший ответ Сообщение было отмечено Витальич как решение

Решение

Цитата Сообщение от foxis Посмотреть сообщение
спасибо за рекомендации, но я работаю в режиме компиляции
не в режиме компиляции, а в режиме отладки, насколько я понял. В режиме отладки вы работаете через интерфейс SWIM, который, насколько я знаю, привязан к внутреннему клоку. Чтобы работал SWIM, нужен высокочастотный генератор для процессора. При записи 0x02 в CLK->SWR и происходит переключение на LSI, и SWIM "отпадает". Все верно.
2
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
27.10.2015, 09:36  [ТС] 7
Спасибо большое, Voland_ немного стало яснее насчет ошибки.
В мануале для SWIM (UM0470 стр.6) как раз написано, что SWIM использует
генератор HSI, а также генератор LSI.
Кстати ошибка эта вылезает и без входа в режим отладки.

Тогда получается переключение на другие тактовые генераторы невозможно ?
Почему тогда переключение успешно происходило с HSI на HSE
у автора статьи, которую выше привел Витальич ?

Да, извиняюсь, я имел ввиду режим отладки.
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
27.10.2015, 10:54 8
Цитата Сообщение от foxis Посмотреть сообщение
Почему тогда переключение успешно происходило с HSI на HSE
HSI (High Speed Internal) — встроенный осциллятор работает на 16 мГц
HSE (High Speed Extrenal) — внешний кварц или генератор, не знаю какой кварц стоит на дискавари, но точно не меньше 8 мГц
Тактирования SWIM может происходить с обоих. Так что проблем не вижу.
0
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
27.10.2015, 13:50  [ТС] 9
Витальич
да, согласен с вами с HSE работает без ошибок.

Тогда почему возникает ошибка (связанная со SWIM) при переключении на LSE
ведь он же тоже внешний (судя по вашей логике) ?

Или у генераторов которые подключаются в качестве системных
есть определенные ограничения по частоте (например не ниже 1 МГц(число взято произвольно)),
тогда получается HSE, HSI удовлетворяют данному критерию, а вот
LSI, LSE уже не удовлетворяют.

Добавлено через 1 час 26 минут
Нашел в руководстве (RM0031) следующую информацию:
1) HSE
The high-speed external clock signal (HSE) can be generated from two possible clock
sources:
• HSE external crystal/ceramic resonator
• HSE user external clock

2) HSI
At startup the system clock source is automatically selected as HSI RC clock output divided
by 8 (HSI/8).

3) LSE
It has the advantage of providing a low power and highly accurate clock source to the real-time clock
peripheral (RTC) for clock/calendar or other timing functions.

4) The LSI RC acts as a low power clock source that can be kept running in Active-halt and
Run modes for the independent watchdog (IWDG)

Т.о. HSI, HSE могут быть системными тактовыми генераторами, а LSI, LSE являются
(как я и думал) специализированными генераторами предназначенными только
для определенной периферии (для сторожевого таймера и часов реального времени).

По видимому LSI, LSE не являются основными источниками тактирования, а могут
работать только параллельно с HSE или HSI.

Правда вот все меня смущает данная функция из библиотеки stm8l15x_clk.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
  * @brief  Configures the system clock (SYSCLK).
  * @note   The HSI is used (enabled by hardware) as system clock source after
  *         startup from Reset, wake-up from Halt and active Halt modes, or in case
  *         of failure of the HSE used as system clock (if the Clock Security System CSS is enabled).
  * @note   A switch from one clock source to another occurs only if the target
  *         clock source is ready (clock stable after startup delay or PLL locked). 
  *         You can use CLK_GetSYSCLKSource() function to know which clock is
  *         currently used as system clock source. 
  * @param  CLK_SYSCLKSource: specifies the clock source used as system clock.
  *          This parameter can be one of the following values:
  *            @arg CLK_SYSCLKSource_HSI: HSI selected as system clock source
  *            @arg CLK_SYSCLKSource_HSE: HSE selected as system clock source
  *            @arg CLK_SYSCLKSource_LSI: LSI selected as system clock source
  *            @arg CLK_SYSCLKSource_LSE: LSE selected as system clock source
  * @retval None
  */
void CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_TypeDef CLK_SYSCLKSource)
{
--------------------------------------
}
Судя по ней возможность для LSE, LSI быть системными
источником тактирования есть, но тогда это будет противоречит
руководству. Вот тут несостыковка получается.
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
27.10.2015, 14:14 10
Я не знаю, Errata sheet читать надо, а их к каждому камушку не один может быть.
1
Voland_
1756 / 1088 / 108
Регистрация: 04.01.2010
Сообщений: 3,782
27.10.2015, 15:36 11
Цитата Сообщение от foxis Посмотреть сообщение
4) The LSI RC acts as a low power clock source that can be kept running in Active-halt and
Run modes for the independent watchdog (IWDG)
Режим "Active Halt" - это и есть тот режим, в котором процессор тактуется от LSI. Попробуйте сделать какую-нибудь моргалку ногой МК и переведите клок ЦПУ с тактованием на LSI. Моргалка ногой замедлится в несколько сот раз, однако, должна продолжить свою работу. Не расчитывайте на отладку. Учитывая, что она отпадает на этой частоте. Работайте с реальным чипом да и все ).
1
foxis
6 / 6 / 0
Регистрация: 11.07.2011
Сообщений: 122
27.10.2015, 16:53  [ТС] 12
Урааа, все заработало !!!
В общем, Voland_, вы были правы, в режиме отладки невозможно заметить
переключение HSI->LSI (HSI->LSE) опять же из-за SWIM.

А вот если моргать светодиодом, то все сразу становиться явным
правда IAR пулеметной очередью выдает ошибку
Failed to get execution status: SWIM error [30004]: Comm timeout
но зато все работает, моргание светодиода замедляется.

Пробовал моргать светодиодом при переключении
с HSI->LSE все работает аналогично.

Спасибо большое, Voland_, Витальич, за помощь !

На всякий случай выкладываю программка для переключения
HSI-LSE
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "stm8l15x_conf.h"
 
void SomeDelay()
{
  for(unsigned long i=0; i < 50000; i++) 
  {
    asm("NOP");
  }
}
 
int nn = 1;
void main(void)
{
     
        GPIO_Init(GPIOE, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Fast); // initialize GPIO
        
        while(1)
        {
          GPIO_ToggleBits(GPIOE, GPIO_Pin_7); // Toggle current GPIO
          
          SomeDelay();
          
          nn++;
            
          if(nn>=150)
          {
            CLK->ECKCR |= 0x04; // Enable LSE (set LSEON)
            CLK->SWCR |= 0x02; // Enables switching the system clock (bit SWEN)
            CLK->SWR = 0x08; // choose LSE
            SomeDelay();
          }
        }          
}


HSI->LSI

Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "stm8l15x_conf.h"
 
void SomeDelay()
{
  for(unsigned long i=0; i < 50000; i++) 
  {
    asm("NOP");
  }
}
 
int nn = 1;
void main(void)
{
     
        GPIO_Init(GPIOE, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Fast); // initialize GPIO
        
        while(1)
        {
          GPIO_ToggleBits(GPIOE, GPIO_Pin_7); // Toggle current GPIO
          
          SomeDelay();
          
          nn++;
            
          if(nn>=150)
          {
            CLK->ICKCR |= 0x04; // Enable LSI (set LSION)
            CLK->SWCR |= 0x02; // Enables switching the system clock (bit SWEN)
            CLK->SWR = 0x02; // choose LSI
            SomeDelay();
          }
        }          
}
2
27.10.2015, 16:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2015, 16:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

АЦП STM8L discovery
запускаю одиночное преобразование таким способом: //Функция инициализации АЦП для режима...

ds18b20 и STM8L – Discovery.
Задумал я подключить датчик ds18b20 STM8L – Dyscovery. Код думаю писать в ИАРе. Погуглил на этот...

STM8L-discovery + HCSR04
Нужна помощь в написании программы для платы STM8L-discovery (stm8l152c6) и HCSR04. Среда...

hd44780, stm8l discovery
Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.