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

Кто любит RISC в жизни, заходим, не стесняемся.
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

Вот что выяснил-каждые 0,415 сек на выводе ресет STM32F040 у меня появляется лог 0,то есть каждые 0,415 сек STM перезагружается и программа работает сначала,потому толком ничего не выходит,загрузил простой блинк-если поставить переключение порта (на нем стоит резистор 1 ком и светодиод) 0,1 сек то успевает моргать,если поставить переключение на 0,5 сек то светодиод никогда не зажигается(в программе изначально на порту лог ноль,задержка,потом лог единичка)
Потому у меня и грабли с I2C...
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Собака?
Реклама
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

VladislavS, Вот спасибо! поставил галочку на WDG_SW,мой SSD1306 заработал,вернее инициализация проходит нормально,надо писать оставшиеся функции
Аватара пользователя
pavell
Открыл глаза
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

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

Сообщение pavell »

Приветствую уважаемые, подскажите причину следующего поведения.
Имеется F0 у которого настраиваю SPI с программным CS (чаще CS управляю "железно"). Сама настройка ничего экзотического не содержит - Master, MOSI, полярности и пр. все по дефолту. И при выполнении следующего кода:

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

while(!(SPI2-CR & SPI_SR_TXE));
SPI2->DR      = data;
GPIOB->BSRR  |= GPIO_BSRR_BS_12;
GPIOB->BSRR  |= GPIO_BSRR_BR_12;  
Получаем такую картину:
Изображение

Т.е. получается, что CS дергается в момент передачи данных, а не после. Мне вот этот момент и не понятен неужели это из за разницы в частоте тактирования GPIO и SPI (тут у меня максимально маленький делитель /2)?
Для исправления ситуации я прикостылил ассемблерную вставку с nop'ами, результат стал, каким я его и ожидал изначально:
Изображение

Но мне само решение мне не особо нравится и попутно на сколько поможет исправить ситуацию если использовать DMA?
Реклама
Эиком - электронные компоненты и радиодетали
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="pavell",url="/forum/viewtopic.php?p=3947288#p3947288"]Т.е. получается, что CS дергается в момент передачи данных, а не после. Мне вот этот момент и не понятен неужели это из за разницы в частоте тактирования GPIO и SPI (тут у меня максимально маленький делитель /2)?[/uquote]
Нет, это потому что ты CS дергаешь в момент передачи данных, а не после.
Реклама
Аватара пользователя
pavell
Открыл глаза
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

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

Сообщение pavell »

Reflector писал(а):Нет, это потому что ты CS дергаешь в момент передачи данных, а не после.
хм, т.е. перед ногодрыгом надо еще и BUSY флаг у SPI отслеживать?
Ладно попробую, спасибо
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="pavell",url="/forum/viewtopic.php?p=3947334#p3947334"]хм, т.е. перед ногодрыгом надо еще и BUSY флаг у SPI отслеживать?[/uquote]
На предыдущей странице написано как ждать окончания передачи, даже именно для F0.
Аватара пользователя
pavell
Открыл глаза
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

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

Сообщение pavell »

[uquote="Reflector",url="/forum/viewtopic.php?p=3947336#p3947336"]На предыдущей странице написано как ждать окончания передачи, даже именно для F0.[/uquote]
Спасибо за наставление на путь истинный ))
В моём случае достаточно проверки BUSY флага т.к. данные посылаются одиночные. Ну соответственно это получается чуть быстрее:
- Только busy
Изображение

- Busy и буффер
Изображение

а nop'ы остаются лидерами, ну это так, лирика.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="pavell",url="/forum/viewtopic.php?p=3947448#p3947448"]В моём случае достаточно проверки BUSY флага т.к. данные посылаются одиночные. Ну соответственно это получается чуть быстрее[/uquote]
Во-первых, правильно писать:

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

GPIOB->BSRR = GPIO_BSRR_BS_12;
GPIOB->BSRR = GPIO_BSRR_BR_12; 
Во-вторых, частота судя по всему 8MHz, но даже для нее 3us - это многовато, оптимизация хоть включена?
Аватара пользователя
pavell
Открыл глаза
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

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

Сообщение pavell »

[uquote="Reflector",url="/forum/viewtopic.php?p=3947454#p3947454"]оптимизация хоть включена?[/uquote]
В SeS cтояла L1 поменял на "L2 speed" ситуация кардинально изменилась - пауза стала одинаковой в обоих случаях 1.6 µs
В очередной раз компилятор оказался умнее меня )
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Не получается завести DMA для изменения содержимого CCR1 таймера TIM1 на STM32F103. На F072 у меня завелось без проблем, здесь же чертовщина какая-то.
Инициализирую:

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

    GPIOA->CRH = CRH(15, CNF_PPOUTPUT|MODE_SLOW) | CRH(8, CNF_AFPP | MODE_FAST);
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
    TIM1->ARR = 8; // 9 ticks till UEV
    TIM1->PSC = 7;
    // PWM mode 1 (active->inactive)
    TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
    // main output
    TIM1->BDTR = TIM_BDTR_MOE;
    // main PWM output
    TIM1->CCER = TIM_CCER_CC1E;
    NVIC_EnableIRQ(TIM1_UP_IRQn);
    RCC->AHBENR |= RCC_AHBENR_DMA1EN; // DMA1 clocking
    // memsize 8bit, periphsize 16bit, memincr, circular, mem2periph, half & full transfer interrupt
    DMA1_Channel5->CCR = DMA_CCR_PSIZE_0 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
    DMA1_Channel5->CPAR = (uint32_t)&TIM1->CCR1;
    NVIC_EnableIRQ(DMA1_Channel2_IRQn);
Пытаюсь запустить:

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

