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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

dosikus, рекомендую вам прочитать правила форума В частности эти пункты
Спойлер
2. Форум - место для приятного и полезного общения. Поэтому вежливость и уважительное отношение к собеседнику является совершенно необходимым требованием для посещения нашего форума. Даже в том случае, если заданный вопрос кажется вам неверотяно тупым, вспомните себя начинающего - скорее всего, ваши вопросы были еще тупее. Каждый посетитель нашего Форума - гость, которому мы всегда рады, однако помните, что и у гостей есть некоторые обязанности.

2.3 Недопустимо появление в сообщениях оскорблений в адрес посетителей форума, а также любой пропаганды противоправных действий. Ненормативная лексика допускается в очень ограниченных объемах.
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Добрый день, подскажите пожалуйста почему счётный вход у одних таймеров указывается с каналом например TIM2_CH1_ETR, а у других без канала TIM8_ETR?
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25249
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

И 2-й и 8-й таймеры имеют как внешний вход тактирования, так и канальные входы Input Capture (захвата).
Однако 9-й и 12-й не тактируются снаружи, но имеют входы захвата.
Есть basic-таймеры, у которых нет ни внешнего тактирования, ни модулей захвата/ШИМ.
Смотрите референсный мануал на семейство и там все описания на все имеющиеся на борту таймеры имеются.
Однако, в маловыводных корпусах SSOP20/LQFP32 могут отсутствовать ряд входов имеющихся по референсному мануалу. Но это связано именно с недостатком пинов.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

Скажите, нужно ли еще что-то делать для прошивки STM32F030 (в LQFP32) по UART через ноги PA9, PA10?
Я сажаю BOOT на +3,3В, пытаюсь приконнектится Flash Loader'ом, но он выдает ошибки - МК не отвечает, неопознанный МК и т. п. Естественно, попробовал разные режимы с эхо и без. Из особенностей - ком-порт у меня "воздушный" через bluetooth-модуль HC-06, но до этого связь МК через модуль с компом проверялась и работала. Бит четносности в настройках модуля установил.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Мне не совсем понятно, что будет если у одного таймера задействую несколько счетных каналов, регистр CNT то один.
Разобрался.
1 контакт TIM2_CH1_ETR(хоть и называется CH1 - он для всего таймера TIM2)
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25249
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Невозможно задействовать одновременно несколько каналов, кроме как "исключающее ИЛИ" на 1, 2 и 3. Но и тогда выходной сигнал с логической функции будет только один. Вы выбираете переключателями тот источник счета, который Вам нужен.
Изображение
Реклама
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

Здравствуйте. После STM32F103 разбираюсь с SPI STM32F030, он немного другой. Запустил, все пишет, читает, но в 16-битном режиме посылает байты в обратном порядке! Т.е. если я пишу в DR 0xF800, он шлет сначала 0x00 а потом 0xF8! Почему? Вот инициализация:

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

    SPI1->CR1 = SPI_CR1_MSTR |     // Master mode
                SPI_CR1_SSM |      // Software slave managment
                SPI_CR1_SSI |      // Internal slave select
                SPI_CR1_BR_0 |     // BR[2:0]
                SPI_CR1_BR_1;      // Baud rate = PCLK / 16
    SPI1->CR2 = ( SPI1->CR2 &
                 ~SPI_CR2_DS ) |   // Clear DS
                  SPI_CR2_DS_0 |   // DS[3:0] = 8-bit as default
                  SPI_CR2_DS_1 |   //
                  SPI_CR2_DS_2 |   //
                  SPI_CR2_FRXTH;   // RXNE event if 8 bit received
Перед отправкой, переключаю в 16-битный режим:

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

SPI1->CR2 |= SPI_CR2_DS_3;

while ( ( SPI1->SR & SPI_SR_TXE ) == 0 ) {};
SPI1->DR = word;
UPDATE.
Разобрался сам, экспериментально :) Оказывется, есть несколько моментов. Если установлен 8-bit режим, то записывать в DR надо именно 8 бит, т.е. после компиляции должна получится команда strb, иначе модуль spi передаст эти 16 бит как два байта в обратной последовательности, т.е. сначала те 8 бит, а потом нули. Но этот режим не 16-и битный. Чтобы переключиться на 16 битный надо установить DS биты согласно 16 битам и, если будет выполняться прием данных, то и бит FRXTH в 0.

UPDATE2.
Код выше работает, я просто не учел другие места в программе, где используется 16-битный режим.
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Спасибо, КРАМ.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

На время отложил ПИКи и 51-е в сторону, чтобы понюхать, что народ нашел в этих зверюшках по имени STM32.
Заказал дешевенькую платку на "народном" 103-м чипе и ST-Link, а пока они в пути, начал понемногу осваивать документы, попутно пописывая тестовый базовый проект в Keil+CMSIS. Естественно возникают вопросы по ходу чтения.
Например такой: для чего нужен bit-banding GPIO при наличии BSRR и BRR (с ODR все понятно)?

