(stm32f030f4p6) Глюки с TIM14

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

(stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Всем привет! Прошу вашей помощи. Проблема в чём. Использую 14-й таймер для генерации ШИМ. В данном случае для регулировки яркости подсветки. Спотыкаюсь тут на простейших, казалось бы, вещах.
Проблема в том, что при активации прерывания по таймеру, контроллер начинает глючить. Это проявляется в таких вещах:
1) прошивка контроллера (по SWD) виснет на этапе заливки. При этом вроде как виснет само ядро и не отвисает после прекращения прошивки. Если повторно начать шить, то всё проходит успешно.
2) перестаёт работать само прерывание от таймера. Точнее работоспособность его зависит от фазы луны. Например, оно может не работать, непосредственно после пеерепрошивки, но если переподцепить питание контроллера, то оно начинает работать. Или стабильно не работает, если добавить несколько строчек кода. При том сам счётчик считает.
При этом если как либо предотвратить вызов прерывания, то этот глюк пропадает (запретить перерывание в DIER или NVIC или же не сбрасывать его регистр SR в самом прерывании, но при этом оно вызывается только один раз). Так и не смог разобраться в чём дело. Под спойлером мой код.

Спойлер

Код: Выделить всё

/*
 ======================
 Name        : main.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C
 ======================
 */

#include <stm32f0xx.h>
#include "system.h"

int main(void)
{
    initialize(); // Инициализация

    while(1)
    {
        lightStreth=(30<<8);
        for(int r=0; r<1000000; r++);
        //lightStreth=(50<<8); // Если разкомментировать, не работает прерывание
        //for(int r=0; r<1000000; r++);
    };

  return 0;
}

Код: Выделить всё

/*
 * system.c
 *
 *  Created on: 04 июля 2015 г.
 *      Author: ifor
 */
#ifndef SYSTEM_H
#define SYSTEM_H

#include <stm32f0xx.h>
#include <stdint.h>

uint16_t lightStreth = 0;

void initialize()
{
 // Инициализация системы
    __enable_irq();
    NVIC_EnableIRQ(TIM14_IRQn); // Размаскировываем прерывание TIM14

    // Включение тактирование переферии
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;

    // Настройка тактирования от внутреннего генератора на 48 МГц
    // Проверяем, не включени ли у нас умножитель (PLL)?
    if (RCC->CR & RCC_CR_PLLON)
    {    // Переключаемся на подачу тактирования в обход PLL и выключаем его
        RCC->CFGR &= ~RCC_CFGR_SW;
        while ((RCC->CFGR & RCC_CFGR_SWS) ^ RCC_CFGR_SWS_HSI); // Ждём переключения
        RCC->CR &= ~RCC_CR_PLLON;
    }
    RCC->CFGR = RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE_DIV1;
    // Пытаемся включить умножитель частоты на 16
    RCC->CR |= RCC_CR_PLLON;
    while (!(RCC->CR & RCC_CR_PLLRDY)); // Ждём устойчивого состояния умножителя
    // Переключаем тактирование от умножителя
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while ((RCC->CFGR & RCC_CFGR_SWS) ^ RCC_CFGR_SWS_PLL); // Ожидание переключения на умножитель
    // ---------- С этого момента частота тактирования 48 МГц ----------


    // Настройка GPIO
    // Сброс выходов
    GPIOB->ODR = 0;

    // Подсветка экрана, TIM14
    GPIOB->MODER = GPIO_MODER_MODER1_1; // Альтернативный функционал
    GPIOB->OSPEEDR = GPIO_OSPEEDER_OSPEEDR1;
    GPIOB->AFR[0] = 0; // Переключаем вывод на выход CH1 TIM14



    // Настрока TIM14 на ШИМ
    //RCC->APB1RSTR |= RCC_APB1RSTR_TIM14RST;
    //RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM14RST;
    TIM14->CR1 = TIM_CR1_ARPE; // Включаем буфферизацию ARR
    TIM14->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // Выбираем 1-й режим ШИМ
    TIM14->EGR = TIM_EGR_UG; // Включаем генерацию события по обновлению
    TIM14->CCER = TIM_CCER_CC1E; // Направление счёта
    TIM14->ARR = 0xFFFF; // Определяем частоту ШИМ
    TIM14->CCR1 = 0x0000;
    TIM14->CNT = 0;
    TIM14->PSC = 11;
    TIM14->DIER = TIM_DIER_UIE; // Прерывание по обновлению
    TIM14->CR1 |= TIM_CR1_CEN;
    //TIM14->SR &= ~(TIM_SR_UIF | TIM_SR_CC1IF);
}

