Например TDA7294

Форум РадиоКот • Просмотр темы - Мигать светодиодом. ARM или не-ARM?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 14:02:38

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3623 ]     ... , , , 79, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 16:52:50 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
TIM3 так изначально и планировал. Все ж из двух оставшихся 16 битных таймеров сделал 32 битный - раз есть такая возможность - надо попробовать, упрощает ж все. Частотомер удался, только протеус в конце подкачал - на высоких частотах тормозит, не измеряет, на низких измеряет. В принципе протеусом что-то можно посимулировать, все остальное надо в железе (лучше сразу, как подсказали).
Задаем частоту входную 1005Гц:
Изображение
Измеряем нашим частотомером:
Изображение
софтик:
Спойлер
Код:
#include "stm32f103x6.h"
#include "hd44780_driver.h"

volatile uint32_t msTicks;                                 // counts 1ms timeTicks
volatile uint32_t cntValue;
volatile uint8_t flagEndMeasure = 0;
char asc[20];

extern void Delay (uint32_t dlyTicks);
/*----------
 * SysTick_Handler:
 *----------*/
void SysTick_Handler(void)
{
    msTicks++;
}

/*----------
 * Delay: delays a number of Systicks
 *----------*/
void Delay (uint32_t dlyTicks)
{
    uint32_t curTicks;

    curTicks = msTicks;
    while ((msTicks - curTicks) < dlyTicks)
    {
        __NOP();
    }
}

void itoa1(uint32_t binval)
{
    uint32_t temp, val;
    uint8_t binc, atemp;
    val = binval;
    atemp = '0';
    temp = 1000000;
    while (val >= temp)
    {
        atemp++;
        val -= temp;
    }
    *(asc + 0) = atemp;
    atemp = '0';
    temp = 100000;
    while (val >= temp)
    {
        atemp++;
        val -= temp;
    }
    *(asc + 1) = atemp;
    atemp = '0';
    temp = 10000;
    while (val >= temp)
    {
        atemp++;
        val -= temp;
    }
    *(asc + 2) = atemp;
    atemp = '0';
    temp = 1000;
    while (val >= temp)
    {
        atemp++;
        val -= temp;
    }
    *(asc + 3) = atemp;
    atemp = '0';
    temp = 100;
    while (val >= temp)
    {
        atemp++;
        val -= temp;
    }
    *(asc + 4) = atemp;
    atemp = '0';
    binc = (char) val;
    while (binc >= 10)
    {
        atemp++;
        binc -= 10;
    }
    *(asc + 5) = atemp;
    binc += '0';
    *(asc + 6) = binc;
}

void InitTimers()
{
    TIM3->ARR = 1000-1; //1000
    TIM3->PSC = 8000-1; //8000000/8000 = 1000
    TIM3->CR2 |= TIM_CR2_MMS_0; //Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is
//useful to start several timers at the same time or to control a window in which a slave timer is
//enabled. The Counter Enable signal is generated by a logic OR between CEN control bit
//and the trigger input when configured in gated mode.
//When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO,
//except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR
//register).
    TIM3->DIER |= TIM_DIER_UIE; // Update interrupt enabled
    TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_OPM; //Counter used as downcounter
//Counter stops counting at the next update event (clearing the bit CEN) Counter enabled

    TIM1->PSC = 0;
   TIM1->ARR = 0xFFFF;
    TIM1->SMCR |= TIM_SMCR_ETF_1; // External trigger filter
//This bit-field then defines the frequency used to sample ETRP signal and the length of the
//digital filter applied to ETRP. The digital filter is made of an event counter in which N
//consecutive events are needed to validate a transition on the output: 0010: fSAMPLING=fCK_INT, N=4

    TIM1->SMCR |= TIM_SMCR_ECE | TIM_SMCR_TS_1; //External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF
//002: Internal Trigger 2 (ITR2) TIM3_TRGO

    TIM1->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_2; //101: Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The
//counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of
//the counter are controlled.

    TIM1->CR2 |= TIM_CR2_MMS_1; //010: Update - The update event is selected as trigger output (TRGO). For instance a master
//timer can then be used as a prescaler for a slave timer.
    TIM1->CR1 |= TIM_CR1_CEN;

    TIM2->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0; //111: External Clock Mode 1 - Rising edges of the selected trigger (TRGI)
//clock the counter.

    TIM2->CR1 |= TIM_CR1_CEN;

    NVIC_EnableIRQ(TIM3_IRQn);
}