Или такой: для чего нужен стартап файл? Вернее ясно, что в нем прописаны всякие хэндлеры и прочее, но почему все это прописано не в хедерах? Почему старт программы начинается не с main{}, а в этом файле со строк

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

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     ;IMPORT  SystemInit
                 ;LDR     R0, =SystemInit
                 ;BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
System init закомментировал я сам, т.к. все это прописываю вручную сам.
Можно ли этот Reset_Handler прописать в основном исходнике, а если да, то что можно сделать с остальным?

P.S. Прописал его в исходник, удалил стартап. Проект скомпилировался, но выдал предупреждение: ".\Objects\Test.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'."
Выходит, без стартапа никак?

Добавлено after 9 minutes 49 seconds:
Вернул стартап, но вышеуказанные строки заменил на

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

IMPORT  Reset_Handler             [WEAK]
В исходнике при этом

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

void Reset_Handler (void)
{
  main();
}
Компиляцию проходит чисто, симуляция шагает правильно.
Будем считать, что иначе никак.

Пока остался вопрос с бит-бандингом.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение scorpi_0n »

В стартапе не только переход на майн и таблица прерываний, там и настройка стека и кучи и др.
Битбэндинг есть не везде, а там где он есть, он распространяется не только на порты, а и на ОЗУ, и на другую периферию, где нет регистров BSRR и BR.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

Я в курсе про области, на которые распространяется бит-бандинг.
Я спрашивал о том, есть ли смысл использовать его именно для портов при наличии "битовых" регистров BSRR и BRR.
Т.е. есть ли какой-то выигрыш в длине кода или он в обоих случаях одинаковый?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение scorpi_0n »

Согласно результатам старинной борьбы за каждый байт на элхе, смысл есть только в одном случае - при инвертировании бита порта.
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

Вроде разобрался с SPI на STM32F030, но с чтением возникло непонятное поведение: на шине смотрю анализатором - всегда идут с дисплея ili9341 по MISO: 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00. В функции чтения записываю и читаю по 1 байту (все в режиме 8 бит), всего 4 вызова функции - и получаю каждый раз разное: то все 0xFF, то FF,FC,00,00, не пойму с этим RXFIFO, как он работает?

Код функции:
Спойлер

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

u8 spi_rw_byte( u8 byte )
{
    u8 r_byte;

    SPI1->CR2 &= ~SPI_CR2_DS_3; // 8 bit
    while ( !( SPI1->SR & SPI_SR_TXE ) );
    *(u8*) & (SPI1->DR) = byte;
    while ( !( SPI1->SR & SPI_SR_RXNE ) );
    r_byte = *(u8*) & SPI1->DR;
    while ( SPI1->SR & SPI_SR_BSY );

    return r_byte;
}
Инит SPI:
Спойлер

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

    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

    GPIOA->MODER =
         ( GPIOA->MODER &
        ~( GPIO_MODER_MODER5 |
           GPIO_MODER_MODER6 |
           GPIO_MODER_MODER7 |
           GPIO_MODER_MODER1 |
           GPIO_MODER_MODER2 |
           GPIO_MODER_MODER3 |
           GPIO_MODER_MODER4 ) )
         | GPIO_MODER_MODER5_1 |    // PA5 - AF (SCK)
           GPIO_MODER_MODER6_1 |    // PA6 - AF (MISO)
           GPIO_MODER_MODER7_1 |    // PA7 - AF (MOSI)
           GPIO_MODER_MODER1_0 |    // PA1 - GP output (RS)
           GPIO_MODER_MODER2_0 |    // PA2 - GP output (CE)
           GPIO_MODER_MODER3_0 |    // PA3 - GP output (DC)
           GPIO_MODER_MODER4_0;     // PA4 - GP output (LED)
    GPIOA->OTYPER &=
        ~( GPIO_OTYPER_OT_5 |       // PA5 - Push-pull (SCK)
           GPIO_OTYPER_OT_6 |       // PA5 - Push-pull (MISO)
           GPIO_OTYPER_OT_7 |       // PA7 - Push-pull (MOSI)
           GPIO_OTYPER_OT_1 |       // PA1 - Push-pull (RS)
           GPIO_OTYPER_OT_2 |       // PA2 - Push-pull (CE)
           GPIO_OTYPER_OT_3 |       // PA3 - Push-pull (DC)
           GPIO_OTYPER_OT_4 );      // PA4 - Push-pull (LED)
    GPIOA->OSPEEDR |=
           GPIO_OSPEEDR_OSPEEDR5 |
           GPIO_OSPEEDR_OSPEEDR6 |
           GPIO_OSPEEDR_OSPEEDR7 |
           GPIO_OSPEEDR_OSPEEDR1 |
           GPIO_OSPEEDR_OSPEEDR2 |
           GPIO_OSPEEDR_OSPEEDR3 |
           GPIO_OSPEEDR_OSPEEDR4;   // High speed
    GPIOA->PUPDR &=
        ~( GPIO_PUPDR_PUPDR5 |
           GPIO_PUPDR_PUPDR6 |
           GPIO_PUPDR_PUPDR7 );
    GPIOA->AFR[0] &=
        ~( GPIO_AFRL_AFR5 |         // PA5 - AF0-SCK
           GPIO_AFRL_AFR6 |         // PA6 - AF0-MISO
           GPIO_AFRL_AFR7 );        // PA7 - AF0-MOSI

    while ( SPI1->SR & ( SPI_SR_FTLVL | SPI_SR_BSY ) ) {};
    SPI1->CR1 &= ~SPI_CR1_SPE;
    while ( SPI1->SR & SPI_SR_FRLVL ) { SPI1->DR; };

    SPI1->CR1 = SPI_CR1_MSTR |     // Master mode
                SPI_CR1_SSM |      // Software slave managment
                SPI_CR1_SSI |      // Internal slave select
                SPI_CR1_BR_0 |     // BR[2:0]
                SPI_CR1_BR_1;      // Baud rate = PCLK / 16
    SPI1->CR2 = ( SPI1->CR2 &
                 ~SPI_CR2_DS ) |   // Clear DS
                  SPI_CR2_DS_0 |   // DS[3:0] = 8-bit as default
                  SPI_CR2_DS_1 |   //
                  SPI_CR2_DS_2 |   //
                  SPI_CR2_SSOE |   // No multimaster
                  SPI_CR2_FRXTH;   // RXNE event if 8 bit received

    SPI1->CR1 |= SPI_CR1_SPE;