void setLight(uint16_t value)
{
    // Установить яркость. 1 байт после запятой. От 0 до 100
    const uint16_t table[102] =
    {
            0, 383, 770, 1162, 1557, 1955, 2358, 2765, 3177, 3592, 4011, 4435, 4863, 5295,
            5731, 6172, 6618, 7067, 7522, 7981, 8444, 8912, 9385, 9863, 10345, 10833, 11325,
            11822, 12324, 12831, 13344, 13861, 14384, 14911, 15445, 15983, 16527, 17077,
            17631, 18192, 18758, 19330, 19908, 20491, 21080, 21675, 22276, 22884, 23497,
            24116, 24742, 25374, 26012, 26657, 27308, 27966, 28631, 29302, 29979, 30664,
            31355, 32054, 32759, 33472, 34192, 34919, 35653, 36394, 37144, 37900, 38664,
            39436, 40216, 41003, 41799, 42602, 43414, 44233, 45061, 45897, 46742, 47595,
            48457, 49327, 50206, 51094, 51991, 52897, 53811, 54736, 55669, 56612, 57564,
            58526, 59497, 60479, 61470, 62471, 63482, 64503, 65535
    
}; // Экспонентациальная таблица

    if (value > (100<<8)) value = (100<<8);

    if (value == (100<<8)) TIM14->CCR1 = 0xFFFF;
    uint16_t k = (value&0x00FF);
    uint16_t c = (value>>8);
    TIM14->CCR1 = (((uint32_t)table[c]*(0xFF-k) + (uint32_t)table[c+1]*k) >> 8);
}

void TIM14_IRQHandler()
{
    // Вводим инерционность
    const int k = 5;
    static uint32_t o = 0;
    static uint32_t i = 0;
    static uint32_t i1 = 0;

    i = lightStreth;
    o = (((0xFF-2*k)*+ k*(i+i1))>>8);
    i1 = i;

    setLight(o);
    TIM14->SR &= ~TIM_SR_UIF;
}



#endif
 
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение scorpi_0n »

Я не силён в STM32 но мне кажется что у вас не настроен Flash. Waitstate и Prefetch в частности.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

На 48 МГц вроде как не нужны дополнительные задержки. Да и проблема никак не меняется, если выставить частоту 8 МГц. Или это какие то другие настройки?

Проверил. Действительно, на 48 МГц нужен один цикл задержки. Попробую активировать предвыборку с этой задержкой.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Добавил строчку в самом начале инициализации

Код: Выделить всё

FLASH->ACR |= FLASH_ACR_PRFTBE


К сожалению, ничего не изменилось. При прошивке процесс виснет на строчке "Successfully loaded flash loader in sram", а потом валится. Если сразу повторно начать шить, то всё проходит успешно.

Код: Выделить всё

Flash page at addr: 0x08000000 erased
2015-11-02T13:59:21 INFO src/stlink-common.c: Successfully loaded flash loader in sram
2015-11-02T14:00:21 ERROR src/stlink-common.c: flash loader run error
2015-11-02T14:00:21 ERROR src/stlink-common.c: run_flash_loader(0x8000000) failed! == -1
2015-11-02T14:00:21 ERROR gdbserver/gdb-server.c: cannot send: -2
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение scorpi_0n »