void TIM3_IRQHandler(void)
{
    TIM3->SR &= ~TIM_SR_UIF;
    cntValue = (uint32_t)TIM1->CNT | (uint32_t)TIM2->CNT << 16;
    flagEndMeasure = 1;
    TIM2->CNT=0;
    TIM1->CNT=0;
    TIM3->CR1 |= TIM_CR1_CEN;
}

int main(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN;
    GPIOA->CRL |=  (GPIO_CRL_MODE0_1 |
                    GPIO_CRL_MODE1_1 |
                    GPIO_CRL_MODE2_1 |
                    GPIO_CRL_MODE3_1 |
                    GPIO_CRL_MODE4_1 |
                    GPIO_CRL_MODE5_1 |
                    GPIO_CRL_MODE6_1 |
                    GPIO_CRL_MODE7_1 );
    GPIOA->CRH |=  (GPIO_CRH_MODE8_1 |
                    GPIO_CRH_MODE9_1 |
                    GPIO_CRH_MODE10_1 |
                    GPIO_CRH_MODE12_1 |
                    GPIO_CRH_MODE12_0 );

    SysTick_Config(8000000UL / 1000);                  // SysTick 1 msec interrupts

    LCD(COM, 0x30);
    Delay(4);
    LCD(COM, 0x30);
    Delay(2);
    LCD(COM, 0x30);
    Delay(2);
    LCD(COM, 0x3C);
    Delay(2);
    LCD(COM, 0x0C);
    Delay(2);
    LCD(COM, 0x01);
    Delay(2);
    LCD(COM, 0x80);
    Delay(2);
    LCD_STRING("Frequency");
    LCD(COM, 0xC0);
    LCD_STRING("---------");

    InitTimers();

    while (1)
    {
        while(flagEndMeasure == 0);
        itoa1(cntValue);
        flagEndMeasure = 0;
        LCD(COM, 0xC0);
        LCD_STRING(asc);
        LCD_STRING("Hz");
        GPIOA->ODR ^=(uint16_t)(1<<10);
    }
}

заняло: Program Size: Code=928 RO-data=268 RW-data=12 ZI-data=1044
з.ы. "велосипед" заново изобретен, теперь меня возьмут на работу на частотомеропроизводящую фабрику :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 17:43:32 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 2
заняло: Program Size: Code=928 RO-data=268 RW-data=12 ZI-data=1044

Странная у тебя itoa1, обычно делают по-другому, так, например:
Код:
const char* u32ToStr(uint32_t val)
{
   static char buf[12];

   for (int i = 10; i >= 0; i--)
   {
      buf[i] = '0' + val % 10;
      val /= 10;
      if (!val) return buf + i;
   }
}

На 120 байт меньше по размеру и перекрывает весь диапазон чисел.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 18:03:56 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Reflector писал(а):
На 120 байт меньше по размеру и перекрывает весь диапазон чисел
и работать не будет. тоже мне, программист...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 18:13:07 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 1
Reflector писал(а):
На 120 байт меньше по размеру и перекрывает весь диапазон чисел
и работать не будет. тоже мне, программист...

Ты сначала проверь, тоже мне, критик :)


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 18:24:43 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
работает
Изображение
Спойлер
Код:
#include "stm32f103x6.h"
#include "hd44780_driver.h"

volatile uint32_t msTicks;                                 // counts 1ms timeTicks
volatile uint32_t cntValue;
volatile uint8_t flagEndMeasure = 0;
char asc[20];