UPDATE.
И тут удалось разобраться. Получается вот что. При чтении из DR выдается не то, что, как думается, пришло одновременно с передачей, а самое старое значение в буфере. Поэтому, чтобы прочитать правильное значение, нужно перед транзакцией запись-чтение очистить буфер приёма. В мануале говорится только о выключении-включении spi модуля, но, очевидно, путь долгий это. Можно пойти иначе - очищать буфер чтением из него ненужных принятых значений (такая функция есть в HAL - HAL_SPIEx_FlushRxFifo), пока он не станет пустой, на что указывают биты FRLVL регистра статуса SR. Таким образом:
Спойлер

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

...
while ( SPI1->SR & SPI_SR_FRLVL ) { SPI1->DR; };
c1 = spi_rw_byte( 0x00 );
...
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

подскажите что делать! не могу вернуться из подпрограммы сразу попадаю в HardFault. стек не переполняется но адрес возврата каким то образом затирается
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Со столь подробным изложением деталей лучше сразу на форум прорицателей обращаться.
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

2 RusikOk
У меня такое было, когда после входа в функцию сохранял одно количество регистров, а перед выходом восстанавливал другое :)

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

push {r1-r2, lr}
...
pop {r1-r3, pc}
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

a5021 писал(а):Со столь подробным изложением деталей лучше сразу на форум прорицателей обращаться.
там ответа тоже не знают :))

в общем оказалось, что стек срывается внутри sscanf-a
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

Завис на прерываниях.
Я привык (избалован наверное) к тому, что у каждой периферии/модуля есть свой бит разрешения прерывания, флаг срабатывания, бит, включающий глобальное прерывание, иногда приоритеты бывают. И выставив или обнулив конкретный бит в конкретном регистре, всем этим хозяйством можно управлять напрямую.
Тут же у меня возникло впечатление, что прерывание (точнее конкретно NVIC) конфигурируют через системные функции типа NVIC_EnableIRQ(xyz) и прочее в том же духе. А напрямую никак? Для чего тогда кучка ИСЕРов, ИСПРов и иже с ними без указания какой бит за что отвечает?
Для чего, скажем, нужна NVIC_EnableIRQ(SysTick_IRQn), если есть SysTick->CTRL |= SysTick_CTRL_TICKINT ?

Я не пользуюсь "слепыми" конфигураторами, мне нужно видеть логическую цепочку, где-что-как разрешается и от чего зависит, пусть даже это занимает больше времени. Вот в системе прерывания АРМов я пока не могу уловить эту цепочку. Читаю RM и PM на Cortex-M3.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

Zhuk72 писал(а):Для чего, скажем, нужна NVIC_EnableIRQ(SysTick_IRQn), если есть SysTick->CTRL |= SysTick_CTRL_TICKINT ?
ооо подобные вопросы не мало воин начали))) https://electronix.ru/forum/index.php?showtopic=131520
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Zhuk72 писал(а):Для чего, скажем, нужна NVIC_EnableIRQ(SysTick_IRQn), если есть SysTick->CTRL |= SysTick_CTRL_TICKINT ?
Задумка в том, что если прерывание не разрешено в NVIC, то в момент, когда это прерывание случается, не будет вызываться обработчик, хотя все остальные действия (взведение флагов, пробуждение и т.п.) выполняться будут.
Ответить

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