Попробуйте передвинуть сброс флага прерывания вверх обработчика прерываний после объявления переменных. Пишут что флаг в конце прерывания не всегда успевает сбрасываться.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Не помогает. :(
Хотя, даже не знаю. Конкретно сейчас вроде как проблема с неработоспособностью при добавлении кода пропала. По всей видимости тут действительно ошибка в ненастройки FLASH. Но остальное осталось: таймер начинает нормально работать только после переподключения питания. И прошивается только со второго раза при включённом таймере (пробовал сбрасывать таймер перед инициализацией - не помогает). Вроде бы как бы не критично, но так ведь не должно быть.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение oleg110592 »

для настройки тактирования обычно в проектах для STM32F0 используется файл system_stm32f0xx.c, функция настройки тактирования из которого вызывается в ассемблерном стартап файле.
Еще бросилось в глаза - зачем разрешение прерывания от таймера 4 сделано перед настройкой оного - в примерах обычно после.
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение Galizin »

Через ненастройку FLASH я тоже прошел. Наблюдалась нестабильная работа. После установки префетча и wait state заработало как часы.
FLASH->ACR |= FLASH_ACR_LATENCY|FLASH_ACR_PRFTBE;// 1 wait state + prefetch

По поводу таймера
TIM14->EGR = TIM_EGR_UG; // Включаем генерацию события по обновлению
Вот здесь по моему неправильный коментарий. Это генерация события обновления ручками, что бы все изменения вступили в силу. Соотвественно все настройки что идут далее ьудут применены только при следующем UPD event. Эта строчка должны быть где то в самом конце перед прерываниями и включением.

TIM14->CCER = TIM_CCER_CC1E; // Направление счёта
Здесь тоже комментарий неверный. Просто включаем модуль CC1.

Можно выбросить все лишнее. Начать с голого рабочего кода ШИМ. Например такого
TIM14->ARR = 0xffff;
TIM14->CCR1 = 23;
TIM14->CCMR1 = TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_2; //pwm 1 at PWMOUT (PA7)
TIM14->CCER = TIM_CCER_CC1E;
TIM14->CR1 |= TIM_CR1_CEN;
А потом бы прибавлять бы туда поэтапно прерывание, обновление по событию, собственно обновление и т.д.

p.s.
Что бы комфортно отлаживаться добавьте в начало что то типа
DBGMCU->APB2FZ |= DBGMCU_APB2_FZ_DBG_TIM1_STOP|DBGMCU_APB1_FZ_DBG_TIM14_STOP;
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

2oleg110592, у меня не настраивается тактирование в стартап-файле. Там у меня там только настройка кеша, инициализация данных в ОЗУ. А про разрешение прерывание - это тут не важно. Последний раз её положение оказалось тут.

Galizin писал(а):Вот здесь по моему неправильный коментарий. Это генерация события обновления ручками, что бы все изменения вступили в силу.

Кстати да, действительно. TIM_EGR_UG - это принудительный вызов события.

Galizin писал(а):Здесь тоже комментарий неверный. Просто включаем модуль CC1.

Да не, верный. Это я просто так написал. У меня направление счёта прямое, а отвечающий за это флаг должен быть нулевой. А активация это по ходу приписано.

Спасибо за совет! Буду пробовать мусолить дальше код.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Ньда... Активировал DMA для перекидывания данных из АЦП в ОЗУ и вывода на экран. Если переподключить питание к устройству, то всё работает отлично. Прерывание вырабатывается, данные переносятся, изображение прорисовывается.
Однако стоит начать шить, как процесс зависает на том же месте как и раньше. Да только если повторно начать шить, процесс так же стопорится, что не происходило при отсутствии DMA.
Чтобы всё таки залить новую прошивку, приходится теперь выполнить следующие действия:
1) Начать прошивку. Процесс прошивки зависнет, но FLASH при этом очищается. DMA продолжает сам по себе работать и не пускать к прошивки.
2) Перетыкаем питание устройства. Т.к. FLASH в этот момент пустой, то устройство ничего не делает. DMA и прерывания не работают.
3) Опять начать прошивку. Всё проходит отлично.
4) Получить устройство с работающим DMA. Т.е. всё функционирует правильно, кроме прерывания от таймера.
5) Перетыкаем ещё раз питание. Получаем полностью работающее устройство с DMA и прерыванием.