extern void Delay (uint32_t dlyTicks);
/*----------
 * SysTick_Handler:
 *----------*/
void SysTick_Handler(void)
{
    msTicks++;
}

/*----------
 * Delay: delays a number of Systicks
 *----------*/
void Delay (uint32_t dlyTicks)
{
    uint32_t curTicks;

    curTicks = msTicks;
    while ((msTicks - curTicks) < dlyTicks)
    {
        __NOP();
    }
}

const char* u32ToStr(uint32_t val)
{
   static char buf[12];

   for (int i = 10; i >= 0; i--)
   {
      buf[i] = '0' + val % 10;
      val /= 10;
      if (!val) return buf + i;
   }
   return 0;
}

void InitTimers()
{
    TIM3->ARR = 1000-1; //1000
    TIM3->PSC = 8000-1; //8000000/8000 = 1000
    TIM3->CR2 |= TIM_CR2_MMS_0; //Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is
//useful to start several timers at the same time or to control a window in which a slave timer is
//enabled. The Counter Enable signal is generated by a logic OR between CEN control bit
//and the trigger input when configured in gated mode.
//When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO,
//except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR
//register).
    TIM3->DIER |= TIM_DIER_UIE; // Update interrupt enabled
    TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_OPM; //Counter used as downcounter
//Counter stops counting at the next update event (clearing the bit CEN) Counter enabled

    TIM1->PSC = 0;
   TIM1->ARR = 0xFFFF;
    TIM1->SMCR |= TIM_SMCR_ETF_1; // External trigger filter
//This bit-field then defines the frequency used to sample ETRP signal and the length of the
//digital filter applied to ETRP. The digital filter is made of an event counter in which N
//consecutive events are needed to validate a transition on the output: 0010: fSAMPLING=fCK_INT, N=4

    TIM1->SMCR |= TIM_SMCR_ECE | TIM_SMCR_TS_1; //External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF
//002: Internal Trigger 2 (ITR2) TIM3_TRGO

    TIM1->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_2; //101: Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The
//counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of
//the counter are controlled.

    TIM1->CR2 |= TIM_CR2_MMS_1; //010: Update - The update event is selected as trigger output (TRGO). For instance a master
//timer can then be used as a prescaler for a slave timer.
    TIM1->CR1 |= TIM_CR1_CEN;

    TIM2->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0; //111: External Clock Mode 1 - Rising edges of the selected trigger (TRGI)
//clock the counter.

    TIM2->CR1 |= TIM_CR1_CEN;

    NVIC_EnableIRQ(TIM3_IRQn);
}

void TIM3_IRQHandler(void)
{
    TIM3->SR &= ~TIM_SR_UIF;
    cntValue = (uint32_t)TIM1->CNT | (uint32_t)TIM2->CNT << 16;
    flagEndMeasure = 1;
    TIM2->CNT=0;
    TIM1->CNT=0;
    TIM3->CR1 |= TIM_CR1_CEN;
}

int main(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN;
    GPIOA->CRL |=  (GPIO_CRL_MODE0_1 |
                    GPIO_CRL_MODE1_1 |
                    GPIO_CRL_MODE2_1 |
                    GPIO_CRL_MODE3_1 |
                    GPIO_CRL_MODE4_1 |
                    GPIO_CRL_MODE5_1 |
                    GPIO_CRL_MODE6_1 |
                    GPIO_CRL_MODE7_1 );
    GPIOA->CRH |=  (GPIO_CRH_MODE8_1 |
                    GPIO_CRH_MODE9_1 |
                    GPIO_CRH_MODE10_1 |
                    GPIO_CRH_MODE12_1 |
                    GPIO_CRH_MODE12_0 );

    SysTick_Config(8000000UL / 1000);                  // SysTick 1 msec interrupts

    LCD(COM, 0x30);
    Delay(4);
    LCD(COM, 0x30);
    Delay(2);
    LCD(COM, 0x30);
    Delay(2);
    LCD(COM, 0x3C);
    Delay(2);
    LCD(COM, 0x0C);
    Delay(2);
    LCD(COM, 0x01);
    Delay(2);
    LCD(COM, 0x80);
    Delay(2);
    LCD_STRING("Frequency");
    LCD(COM, 0xC0);
    LCD_STRING("---------");

    InitTimers();

    while (1)
    {
        while(flagEndMeasure == 0);
        flagEndMeasure = 0;
        LCD(COM, 0xC0);
        LCD_STRING(u32ToStr(cntValue));
        LCD_STRING("Hz");
        GPIOA->ODR ^=(uint16_t)(1<<10);
    }
}

