STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3793802#p3793802"]F4 — это Cortex-M4. Я с ними вообще не работал полноценно ни разу, поэтому ничего сказать не могу. Но явно для новичка они - перебор! Начинать надо с простейших — STM32F0xx.[/uquote]
M4 от M3 отличается незначительно, добавился FPU, DSP инструкции новичкам все равно не нужны, потому всю сложность привносит периферия и тут новые G0 уже могут быть сложнее F401, хоть они и M0+. Тот же F303 сложнее F401. OTG там USB или нет особо без разницы, все равно абсолютное большинство будет искать готовые либы, то же касается SDIO.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Oxford",url="/forum/viewtopic.php?p=3793713#p3793713"]Ты же написал типо в F103 нету, твои слова. В 64 ногих тоже есть DAC. Проблема у тебя в голове просто, а не в F103[/uquote]
Ты не стесняйся, на скриншоте отметь где там ЦАП.
Либо формулируй свои высказывания более однозначно, особенно когда говоришь о не-типичных случаях. Потому что под f103 практически всегда понимают именно f103c8t6, зачастую даже не сам контроллер, а отладочную плату вроде bluepill, на которой он установлен.
Eddy_Em писал(а):И какой-то идиот его намертво там поставил! Т.е. для переподключения надо физически USB дергать... Офигеть, как удобно во время отладки!
А переподключение по методу vusb не работает? Прижать обе ноги к земле и подождать 20 мс если мне не изменяет память.
WiseLord писал(а):В итоге решил проблему небольшим изменением в коде.
А, меня уже опередили :)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Разобрался))
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Народ подскажите чё за фигня - STM32F103C8T6 - TIM2 не хочет считать от внешнего входа - подаю с TIM1 PWM4 (PA11) 100 kHz на внешний вход TIM2 - PA0, ни в какую:
Спойлер

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

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 clock enabled

RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | // Enabled Alternate Function I/O clock
                             RCC_APB2ENR_IOPAEN;  // Enabled Clock GPIO A

GPIOA->CRL	= GPIO_CRL_CNF0_0;   // PA0 - TIM2_ETR External Clock - Floating input

TIM2->CR1   = 0; // TIM2 disabled
TIM2->CR2   = 0;              
TIM2->CNT   = 0; // TIM2 counter
TIM2->PSC   = 0;    // TIM2 prescaler clock;
TIM2->ARR   = 0xFFFF; // TIM2 auto-reload register
TIM2->SMCR = TIM_SMCR_SMS_0|TIM_SMCR_SMS_1|TIM_SMCR_SMS_2 | - SMS = 0b111 - External Clock Mode
                       TIM_SMCR_TS_2 | TIM_SMCR_TS_1 |
	               TIM_SMCR_ECE; // External clock enable
	
TIM2->DIER  = TIM_DIER_UIE; // Update interrupt enable // разрешить прерывания 

NVIC_EnableIRQ (TIM2_IRQn); // Enable TIM2 Interrupt
	
NVIC_SetPriority (TIM2_IRQn, 9); // set Priority for Cortex-M0 System Interrupts	
	
TIM2->CR1  |= TIM_CR1_CEN;  // Counter enabled
__enable_irq(); // Enable Interrupt

  LED_Y_Off;
Даже не входит в прерывание, другие прерывания работают. Пробовал на 2-х чипах - одинаковый эффект - не считает от внешнего входа. Пробовал подавать внутренний клок - считает, в прерывание попадает, светодиод мигает, от внешнего входа - ни в какую :(
Спойлер

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

void TIM2_IRQHandler (void)
{
  LED_Y_On;
	
  if(TIM2->SR & TIM_SR_UIF) // Check Update interrupt flag
  {
    TIM2->SR = ~TIM_SR_UIF; // Clear Update interrupt flag 
  }
}
Добавлено after 3 hours 42 minutes 23 seconds:
Ставлю TIM2->SMCR = 0 - работает, ставлю TIM2->SMCR = TIM_SMCR_ECE - глухо. Проверяю анализатором - с TIM1 идёт клок 100 кГц, а TIM2 не работает.

Добавлено after 49 minutes 2 seconds:
Короче разобрался - в проге был включён ремап счётного входа TIM2 с PA1 на PA15, слона то я и не заметил :) Ну всего то делов - раз 20 пролистал Reference manual, аппноты, почитал в инете чего народ пишет по таймерам.

