Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
kyv

Инициализация тактирования микроконтроллера

27.08.2016, 03:41. Показов 4976. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал универсальную функцию инициализации тактирования STM32 семейства F103.
Code
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
38
39
40
41
42
43
44
void rccSetupClocks(void) {
uint32_t cfgr = 0;
#ifdef F_EXT
RCC_regs->CR |= RCC_CR_HSEON;
while (!(RCC_regs->CR & RCC_CR_HSERDY));
#if F_CPU == F_EXT
RCC_regs->CFGR = 1 << RCC_CFGR_SW_OFFSIT;
while ((RCC_regs->CFGR & RCC_CFGR_SWS_MASK) != (1 << RCC_CFGR_SWS_OFFSIT));
#else
#define F_PLL_INPUT F_EXT
cfgr |= RCC_CFGR_PLLSRC;
#endif
#elif F_CPU != 8000000
#define F_PLL_INPUT (8000000 / 2)
#endif
#if F_PLL_INPUT
#if F_PLL_INPUT > F_CPU
#error "PLL output frequency must be greater then input"
#endif
#if (F_CPU % F_PLL_INPUT) != 0
#error "PLL output frequency must be divisyble by input frequency wythout remainder"
#endif
#define PLL_MUL_FACTOR (F_CPU / F_PLL_INPUT)
#if (PLL_MUL_FACTOR < 2) || (PLL_MUL_FACTOR > 16)
#error "PLL multiply factor must be between 2 omd 16"
#endif
cfgr |= (PLL_MUL_FACTOR - 2) << RCC_CFGR_PLLMUL_OFFSIT;
#if F_CPU <= 48000000
cfgr |= RCC_CFGR_OTGFSPRE;
#endif
#if F_CPU > 36000000
cfgr |= 4 << RCC_CFGR_PPRE1_OFFSIT;
#endif
RCC_regs->CFGR = cfgr;
RCC_regs->CR |= RCC_CR_PLLON;
while (!(RCC_regs->CR & RCC_CR_PLLRDY));
FLASH_regs->ACR |= FLASH_ACR_PRFTBE;
FLASH_regs->ACR = (FLASH_regs->ACR & ~FLASH_ACR_LATENCY_MASK) | (((F_CPU - 1) / 24000000) << FLASH_ACR_LATENCY_OFFSIT);
RCC_regs->CFGR = (RCC_regs->CFGR & ~RCC_CFGR_SW_MASK) | (2 << RCC_CFGR_SW_OFFSIT);
while ((RCC_regs->CFGR & RCC_CFGR_SWS_MASK) != (2 << RCC_CFGR_SWS_OFFSIT));
#endif
RCC_regs->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDIM |
RCC_APB2ENR_IOPEEN | RCC_APB2ENR_IOPFEN | RCC_APB2ENR_IOPGEN);
}
Принимает два defineа - F_CPU (требуемая частота ядра) и F_EXT (частота кварца, если он есть). Соответственно, если есть кварц и желаемая частота МК совпадает с его частотой, то тактируемся от HSE. Если кварца нет и требуемая частота 8 МГц, то тактируемся от HSI (просто ничего не делаем, ибо это состояние после сброса). Если же требуемая частота отличается от имеющейся, то настраиваем PLL (а если это невозможно падаем с ошибкой компиляции). А ещё включаем тактирование всех портов ввода-вывода.

Так вот. На одном из пинов висит светодиод и основная программа им мигает. И происходят странные вещи. Если тактироваться от HSI, HSE или PLL из частоты HSI, то всё нормально. А если тактироваться от PLL из частоты HSE, то после перепрошивки светодиод не мигает. Сброс также не помогает. Но если включить-выключить питание, то светодиод начинает мигать. При этом если подключиться отладчиком, то можно увидеть, что программа не висит, а работает. Более того, значения ODR и IDR порта ввода-вывода вполне себе меняются. Только вот реальный светодиод не мигает.

Частота кварца 8 МГц, частоту ядра настраиваю 72 МГц. Когда пробовал тактироваться от HSI, ставил частоту ядра 48 МГц (ибо 72 МГц из 4 МГц получить не получится, потому что максимальный множитель PLL 16).

Первый раз с таким сталкиваюсь. В чём может быть проблема?
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2016, 03:41
Ответы с готовыми решениями:

Система тактирования Cortex-M4
Подскажите, где по теме можно на русском почитать? Было бы неплохо и код посмотреть... какой порядок настройки? Если не ошибаюсь где-то...