Что же это вообще такое происходит? Сама по себе переферия (TIM14, ADC) работает отлично и не влияет про процесс прошивки. Всё считается, всё преобразовывается. Перестаю работать именно прерывания и DMA. А точнее, они как-то конфликтуют с процессом прошивки по SWD.
Возможно ли, что это брак? Сам в это не особо верю, скорее где-то сам туплю. Раньше замена МК на новый не давало никакой разницы.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Решил заменить МК. Заменил. Результат: первая прошивка проходит хорошо, но после неё устройство совсем неработоспособно. На экранчике происходит какая-то ахинея, подсветка просто горит немного. И дальнейшей прошивке МК противится напрочь. Не доходит дело даже до заливки, просто сразу выдаёт ошибку, мигнув пару раз светодиодом. И ничего не помогает, даже если удерживать ресет и отпустить его во время прошивки. Впаял ещё один - примерно то же самое.
Кажется, у меня на генном уровне заведено несродство с контроллерами STM32. Когда у других всё отлично и они никогда не ловят на нём глюки, у меня же всё совсем наоборот. Сразу же огребаю глюков на ровном месте. То гиперчувствительность МК к прикосновению, то это невесть что теперь. И ведь на AVR-ках никогда подобного просто так не было. Чувствую себя ущербным после такого. :facepalm:
Ладно, возможно, у меня после перепайки загрязнилась плата. Попробую как нибудь её проверить, почистить и перепаять всё.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение Galizin »

Проверьте еще раз
FLASH->ACR |= FLASH_ACR_LATENCY|FLASH_ACR_PRFTBE;// 1 wait state + prefetch
Попробуйте запустить под отладчиком.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

2Galizin, да, спасибо. Я установил 1 цикл ожидания, но всё одно и то же. Кстати, нашёл проблему страшного зависона. Почему-то контроллер наглухо виснет, когда я пытаюсь активировать внутренний генератор HSI14 для АЦП. Именно на этой строчке:

Код: Выделить всё

RCC->CR2 |= RCC_CR2_HSI14ON;


Если не запускать его, то остальное работает нормально как и работало, только, соответственно АЦП не работает. Но смена МК проблему со странным поведением прерываний (и, судя по всему, DMA) не исправило. Всё по прежнему конфликтуют они с процессом прошивки.

На данный момент у меня такой код инициализации. Вызывается самым первым в main().
Спойлер

Код: Выделить всё

void initialize()
{
 // Инициализация системы
    FLASH->ACR |= FLASH_ACR_LATENCY|FLASH_ACR_PRFTBE; // Активирование предвыборки

    __enable_irq();

    // Настройка тактирования от внутреннего генератора на 48 МГц
    // Проверяем, не включени ли у нас умножитель (PLL)?
    if (RCC->CR & RCC_CR_PLLON)
    {    // Переключаемся на подачу тактирования в обход PLL и выключаем его
        RCC->CFGR &= ~RCC_CFGR_SW;
        while ((RCC->CFGR & RCC_CFGR_SWS) ^ RCC_CFGR_SWS_HSI); // Ждём переключения
        RCC->CR &= ~RCC_CR_PLLON;
    }
    RCC->CFGR = RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE_DIV1;
    // Пытаемся включить умножитель частоты на 12
    RCC->CR |= RCC_CR_PLLON;
    while (!(RCC->CR & RCC_CR_PLLRDY)); // Ждём устойчивого состояния умножителя
    // Переключаем тактирование от умножителя
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while ((RCC->CFGR & RCC_CFGR_SWS) ^ RCC_CFGR_SWS_PLL); // Ожидание переключения на умножитель
    // ---------- С этого момента частота тактирования 48 МГц ----------

    //RCC->CR2 |= RCC_CR2_HSI14ON;
    //while (!(RCC->CR2 & RCC_CR2_HSI14RDY));

    // Включение тактирование переферии
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_DMA1EN ;
    RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;
    RCC->APB2ENR |= RCC_APB2ENR_TIM16EN | RCC_APB2ENR_ADC1EN;

    // Настройка GPIO
    // Сброс выходов
    GPIOA->ODR = 0;
    GPIOB->ODR = 0;

    // Подсветка экрана, TIM14
    GPIOB->MODER = GPIO_MODER_MODER1_1; // Альтернативный функционал
    GPIOB->OSPEEDR = GPIO_OSPEEDER_OSPEEDR1;
    GPIOB->AFR[0] = 0; // Переключаем вывод на выход CH1 TIM14
    // Шина с дисплеем, аналоговые входы
    GPIOA->MODER |= GPIO_MODER_MODER10_0 | GPIO_MODER_MODER9_0 | GPIO_MODER_MODER7_0 | GPIO_MODER_MODER6_0 | GPIO_MODER_MODER5_0 |
                   GPIO_MODER_MODER0 | GPIO_MODER_MODER1 | GPIO_MODER_MODER2 | GPIO_MODER_MODER3 | GPIO_MODER_MODER4;
    GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR5;



    // Настрока TIM14 на ШИМ
    NVIC_EnableIRQ(TIM14_IRQn); // Размаскировываем прерывание TIM14
    TIM14->ARR = 0xFFFF; // Определяем частоту ШИМ
    TIM14->CCR1 = 0x0002;
    TIM14->PSC = 10;
    //TIM14->CR1 = TIM_CR1_ARPE; // Включаем буфферизацию ARR
    TIM14->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // Выбираем 1-й режим ШИМ
    TIM14->CCER = TIM_CCER_CC1E; // Направление счёта
    TIM14->DIER = TIM_DIER_UIE; // Прерывание по обновлению
    //TIM14->EGR = TIM_EGR_UG; // Генерацию события обновлению
    TIM14->CR1 |= TIM_CR1_CEN;

    // Таймер для задержек
    TIM16->CR1 = TIM_CR1_OPM;
    TIM16->EGR = TIM_EGR_UG;
    TIM16->PSC = 48;
}
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение Galizin »

