1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено STM32L проблемы с тактированием

Тема в разделе "STM8/STM32", создана пользователем radioengineer, 2 июн 2017.

  1. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.552
    Симпатии:
    352
    Адрес:
    Алматы
    Не могу на STM32L151C8T6 установить частоту тактирования хотя бы 24МГц, если устанавливаю то получаю в отладчике ошибку "Cannot access memory" и все выполнение программы останавливается, более низкие частоты устанавливаются без проблем. Вот моя схема тактирования:

    STM32CubeMX W_BOARD.ioc STM32L151C8Tx.jpg

    Внешний кварцевый резонатор 8МГц Abracon, ставил такие на F серию и никогда никаких проблем не было с ними.
     
  2. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.552
    Симпатии:
    352
    Адрес:
    Алматы
    Проверил сейчас от внутреннего источника тактирования заводить и все без проблем работает, похоже таки проблема в моем кварце.
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.552
    Симпатии:
    352
    Адрес:
    Алматы
    Нашел причину своей проблемы с тактированием как я думал. По умолчанию FLASH память контроллера работает на частотах не выше 16МГц, поэтому прежде чем повышать частоту работы процессора, необходимо переконфигурировать FLASH.

    [​IMG]

    PHP:
    FLASH->ACR |= FLASH_ACR_LATENCY;
    FLASH->ACR |= FLASH_ACR_PRFTEN;
    Включаем упреждающее чтение и увеличиваем количество циклов ожидания для более высокой частоты работы устройства.
    Кстати, точно также работает и F4 серия микроконтроллеров STM32. Вот таблица FLASH LATENCY для различных частот и напряжений питания:

    [​IMG]

    Вот пример инициализации тактирования для F4:

    PHP:
    if (RCC_SYSCLKSOURCE_PLLCLK) {                        // Если используется PLL как источник SYSCLK
            
    RCC->CR   |=  RCC_CR_PLLON;                        // Включить PLL
            
    while (!(RCC->CR RCC_CR_PLLRDY)) {}            // Ждем пока PLL генератор не станет стабилен
           
                // Увеличиваем количество циклов ожидания для более высокой частоты процессора
            
    FLASH->ACR |= FLASH_ACR_LATENCY;
            
    FLASH->ACR |= FLASH_ACR_PRFTEN;
               
            
    // Переключиться на PLL в качестве источника SYSCLK
            
    RCC->CFGR &= ~RCC_CFGR_SW;                        // Очистка битов выбора источника тактового сигнала SYSCLK
            
    RCC->CFGR |=  RCC_CFGR_SW_PLL;                    // Выбираем PLL источником системной тактовой частоты
            
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) {}    // Ожидаем, пока PLL выберется как источник системной частоты
        
    }

Поделиться этой страницей