Program Size: Code=832 RO-data=268 RW-data=12 ZI-data=1036


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вт сен 12, 2017 19:05:54 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Reflector писал(а):
Ты сначала проверь, тоже мне, критик
мой косяк, признаю :dont_know:

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Ср сен 13, 2017 08:40:18 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
пока отвлечемся от частотомеров
Новый опорный дизайн электронного регулятора скорости для электродвигателей дронов от STMicroelectronics.
Новый опорный дизайн STEVAL-ESC001V1 электронного регулятора скорости для дронов предназначен для коммерческих разработок дронов начального уровня и может управлять любым трех-фазным бесколлекторным(вентильным) двигателем при питании от 6-элементного (22.2В) LiPo аккумулятора или любого эквивалентного источника питания с пиковым током до 30 А.
СпойлерИзображение

Дизайн STEVAL-ESC001V1 базируется на высокоэффективных MOSFET транзисторах STL160NS3LLH7 с низким сопротивлением канала, высокопроизводительном микроконтроллере ARM® Cortex®-M4 STM32F303CBT7 и высоковольтных драйверах L6398.

Новый опорный дизайн позволяет быстро начать разработку и запустить электродвигатель благодаря микропрограммному пакету STSW-ESC001V1, реализующему бездатчиковый векторный (FOC) алгоритм управления с измерением фазных токов, управлением скоростью и полным активным торможением.

Опорный дизайн может принимать команды от блока управления полетом через ШИМ сигналы, UART, CAN или I²C.

Схема опорного дизайна имеет цепи защиты (датчик температуры, защита от перегрузки по току и напряжению) и может питать от основной батареи другие электронные системы дрона (5 В, 0.5 А).

Микропрограммный пакет STSW-ESC001V1 может быть дополнен программным пакетом разработки STSW-STM32100 для качественной и быстрой оптимизации параметров управления электродвигателем. Векторный алгоритм ST бездатчикового управления гарантирует длительное время полета и оптимальный динамические характеристики.

STEVAL-ESC001V1 доступен для заказа. Дополнительную информацию можно получить на страничке продукта.
http://www.st.com/content/st_com/en/pro ... 001v1.html


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 15:54:08 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
начал схемку будущего частотомера набрасывать, у STM32F030F4P6 похоже ни один ETR вывод с таймеров не выведен, засада...
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 16:08:00 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 1
начал схемку будущего частотомера набрасывать, у STM32F030F4P6 похоже ни один ETR вывод с таймеров не выведен, засада...

F030F4 - это на самом деле F031F6, у него есть 32-бит таймер с ETR.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 16:54:38 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
F030F4 - это на самом деле F031F6

документы разные и f031 дороже


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 17:26:58 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 1
документы разные и f031 дороже

И что? Чипы отличаются только маркировкой и тем фактом, что дополнительная периферия скорее всего не тестировалась, но вероятность наткнуться на нерабочий таймер крайней мала, так что можно считать, что это полноценный F031.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 17:42:10 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
завтра в живую пощупаю таймер 32 битный F030F4 - платку на почте получу только...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 18:08:57 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
завтра в живую пощупаю таймер 32 битный F030F4 - платку на почте получу только...

Имей в виду, что latency там тоже можно выставлять больше документированных, иначе сильно не разгонишь. У меня работало на 96MHz при 2WS.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 19:44:40 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Reflector писал(а):
У меня работало на 96MHz при 2WS.
Согласно RM может быть только 001 - One wait state. :dont_know:
СпойлерИзображение
Вложение:
FLASH_ACR.png [69.71 KiB]
Скачиваний: 33


Т. е. 002 тоже поддерживается?
У меня F030F4 стабильно работал на 96 МГц и при 1WS. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Пт сен 15, 2017 20:31:39 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Согласно RM может быть только 001 - One wait state. :dont_know:
Т. е. 002 тоже поддерживается?
У меня F030F4 стабильно работал на 96 МГц и при 1WS. :)

У меня в коде точно 2WS, но сначала я тоже думал, что можно максимум 1WS и, насколько помню, при разгоне были проблемы. Сейчас запустил с 1WS, светодиод на 96MHz моргает, но это другой камень, другое питание и совсем простая программа... А выставить можно и 7WS, причем именно столько и будет, проверить можно измеряя таймером время выполнения какого-то кода с разными настройками латентности.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Сб сен 16, 2017 00:39:36 
Друг Кота

Карма: 20
Рейтинг сообщений: 228
Зарегистрирован: Пт сен 13, 2013 13:11:31
Сообщений: 6388
Рейтинг сообщения: 0
так что можно считать, что это полноценный F031.

В том, что это так, совсем не сложно убедиться любому желающему. Надо просто взять F030F4P6, создать в кубе проект для F031F6P6, заюзать периферию точно отсутствующую в F030 и наблюдать, как она работает, хоть в отладчике, хоть в реальном применении. И того, чем я реально пользовался, работают 32-битный таймер, PVD, бекап-регистры и 32к флеша.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Сб сен 16, 2017 15:52:23 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Тестирование дешевой китайской отладочной платы для STM32.
На плате припаян STM32F030F4P6 20 ног, ценой 0.50$ у китайцев если опт 50 шт., у нас в базарном лотке, не очень то в розницу и дороже. В STM32F030F4P6 по документации отсутствует 32 бит таймер. Но наш народ утверждает, что внутри такой же кристалл как и у STM32F031F6, а в нем есть 32 бит таймер, а еще флэша 32Кб, а не 16Кб и т.д.. Такой таймерок нам для частотомера пригодится - ну для любительского имхо можно использовать недокументированные возможности, а для профи не проблема - возьмем правильный кристалл.
Разницу между кристаллами смотрим на странице продукта у самого ST (корявый перевод):
Цитата:
STM32F0x0 Value line имеет высокую конкурентоспособность на традиционных 8-битных и 16-разрядных рынках и устраняет необходимость управления различными архитектурами и связанными с ними расходами на разработку. Если вашему устройству требуется периферийное устройство USB, теперь можно заказать MCU линии линии STM32F070.
Линия STM32F0x1 обеспечивает высокую интеграцию функций и охватывает широкий диапазон размеров и пакетов памяти, что обеспечивает гибкость для приложений, чувствительных к стоимости.


Будем, как всегда, согласно переименованной темы мигать светодиодом с помощью недокументированного таймера.
Напишем софтик, где функция задержки сделана на таймере TIM2 (напомню для испытуемого STM32F030F4P6 по документации он 16 бит). Проект конечно же для STM32F031F6, но подсовываем в отладку STM32F030F4P6. На плате присутствует светодиод на PA4 не на землю, а на питание, поэтому вывод сделаем open-drain. Тактирование настраиваем от штатного кварца 8МГц, PLL умножаем на 6 - пока родные 48МГц, latency = 1. Таймер должен посчитать 48000000 тактов - это имхо не 16-ти битное число.
Спойлер
Код:
#include "stm32f0xx.h"