у меня под отладчиком работает. вот проект. Добавил 2 строчки для отладки таймеров. На всякий случай + hex
Вложения
tmp.hex
(6.4 КБ) 615 скачиваний
tmp.rar
(18.2 КБ) 224 скачивания
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

Под отладчиком - это имеется ввиду в эмуляторе? Так проблема, судя по всему, железного плана. Тут то у меня железная отладка.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение oleg110592 »

IfoR писал(а):Почему-то контроллер наглухо виснет, когда я пытаюсь активировать внутренний генератор HSI14 для АЦП. Именно на этой строчке:

Код: Выделить всё

RCC->CR2 |= RCC_CR2_HSI14ON;

из документации:
The HSI 14 MHz RC oscillator cannot be turned on by ADC interface when the APB clock is selectedas an ADC kernel clock.

из примера от производителя:

Код: Выделить всё

__INLINE void SetClockForADC(void)
{
  /* (1) Enable the peripheral clock of the ADC */
  /* (2) Start HSI14 RC oscillator */
  /* (3) Wait HSI14 is ready */
  RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; /* (1) */
  RCC->CR2 |= RCC_CR2_HSI14ON; /* (2) */
  while ((RCC->CR2 & RCC_CR2_HSI14RDY) == 0) /* (3) */
  {
    /* For robust implementation, add here time-out management */
  } 
}
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

2oleg110592, действительно. Спасибо! Поправлю.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение Galizin »

Я проверял в железе. Правда к железу ничего не было подключено, я имею ввиду светодиодов и т.д.. Пару-тройку раз он в прерывание таймера ввалился причем в нужное время, дальше не смотрел.
Да. Я еще выкинул код который нагенерился автоматически и от стартапа оставил несколько строчек всего. Стартап тоже в проекте.
Если и есть проблемы то не только у Вас
http://forum.chibios.org/phpbb/viewtopi ... =16&t=2595
Решения на сайте нет.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение pixar »

работоспособность его зависит от фазы луны.

Так может в питании всё дело?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: (stm32f030f4p6) Глюки с TIM14

Сообщение IfoR »

А это нормально, что когда у меня начинает глючить камень, т.е. когда активирую ADC+DMA, у меня на ножке NRST появляются колебания? Мерил мультиметром, по его показаниям частота колебаний составляет 300 Гц амлитудой от 0 до 3.3 В. Такая фигня появляется только когда пытаюсь включить ADC+DMA. В ином случае на этой ножке ровно 3.3 Вольта. Проверял, вроде как этот вывод не замыкается в другими выводами. Ради эксперимента пробовал повесить на сбросовой цепочке сопротивление не 10 кОм, а 1 кОм - то же самое. Выходит, МК сам себя сбрасывает?
Колебания появляются ровно после выполнения строчки

Код: Выделить всё

ADC1->CR |= ADC_CR_ADEN

Пробовал выносить инициализацию DMA до запуска АЦП. Так DMA запускается нормально, но как только пытаюсь активировать АЦП - зависон. Кстати, я теперь не включаю вообще HSI12 а тактирую от системной частоты, поделённой на 4.

2pixar, питание ровно 3.31 Вольт держится постоянно.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Ответить

Вернуться в «ARM»