Мигать светодиодом. ARM или не-ARM?

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

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
з.ы. "велосипед" заново изобретен, теперь меня возьмут на работу на частотомеропроизводящую фабрику :)
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3181621#p3181621"]заняло: Program Size: Code=928 RO-data=268 RW-data=12 ZI-data=1044[/uquote]
Странная у тебя 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 байт меньше по размеру и перекрывает весь диапазон чисел.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение ARV »

Reflector писал(а):На 120 байт меньше по размеру и перекрывает весь диапазон чисел
и работать не будет. тоже мне, программист...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3181685#p3181685"]
Reflector писал(а):На 120 байт меньше по размеру и перекрывает весь диапазон чисел
и работать не будет. тоже мне, программист...[/uquote]
Ты сначала проверь, тоже мне, критик :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

работает
Изображение
Спойлер

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

#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
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение ARV »

Reflector писал(а):Ты сначала проверь, тоже мне, критик
мой косяк, признаю :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

пока отвлечемся от частотомеров
Новый опорный дизайн электронного регулятора скорости для электродвигателей дронов от 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
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

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

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3183755#p3183755"]начал схемку будущего частотомера набрасывать, у STM32F030F4P6 похоже ни один ETR вывод с таймеров не выведен, засада...[/uquote]
F030F4 - это на самом деле F031F6, у него есть 32-бит таймер с ETR.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3183771#p3183771"]F030F4 - это на самом деле F031F6[/uquote]
документы разные и f031 дороже
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3183808#p3183808"]документы разные и f031 дороже[/uquote]
И что? Чипы отличаются только маркировкой и тем фактом, что дополнительная периферия скорее всего не тестировалась, но вероятность наткнуться на нерабочий таймер крайней мала, так что можно считать, что это полноценный F031.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

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

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3183843#p3183843"]завтра в живую пощупаю таймер 32 битный F030F4 - платку на почте получу только...[/uquote]
Имей в виду, что latency там тоже можно выставлять больше документированных, иначе сильно не разгонишь. У меня работало на 96MHz при 2WS.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

Reflector писал(а):У меня работало на 96MHz при 2WS.
Согласно RM может быть только 001 - One wait state. :dont_know:
СпойлерИзображение
FLASH_ACR.png
(69.71 КБ) 167 скачиваний
Т. е. 002 тоже поддерживается?
У меня F030F4 стабильно работал на 96 МГц и при 1WS. :)
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="Мурик",url="/forum/viewtopic.php?p=3183947#p3183947"]Согласно RM может быть только 001 - One wait state. :dont_know:
Т. е. 002 тоже поддерживается?
У меня F030F4 стабильно работал на 96 МГц и при 1WS. :)[/uquote]
У меня в коде точно 2WS, но сначала я тоже думал, что можно максимум 1WS и, насколько помню, при разгоне были проблемы. Сейчас запустил с 1WS, светодиод на 96MHz моргает, но это другой камень, другое питание и совсем простая программа... А выставить можно и 7WS, причем именно столько и будет, проверить можно измеряя таймером время выполнения какого-то кода с разными настройками латентности.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3183833#p3183833"]так что можно считать, что это полноценный F031.[/uquote]
В том, что это так, совсем не сложно убедиться любому желающему. Надо просто взять F030F4P6, создать в кубе проект для F031F6P6, заюзать периферию точно отсутствующую в F030 и наблюдать, как она работает, хоть в отладчике, хоть в реальном применении. И того, чем я реально пользовался, работают 32-битный таймер, PVD, бекап-регистры и 32к флеша.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

Тестирование дешевой китайской отладочной платы для 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 бит:
Изображение
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

oleg110592 писал(а):Напишем софтик, где функция задержки сделана на таймере TIM2 (напомню для испытуемого STM32F030F4P6 по документации он 16 бит).
По документации его вообще нет. Как и нет "лишних" 16 КБ Flash (по документации 16 КБ, а в реальности 32 КБ).
oleg110592 писал(а):О чудо - 16 бит таймер на самом деле 32 бит
Как писал выше, по документации TIM2 в F030 отсутствует. В документации на другие модели МК (например F031) он 32-ух битный.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

его вообще нет
Точно - спутал на радостях с TIM3 - в доке на F031 TIM2 и TIM3 в одном разделе. Тем более приятно обнаружить таймер, которого нет. 8)
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение zöner »

oleg110592 а еще флэша 32Кб, а не 16Кб и т.д.
у STM32F030F4P6 по факту тоже 32К флеша, т.е. у всей линейки 32F030 - один кристалл
Ответить

Вернуться в «МЯЯЯУ!»