Всем спасибо, все свободны.
Хорошему коту и в декабре - март :)
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Вопросик по STM32F103C8T6 - я вывожу в коде:

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

u16 u;
while(1)
{
  GPIOA->ODR = u++;
}
переменную в порт - в самом младшем разряде РА0 частота 1,8 МГц - это при 72 МГц тактовой. Так мало? Или это нормально?
Хорошему коту и в декабре - март :)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

20 тактов на цикл. Многовато. Включить оптимизацию и смотреть листинг.
Реклама
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3797023#p3797023"]20 тактов на цикл. Многовато.[/uquote]
Спасибо. Еще вопрос - какую max частоту можно получить с ШИМа на STM32F103C8T6 при 72 Мгц тактовой? У меня получилось 36 МГц.

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

TIM1->PSC = 0;
TIM1->ARR = 1;
Или как-то можно вывести 72 МГц?
Хорошему коту и в декабре - март :)
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

ARR определяет частоту. Поэтому никак.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?[/uquote]
Нельзя. Сами подумайте: на один бит надо дернуть SCK сначала к 1, потом к 0. А за один такт вы успеете сделать либо то, либо другое.
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

2 Oxford, COKPOWEHEU: спасибо, значит, я думал правильно.

Добавлено after 16 minutes 28 seconds:
Народ, ещё вопрос - как для STM32 для Keil разместить подпрограмму из FLASH в RAM?

Добавлено after 5 hours 49 minutes 52 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3797023#p3797023"]20 тактов на цикл. Многовато.[/uquote]
Попробовал через пинать порт через DMA - завёл в памяти массив 256 байт, заполнил его значениями от 0 до 0xFF и вывожу в порт - в самом младшем разряде порта частота примерно 3.4 МГц - т.е. при 2-х пинках на период DMA гонит данные примерно 6.8 МГц - т.е. около 10-11 тактов на на 1 пинок. В самом старшем (8-м) - 26.8 кГц. Осцила нет, меряю анализатором Selao.
Хорошему коту и в декабре - март :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ваш пример. 8 тактов на цикл - 4.5 МГц.

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

  for(uint32_t i;;)
  {
    GPIOA->ODR=i++;
  }

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

        LDR.N    R1,??main_0      ;; 0x4001080c
??main_1:
        STR      R0,[R1, #+0]
        ADDS     R0,R0,#+1
        B.N      ??main_1
СпойлерИзображение
DS2_2020227231019.png
(34.77 КБ) 168 скачиваний
Если пожертвовать скважностью, 10 тактов на цикл - 7.2 МГц

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

  for(GPIO::PA_1 pin;;)
  {
    pin=1;
    pin=0;
  }

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

        MOV      R0,#+131072
        LDR.N    R1,??main_0      ;; 0x40010810
        MOV      R2,#+131074
??main_1:
        STR      R2,[R1, #+0]
        STR      R0,[R1, #+0]
        B.N      ??main_1
СпойлерИзображение
DS2_2020227225737.png
(37.48 КБ) 159 скачиваний
Если подравнять скважность, то 12 тактов на цикл - 6 МГц.

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

  for(GPIO::PA_0 pin;;)
  {
    pin=1;
    __NOP(); __NOP();
    pin=0;
  }
СпойлерИзображение
DS2_2020227232426.png
(36.28 КБ) 156 скачиваний
Добавлено after 18 minutes 52 seconds:
На короткой последовательности можно ещё чуть выжать. Но это неспортивно.
Спойлер

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

void Dryg()
{
  GPIO::PA_0::set();
  __NOP();
  GPIO::PA_0::clear();
  __NOP();
}


int main()
{  
  for(;;)
  {
    Repeat<Dryg,50>();
  }
}
Изображение

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

main:
        MOV      R0,#+65536
        LDR.N    R1,??DataTable1  ;; 0x40010810
        MOVS     R2,#+1
??main_0:
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        STR      R2,[R1, #+0]
        Nop      
        STR      R0,[R1, #+0]
        Nop      
        B.N      ??main_0
DS2_2020227233846.png
(25.63 КБ) 188 скачиваний
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3798142#p3798142"]Ваш пример. 8 тактов на цикл - 4.5 МГц.[/uquote]
Благодарствую, вот оказывается, как много всего я ещё не знал :)

В перспективе присматриваюсь к формированию VGA с МК - типа чтобы грузонуть МК по самые помидоры. Ну, может не на этом - STM32F103C8T6, а на 103-м, только с 64 кБ ОЗУ, или же на более шустром - "Black Pils" - STM32F401/411, или другом М4/М7.
Хорошему коту и в декабре - март :)
Открыл глаза
Аватара пользователя
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Сообщение passer_by »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?[/uquote]
На вывод PA8

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

void MCO_out (void){
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;                       	   // enable clock for port A
	GPIOA->CRH &= ~GPIO_CRH_CNF8_0;		         		   // setting out alternative push-pull for PA8
	GPIOA->CRH |= GPIO_CRH_CNF8_1;
	GPIOA->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1);     // gpio speed 50 MHz
	RCC->CFGR |= RCC_CFGR_MCO_SYSCLK ;//  HSE; PLL; SYSCLK;   // select source clokc SYSCLK
}
Или можно вывести частоту кварца HSE, после PLL, ну и саму системную частоту SYSCLK.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Подскажите новичку, почему не опускается ножка от прерывания по сравнению.
Инициализация stm32f0 tim3:

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

 Brightness = 100;
 NVIC_EnableIRQ(TIM3_IRQn);   
 
 TIM3->PSC = 153; 
 TIM3->ARR = 255; 
 TIM3->DIER   |= TIM_DIER_UIE    //*!<Update interrupt enable */
              | TIM_DIER_CC1IE;  //*!<Capture/Compare 1 interrupt enable */
 
 TIM3->CCR1 = Brightness; //*!< TIM capture/compare register 1,  */
 TIM3->CR1 |= TIM_CR1_CEN; 
Обработчик прерывания:

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

void TIM3_IRQHandler (void)
{  
  if(TIM3->SR & TIM_SR_UIF == TIM_SR_UIF){
   TIM3->SR = 0;  
   GPIOA->BSRR |= BS(10);         // поднимим ножку
  }
  
  if(TIM3->SR & TIM_SR_CC1IF == TIM_SR_CC1IF){        
       TIM3->SR =0;
       GPIOA->BSRR |= BR(10);       //опустим ножку          
  }
}
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Для начала убрать чтение из BSRR. Дальше будем посмотреть.
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Чтение BSRR влияет на настройку таймера или на поднятие флага TIM_SR_CC1IF?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

И еще, сбрасывайте тот флаг, который обрабатываете, а не все. это по поводу строчки: TIM3->SR =0; лучше TIM3->SR &= ~TIM_SR_UIF;
А вообще, можно этот вывод сделать аппаратно и не нужно будет никаких прерываний.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

И еще, сбрасывайте тот флаг, который обрабатываете..
Там всего ~1220 прерываний в секунду и CCR1 установлен на середину счета таймера, друг другу они мешать не должны.

TIM3->SR =0; сбросит все флаги(и TIM_SR_UIF), причем каждый сброс прописан в обработчике для своего флага.
А вообще, можно этот вывод сделать аппаратно и не нужно будет никаких прерываний
Естественно, но я настраивал таймер для работы через прерывания.
TIM_SR_UIF по переполнению поднимается
TIM_SR_CC1IF по сравнению не поднимается

Вопрос у гуру: почему? :oops:
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="passer_by",url="/forum/viewtopic.php?p=3800102#p3800102"]Или можно вывести частоту кварца HSE, после PLL, ну и саму системную частоту SYSCLK.[/uquote]

кварц 4-16mhz, Pll/2 выводиться, SYSCLK должен быть меньше или равно 50 mhz
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

[uquote="RoboC",url="/forum/viewtopic.php?p=3800264#p3800264"]Чтение BSRR влияет на настройку таймера или на поднятие флага TIM_SR_CC1IF?[/uquote]
На таймер оно не влияет.

Но Вас не смущает то, что:

1) код "поднятия" и "опускания" ножки у Вас в обработчике абсолютно одинаковый, т.е., уже только одно это означает ошибку;

2) читать BSRR вообще нельзя, а Вы это в обоих случаях делаете?
Контактная информация:
Ответить

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