void SystemInit(void)
{
    RCC->CR |= RCC_CR_HSEON;
    /* Wait till HSE is ready */
    while((RCC->CR & RCC_CR_HSERDY) != (RCC_CR_HSERDY));
    RCC->CR &= ~(RCC_CR_HSION);
    // This is potentially a dangerous function as it could
    // result in a system with an invalid clock signal - result: a stuck system
    // Set the PLL up
    // First ensure PLL is disabled
     RCC->CR &= ~RCC_CR_PLLON;
    while ((RCC->CR & RCC_CR_PLLRDY));
    // wait for PLL ready to be cleared
    // set PLL multiplier to 6 (yielding 48MHz)
    // Warning here: if system clock is greater than 24MHz then wait-state(s) need to be
    // inserted into Flash memory interface
    FLASH->ACR |= FLASH_ACR_LATENCY;
    // Turn on FLASH prefetch buffer
    FLASH->ACR |= FLASH_ACR_PRFTBE;
    RCC->CFGR &= ~(RCC_CFGR_PLLMUL_3 | RCC_CFGR_PLLMUL_2 | RCC_CFGR_PLLMUL_1 | RCC_CFGR_PLLMUL_0);
    RCC->CFGR |= (RCC_CFGR_SW_PLL | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL_2);
    // Need to limit ADC clock to below 14MHz so will change ADC prescaler to 4
    RCC->CFGR |= RCC_CFGR_ADCPRE;

    // Do the following to push HSI clock out on PA8 (MCO)
    // for measurement purposes.  Should be 8MHz or thereabouts (verified with oscilloscope)
    /*
            RCC->CFGR |= (RCC_CFGR_MCO_2 | RCC_CFGR_MCO_0);
            RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
            GPIOA->MODER |= GPIO_MODER_MODER8_1;
     */

    // and turn the PLL back on again
    RCC->CR |= RCC_CR_PLLON;
    // set PLL as system clock source
    RCC->CFGR |= RCC_CFGR_SW_1;
}

void Delay1s()
{
    TIM2->ARR = 48000000UL; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM2->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM2->CR1 |= TIM_CR1_CEN | TIM_CR1_OPM; //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM2->CR1 & TIM_CR1_CEN) != 0);
}

int main(void)
{
    // Power up PORTA, TIM2
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    GPIOA->MODER |= (GPIO_MODER_MODER4_0);    // make bit PA4 an output
   GPIOA->OTYPER |= GPIO_OTYPER_OT_4;      //Output open-drain

    for (;;)
    {
        GPIOA->ODR ^= GPIO_ODR_4;    // Toggle LED
        Delay1s();                   // Wait 1s
    }
}

Отладку производим с помощью китайского ST-link за 2.5$ это вам не Протеус (трудно понять, кто не пробовал) - на отладочной плате присутствует удобный разъем для подключения отладчика.
Светодиод правильно (на глаз) мигает.
О чудо - 16 бит таймер на самом деле 32 бит:
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Сб сен 16, 2017 16:53:13 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
oleg110592 писал(а):
Напишем софтик, где функция задержки сделана на таймере TIM2 (напомню для испытуемого STM32F030F4P6 по документации он 16 бит).
По документации его вообще нет. Как и нет "лишних" 16 КБ Flash (по документации 16 КБ, а в реальности 32 КБ).

oleg110592 писал(а):
О чудо - 16 бит таймер на самом деле 32 бит
Как писал выше, по документации TIM2 в F030 отсутствует. В документации на другие модели МК (например F031) он 32-ух битный.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Сб сен 16, 2017 17:35:13 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Цитата:
его вообще нет

Точно - спутал на радостях с TIM3 - в доке на F031 TIM2 и TIM3 в одном разделе. Тем более приятно обнаружить таймер, которого нет. 8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
СообщениеДобавлено: Вс сен 17, 2017 12:27:57 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Чт фев 16, 2012 19:00:11
Сообщений: 502
Рейтинг сообщения: 0
Цитата:
oleg110592 а еще флэша 32Кб, а не 16Кб и т.д.
у STM32F030F4P6 по факту тоже 32К флеша, т.е. у всей линейки 32F030 - один кристалл


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3623 ]     ... , , , 79, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Express, Fajustov, ssc, vovw, Валериевич и гости: 34


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y