|
Проблема с тактовой частотой., STM32F103RBT6 |
|
|
|
Oct 16 2013, 05:27
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Привет всем. Выставляю тактовую частоту -72Мгц. CODE void SysClockInit(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* Configuration SYSCLK, HCLK, PCLK2 и PCLK1 ---------------------------*/ /* Switch on HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait for HSE ready bit or timeout*/ do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while( (HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); if ( (RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } /* if HSE started good */ if ( HSEStatus == (uint32_t)0x01) { /* Включаем буфер предвыборки FLASH */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* Конфигурируем Flash на 2 цикла ожидания */ /* Это нужно потому, что Flash не может работать на высокой частоте */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; /* Конфигурируем множитель PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ /* При условии, что кварц на 8МГц! */ /* RCC_CFGR_PLLMULL9 - множитель на 9. Если нужна другая частота, не 72МГц */ /* то выбираем другой множитель. */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); /* Switch on PLL */ RCC->CR |= RCC_CR_PLLON; /* wait for PLL ready bit */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* choose PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Ожидаем, пока PLL выберется как источник системной частоты */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } } else { /* All is bad... HSE didn't turn on... Something wrong... If we are here our source is HSI! */ } //return HSEStatus; }
Настраиваю MCO Pin чтобы видеть частоту. CODE void McoPinInit(void) { //RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Подаем тактирование на порт GPIOA->CRH &= ~GPIO_CRH_CNF8; // Сбрасываем биты CNF для бита 8. Режим 00 - Push-Pull GPIOA->CRH |= GPIO_CRH_CNF8_1; // Ставим режим для 8 го бита режим CNF = 10 (альтернативная функция, Push-Pull) GPIOA->CRH &=~GPIO_CRH_MODE8; // Сбрасываем биты MODE для бита 8 GPIOA->CRH |= GPIO_CRH_MODE8_1 | GPIO_CRH_MODE8_0; // Выставляем бит MODE для пятого пина. Режим MODE11 = Max Speed 50MHz RCC->CFGR &=~(RCC_CFGR_MCO); // Обнуляем MCO //RCC->CFGR |=RCC_CFGR_MCO_PLL; // Выставлем для MCO сигнал с PLL/2 RCC->CFGR |=RCC_CFGR_MCO_SYSCLK; // Выставляем для МСО сигнал с SYSCLK }
Вижу на скопе частоту 24Мгц вместо 72Мгц. Что я делаю не так?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Oct 20 2013, 05:58
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
изменил опцию MCO пина - чтоб выдавал PLL/2 Код RCC->CFGR |=RCC_CFGR_MCO_PLL; на скопе вижу 12Мгц т.е. 24/2. что то не так, а что не могу понять.
Сообщение отредактировал Jenya7 - Oct 20 2013, 05:59
|
|
|
|
|
Oct 22 2013, 07:21
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
я так понимаю, что STM32F103RBT6 это Medium-density performance line. в stm32f10x.h выставляю Код #define STM32F10X_MD /*!< STM32F10X_MD: STM32 Medium density devices */ это приводит нас к #define SYSCLK_FREQ_72MHz 72000000 так как в system_stm32f10x.h определено Код #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 //original //#define SYSCLK_FREQ_72MHz 72000000 #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 72000000 #endif но SystemInit почему то приводит нас к SetSysClockTo24() вместо SetSysClockTo72() но даже при всем при этом моя функция SysClockInit() должна переписать частоту по идее.
|
|
|
|
|
Oct 22 2013, 09:41
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(ViKo @ Oct 22 2013, 14:20)  А вы свою функцию вызываете? конечно Код int main(void) { SysClockInit(); //первым делом натроить частоту PeriphClockInit(); UsartInit(); DWT_Init(); GpioInit(); McoPinInit(); while(1) { } }
|
|
|
|
|
Oct 23 2013, 06:03
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-01-09
Пользователь №: 43 172

|
Цитата(Jenya7 @ Oct 22 2013, 13:41)  конечно Код int main(void) { SysClockInit(); //первым делом натроить частоту PeriphClockInit(); UsartInit(); DWT_Init(); GpioInit(); McoPinInit(); while(1) { } } SysClockInit() вызывается до main, если вы не переписали стандартный startup
|
|
|
|
|
Oct 23 2013, 06:29
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-01-09
Пользователь №: 43 172

|
Цитата(Jenya7 @ Oct 23 2013, 10:15)  SysClockInit() - это уже моя функция,сначала как я понимаю выполняется стартаповский SystemInit () который делает то что делает, а потом я запускаю свою функцию. Сорь, перепутал название функции. Но стандартный SystemInit () сам настраивает тактовую частоту, взависимости от значения SYSCLK_FREQ_xxx (файл system_stm32f10x.c)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|