uint8_t dmabuff[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
void dma1_channel5_isr(){
    if(DMA1->ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        TIM1->CR1 = 0;
        DMA1_Channel5->CCR &= ~DMA_CCR_EN;
    }
    DMA1->IFCR = DMA_IFCR_CGIF5;
}
...
    TIM1->CR1 = 0; // stop
    TIM1->CCR1 = 1;
    TIM1->DIER = TIM_DIER_UDE; // enable DMA requests
    TIM1->CR1 = TIM_CR1_CEN | TIM_CR1_URS;
    DMA1->IFCR = DMA_IFCR_CGIF5;
    DMA1_Channel5->CNDTR = 9;
    DMA1_Channel5->CMAR = (uint32_t)dmabuff;
    DMA1_Channel5->CCR |= DMA_CCR_EN; // start DMA
И фигвам: вместо того, чтобы один раз выдать 9 импульсов с плавно нарастающей шириной, получаю бесконечную серию импульсов длительностью 111нс с шагом в микросекунду…
Вот чего этой собаке надо?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3949377#p3949377"]NVIC_EnableIRQ(DMA1_Channel2_IRQn);[/uquote]
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Ну я и осел… Спасибо!

Добавлено after 47 minutes:
А теперь - самая веселуха: как остановить таймер!

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

void tim1_up_isr(){
    TIM1->SR = 0;
    TIM1->CCR1 = 0;
    TIM1->CR1 = 0;
}

void dma1_channel5_isr(){
    if(DMA1->ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        DMA1_Channel5->CCR &= ~DMA_CCR_EN;
        TIM1->DIER = TIM_DIER_UIE;
    }
    DMA1->IFCR = DMA_IFCR_CGIF5;
}
если так сделать, последний импульс обрезается, как будто бы в массиве была единица…
Проблема в том, что

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

TIM1->DIER = TIM_DIER_UIE
срабатывает сразу же - и вызывает обработчик прерывания, который останавливает таймер. Т.е. нужно каким-то чудом указать, чтобы прерывание сработало в следующий раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

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

Сообщение Sergi »

Добавить в массив 10й элемент и потом не использовать.Не?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

В общем, весть этот трэш решился так:

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

void dma1_channel5_isr(){
    if(DMA1->ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        TIM1->SR = 0;
        TIM1->CR1 |= TIM_CR1_OPM;
        TIM1->CCR1 = 0;
    }
    DMA1->IFCR = DMA_IFCR_CGIF5;
}
    
uint8_t dmabuff[] = {3,6,3,3,6,6,3,6};
    
static void sendone(){
    TIM1->CR1 = 0; // stop
    DMA1_Channel5->CCR &= ~DMA_CCR_EN; // disable DMA to reconfigure
    TIM1->DIER = TIM_DIER_UDE; // enable DMA requests
    DMA1->IFCR = DMA_IFCR_CGIF5;
    DMA1_Channel5->CNDTR = 8;
    DMA1_Channel5->CMAR = (uint32_t)dmabuff;
    DMA1_Channel5->CCR |= DMA_CCR_EN; // start DMA
    TIM1->CR1 = TIM_CR1_CEN | TIM_CR1_URS;
}

В прерывании по завершению передачи можно и так написать: TIM1->CR1=0 — ничего не изменится. Устанавливать линию в 0 внутри прерывания таймера нельзя: слишком медленно, в итоге получается лишний короткий импульс.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

У TIM1 же есть RCR, пишешь в него количество периодов а сам таймер конфигурируешь в режиме OPM.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

Котаны здарова. Столкнулся с тем что мой китайский J-Link V8 не поддерживает Cortex M7. Перешитый свисток поддерживает. Но встроенный в кубиде софт джилинка не знает H743IG. Кароче пришлось откатиться на стлинк. Я думаю со временем кубиде обновят.

Вопрос вот в чем - у китайцев есть некий отладчик J-Link V11. Кто-то пользовался?
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

Коллеги, напомните, плз.
Кейл, на одном компе v5.28, на втором - 5.29. Делаю билд/ребилд проекту, все ОК, собрался. Давлю LOAD, загружается, говорит

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

Erase Done.
Programming Done.
Verify OK.
Application running ...
Flash Load finished at 19:17:11
и тишина. МК висит. Нажмешь кнопик RESET, заводится и работает. Выключишь и включишь питание - тоже работает.

Галочка Reset and Run стоит это та, которая Flash -> Configure Flash toold... в открывшемся окне "Options for Target 'xxxx'" вкладка Debug, педаль Setting возле окошка Use ST-link Debugger и там на вкладке Flash Download в окошке Download Function Я ПОСТАВИЛ галочку Reset and Run, а эта скотина ее игнориоует. Не помню, вроде-бы, начиная с 5.25 или 5.26 надо было ставить еще галочку Enable на следующей закладке - Pack, но (не то с 5.27, не то с 5.28) эта скотина на нее тоже не реагирует.

Вопрос стандартный: что я делаю не так?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
leha_m1986
Встал на лапы
Сообщения: 149
Зарегистрирован: Вс окт 23, 2016 17:37:09

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

Сообщение leha_m1986 »

Здравствуйте! Прошу помощи по считыванию stm32f303rct6. С stm никогда не сталкивался, st-link нет. Знаю, что можно считать через бутлоадер по USART. Подскажите с подключением и подтяжкой boot0 (и я так и не понял по поводу boot1 в этом мк).
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

leha_m1986 писал(а):Подскажите с подключением и подтяжкой boot0 (и я так и не понял по поводу boot1 в этом мк).
BOOT0 - 1.
BOOT1 - 0.

Если не поняли 1 это 3.3В. 0 это общий провод.
Ответить

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