Выбор источника тактирования
Что лучше всего использовать в схемах с МК? Выбор таков - стандартный кварц в корпусе HC-49, SMD-кварц (мелкие корпуса 3225 и 2520) или...

Настройка тактирования STM32F407VG
Начал изучать МК семейства ST. Прикупил себе отладочную плату STM32 discovery - disc1. IDE - iar system 8.83. Руководство официальное -...

4
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
27.08.2016, 09:50
Частота периферии не выше 50 МГц (официально = 36). В штатном настройщике это настраивается.
0
kyv
27.08.2016, 13:17
Так ведь смотря какой периферии. APB2 вполне допустимо не делить и подавать сразу 72 МГц. А APB1 я таки делю на 2, если частота больше 36 МГц.
Code
1
2
3
#if F_CPU > 36000000
cfgr |= 4 << RCC_CFGR_PPRE1_OFFSIT;
#endif
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
27.08.2016, 14:13
А, ну тогда sorry.
0
2 / 2 / 0
Регистрация: 23.04.2016
Сообщений: 6
07.03.2020, 09:40
Интересно решено или нет? в KEIL system_stm32f10x.c в функции SystemInit(); сначала сбрасываются настройки тактирования:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;
 
  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
 
  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
 
  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
.......
а потом уже:
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
static void SetSysClockToHSE(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
 
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  
 
  if (HSEStatus == (uint32_t)0x01)
  {
.......
и вот может связано... RM0008:
RM0008
Bits 1:0 SW: System clock switch
Set and cleared by software to select SYSCLK source.
Set by hardware to force HSI selection when leaving Stop and Standby mode or in case of
failure of the HSE oscillator used directly or indirectly as system clock (if the Clock Security
System is enabled).



толька вся эта "зараза" от keil у меня работать не хочет...Сделал по CubeMX - работает, но его мне даром не надо. Причем запускаю "кубовский" проект смотрю частоты Options_for_target_"stm32f103c8", а там частота стоит32MHz - откуда она взялась вообще?? В кубе настроил все частоты четко: xtal:8 - sysclok:64 и т.д.
может в KAIL есть еще настройки которые нужно впечатать? кроме:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// <h> Clock Configuration    // RTE_device.h
//   <o> High-speed Internal Clock <1-999999999>
#define RTE_HSI                         8000000
//   <o> High-speed External Clock <1-999999999>
#define RTE_HSE                         8000000
//   <o> System Clock <1-999999999>
#define RTE_SYSCLK                      64000000
//   <o> HCLK Clock   <1-999999999>
#define RTE_HCLK                        32000000
//   <o> APB1 Clock   <1-999999999>
#define RTE_PCLK1                       32000000
//   <o> APB2 Clock   <1-999999999>
#define RTE_PCLK2                       2000000
//   <o> ADC Clock    <1-999999999>
#define RTE_ADCCLK                      1000000
//       USB Clock
#define RTE_USBCLK                      48000000
// </h>
C
1
2
3
4
5
6
7
8
9
10
11
12
//system_stm32f10x.c
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
// #define SYSCLK_FREQ_HSE    HSE_VALUE 
 #define SYSCLK_FREQ_24MHz  24000000
#else
    #define SYSCLK_FREQ_HSE    HSE_VALUE 
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
// #define SYSCLK_FREQ_72MHz  64000000
#endif
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2020, 09:40
Помогаю со студенческими работами здесь

Сброс настроек тактирования
При отладке (SWD,ST-Link) кода (Keil 4.23) на плате дискавери (камень - stm32f100rb) выявил вот такю историю: До выполнения указанного...

Настройка тактирования STM32F103
Доброго времени суток. Пытаюсь разобраться с тактированием STM32F103. Пишу код, вроде все верно: ...

Частота тактирования ядра
Здравствуйте. Пытаюсь использовать мк stm32f103c8t6. Как полный чайник хочу прояснить для себя один момент. Насколько я понимаю, по...

STM32 Система тактирования
Здравствуйте. Решил вот освоить контроллеры STM32. Имеется контроллер STM32F103C8T6 и минимальная разводочка к ней. С системой...

Что такое инициализация сегментов или инициализация регистров?
Подскажите, что такое инициализация сегментов или инициализация регистров? Вот строчка программы из ассемблера: mov Ax, DATA mov DS, AX


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru