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

Кто любит RISC в жизни, заходим, не стесняемся.
Alex_Golubev
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс ноя 15, 2015 05:54:13

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

Сообщение Alex_Golubev »

Скажите что за параметр функции Timeout в HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); ? Не понял для чего нужен.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

I2C slave может поломаться или повесить шину. Видимо чтобы отследить такой аварийный случай.
Нужно потому что
Function Description
Transmits in master mode an amount of data in blocking mode.
Аватара пользователя
es131245
Потрогал лапой паяльник
Сообщения: 369
Зарегистрирован: Пт фев 01, 2013 21:05:30

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

Сообщение es131245 »

Есть задача где с помощью АЦП надо контролировать поведение схемы.
Напрашивается сюда прерывания по АЦП и старт-стоп АЦП в режиме continues.
Однако подобного не видел. В инете промелькнуло что прерывания с АЦП не правильный подход.

Как правильней?
Аватара пользователя
es131245
Потрогал лапой паяльник
Сообщения: 369
Зарегистрирован: Пт фев 01, 2013 21:05:30

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

Сообщение es131245 »

Есть вопросы по прерываниям. При прерывании по внешнему сигналу используется NVIC+EXTI.
Не на все вывода и не на все режимы (фронт, спад, оба) они работаю. Где можно узнать почему так и какие правильно?
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Подскажите, если ли режим DMA(Периферия-Периферия) у каких нибудь STM.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

pokk писал(а):режим DMA(Периферия-Периферия)
Ну к примеру STM32L, по крайней мере здесь это описано, правда есть сомнения http://chipspace.ru/stm32l-dma/
Периферия – Память
Память – Периферия
Периферия – Периферия
Память – Память

es131245 писал(а):Где можно узнать почему так и какие правильно?
В даташите.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

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

Сообщение Myp3ik »

es131245, можно через DMA, который будет выдавать прерывание после завершения преобразования на всех каналах. Запускать АЦП можно по внешнему триггеру, например по таймеру.
Вложения
ADC_Ext_Trig_Test.rar
(849.13 КБ) 149 скачиваний
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

На 142 странице я писал о корректировке функций для работы с FP-числами, так вот, функция сложения все же имела еще одну неприятную особенность - при сложении двух противоположных чисел получалось не 0, а +0.5. Вот исправленный вариант:
Спойлер

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

;************************************************
;* desc: Складывает два вещественных числа      *
;*   in: r0 - слагаемое 1 (float32)             *
;*       r1 - слагаемое 2 (float32)             *
;*  out: r0 - сумма (float32)                   *
;* used: r0-r6                                  *
;*  mod: r0                                     *
;************************************************
_fadd:

        push    {r1-r6, lr}
        mov     r4, r0
        eors    r4, r1
        movs    r5, 1
        lsls    r5, 31
        ands    r4, r5          ; r4 - маска знака
        lsls    r2, r0, 1
        lsrs    r2, 24          ; r2 = AEXP
        lsls    r3, r1, 1
        lsrs    r3, 24          ; r3 = BEXP
        adds    r6, r2, r3
        beq     .complete
        cmp     r2, r3
        bge     .f_noswap
        push    {r0}            ; если AEXP < BEXP, то:
        mov     r0, r1          ; меняем местами мантиссы
        pop     {r1}
        push    {r2}            ; меняем местами порядки
        mov     r2, r3
        pop     {r3}
    .f_noswap:
        mov     r6, r2          ; сохраним AEXP в r6
        subs    r2, r3          ; r2 = AEXP - BEXP
        mov     r3, r5
        ands    r3, r0
        lsls    r0, 8           ; установим в 1 старший бит
        lsls    r1, 8
        orrs    r0, r5
        orrs    r1, r5
        lsrs    r0, 8           ; r0 = мантисса A
        lsrs    r1, 8           ; r1 = мантисса B
        lsrs    r1, r2          ; BEXP = r6
        tst     r4, r4          ; r4 = XOR маска знака
        beq     .addition
        subs    r0, r1          ; r0 = A - B
        bpl     .normaliz
        rsbs    r0, 0           ; вычитаем из 0, A = -A
        eors    r3, r5          ; инвертируем знак результата
        b       .normaliz
    .addition:
        adds    r0, r1          ; складываем мантиссы A+B
        mov     r2, r6          ; r2 = AEXP
        lsls    r1, r0, 8       ; проверим на перенос (бит 25)
        bcc     .normaliz
        lsrs    r0, 1
        adds    r2, 1           ; EXP = EXP + 1
        b       .make_num
    .normaliz:
        mov     r2, r6
        lsls    r0, 8
    .nrm_loop:
        lsls    r0, 1           ; сдвигаем влево на 1 бит
        bcs     .nrm_done       ; флаг C установлен?
        subs    r2, 1           ; уменьшаем порядок на 1
        bpl     .nrm_loop
        adds    r2, 1
    .nrm_done:                  ; r2 = порядок, r0 = мантисса
        lsrs    r0, 9
    .make_num:
        lsls    r0, 9           ; очистим бит 23
        lsrs    r0, 9
        lsls    r2, 23          ; сдвигаем порядок в позицию [30:23]
        orrs    r0, r2          ; порядок OR мантисса
        orrs    r0, r3          ; r2 = порядок OR мантисса OR знак
    .complete:
        pop     {r1-r6, pc}

Также была проблема со сложением двух околонулевых (денормализованных) чисел. Для своих задач в функции я считаю за 0 результат, если оба числа имеют порядок 0:

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

        adds    r6, r2, r3
        beq     .complete

PS. Все это для МК STM32F103.
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Будьте так любезны, подскажите куда делся ST-LINK utility. Не могу скачать со страницы ST.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

amv2000, сайт поди обновляют. Было подобное...
Delfer
Родился
Сообщения: 4
Зарегистрирован: Пн июн 04, 2012 12:19:46

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

Сообщение Delfer »

РадиоЛоматель писал(а):
Satyr писал(а):Вы че народ ?
самый кошерный J-link клон из китая с ДОСТАВКОЙ стоит до 20$

Заказал я себе этот клон. J-Link v8, такой, как тут: http://de1fer.ru/?p=146

Сайт переехал, теперь статья доступна по [url="https://delfer.ru/2011/12/03/%D0%BA%D0%B8%D1%82%D0%B0%D0%B9%D1%81%D0%BA%D0%B8%D0%B9-j-link-v8/"]новому адресу[/url].
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Alexey_N писал(а):PS. Все это для МК STM32F103.


Код функции на первый взгляд получился пригодным и для М0.

Вот две маленьких приблуды для удобства работы с числами с плавающей и фиксированной точкой:
Вложения
converters.zip
(32.99 КБ) 146 скачиваний
Alex_Golubev
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс ноя 15, 2015 05:54:13

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

Сообщение Alex_Golubev »

Скажите как можно проверять какой таймер вызвал прерывания void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) ?
Alex_Golubev
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс ноя 15, 2015 05:54:13

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

Сообщение Alex_Golubev »

Нашел ответ
Спойлер

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

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   if (htim->Instance==TIM3) //check if the interrupt comes from TIM3
      {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
      }
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

подскажите как через куб настроить внешние прерывания для 103го
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет. Столкнулся со странностями поведения STM32F100x4.
Спаял устройство на макетке. Решил протестить. В общем, на PB3 и PB4 не могу выставить уровни. Такое чувство что они весят в воздухе. Вольтметр (если отпаять выводы от платы) показывает "мусор".
PB6 - PB15 работают нормально. Ноги МК припаяны нормально. Флюс (активный, гидрокс) смыт. Смотрел по шагам через отладчик на SWD

Есть ли какая-нибудь особенность использования порта?
Думал что контроллер убил. Заменил его. Ничего не изменилось. Или и второй сдох, или я тугадум.
Монтаж проверил. Все по схеме.
Код проверки

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

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

void GPIO_Config (void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
  GPIO_DeInit(GPIOB);
 
  GPIO_InitTypeDef gpio_port;
       
  gpio_port.GPIO_Pin = GPIO_Pin_All;
  gpio_port.GPIO_Mode = GPIO_Mode_Out_PP;
  gpio_port.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_Init(GPIOB, &gpio_port);

}

void main(void)
{

  GPIO_Config();
 
  while(1)
  {         
   GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_14|GPIO_Pin_15);
   GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_14|GPIO_Pin_15);
  }
}



Изображение
Последний раз редактировалось Chip115 Вс июл 03, 2016 11:08:45, всего редактировалось 1 раз.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Там альтернативные функции висят BOOT1 и JTDO.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

На PB3 JTDO/SWO,ремап нужен.
PB2 в коде не вижу...
И сей ногодрыг жесть.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Опечатка. PB3 и PB4. Спасибо. Сча попробую ремапнуть
-----
Проблема решена. Спасибо!

Добавил строки в инициализацию

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);   
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Еще проблемка.
Я юзаю кварц на 4 МГц.
Библиотека stm32f10x заточена на 8 Мгц.
Что надо сделать, что бы запустить HSE?
HSE_VALUE в файле stm32f10x.h менять с 8000000 на 4000000 и производить настройку?

Если вот так сделаю, то будет работать? Хочу запустить генератор на частоте 16 МГц HSE

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

volatile uint8_t Clock=0; 
  volatile uint32_t SystemCoreClock = 0;
 
  RCC_ClocksTypeDef RCC_Clock;
  RCC_DeInit();
  RCC_HSEConfig(RCC_HSE_ON);
  while (ERROR == RCC_WaitForHSEStartUp())
  {
  }
  RCC_GetClocksFreq(&RCC_Clock);
  RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);
  RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_2);
  RCC_PLLCmd(ENABLE);
 
  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
  RCC_GetClocksFreq(&RCC_Clock);
  Clock = RCC_GetSYSCLKSource ();
  SystemCoreClock = RCC_Clock.HCLK_Frequency;


Частота HSI 8 Мгц. Если не производить настройку генератора, то при запуске с таким кодом (тупо мигалка)
задержка не 1 с, а около 10-12 сек.Почему так?

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

void vDelay()
{
 
  unsigned int time = 0;
  for (time=0; time < 8000000; time++)
  {
  }
  GPIOA->ODR ^= 0x8000;

}
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Ответить

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