STM32 новичку в ARM что к чему
-
Novice user
- Мудрый кот
- Сообщения: 1704
- Зарегистрирован: Вт янв 05, 2016 10:14:25
- Откуда: поселок Мелеуз
Re: STM32 новичку в ARM что к чему
Вот что выяснил-каждые 0,415 сек на выводе ресет STM32F040 у меня появляется лог 0,то есть каждые 0,415 сек STM перезагружается и программа работает сначала,потому толком ничего не выходит,загрузил простой блинк-если поставить переключение порта (на нем стоит резистор 1 ком и светодиод) 0,1 сек то успевает моргать,если поставить переключение на 0,5 сек то светодиод никогда не зажигается(в программе изначально на порту лог ноль,задержка,потом лог единичка)
Потому у меня и грабли с I2C...
Потому у меня и грабли с I2C...
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
-
Novice user
- Мудрый кот
- Сообщения: 1704
- Зарегистрирован: Вт янв 05, 2016 10:14:25
- Откуда: поселок Мелеуз
Re: STM32 новичку в ARM что к чему
VladislavS, Вот спасибо! поставил галочку на WDG_SW,мой SSD1306 заработал,вернее инициализация проходит нормально,надо писать оставшиеся функции
Re: STM32 новичку в ARM что к чему
Приветствую уважаемые, подскажите причину следующего поведения.
Имеется F0 у которого настраиваю SPI с программным CS (чаще CS управляю "железно"). Сама настройка ничего экзотического не содержит - Master, MOSI, полярности и пр. все по дефолту. И при выполнении следующего кода:
Получаем такую картину:

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

Но мне само решение мне не особо нравится и попутно на сколько поможет исправить ситуацию если использовать DMA?
Имеется 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?
Re: STM32 новичку в ARM что к чему
[uquote="pavell",url="/forum/viewtopic.php?p=3947288#p3947288"]Т.е. получается, что CS дергается в момент передачи данных, а не после. Мне вот этот момент и не понятен неужели это из за разницы в частоте тактирования GPIO и SPI (тут у меня максимально маленький делитель /2)?[/uquote]
Нет, это потому что ты CS дергаешь в момент передачи данных, а не после.
Нет, это потому что ты CS дергаешь в момент передачи данных, а не после.
- Реклама
Re: STM32 новичку в ARM что к чему
хм, т.е. перед ногодрыгом надо еще и BUSY флаг у SPI отслеживать?Reflector писал(а):Нет, это потому что ты CS дергаешь в момент передачи данных, а не после.
Ладно попробую, спасибо
Re: STM32 новичку в ARM что к чему
[uquote="pavell",url="/forum/viewtopic.php?p=3947334#p3947334"]хм, т.е. перед ногодрыгом надо еще и BUSY флаг у SPI отслеживать?[/uquote]
На предыдущей странице написано как ждать окончания передачи, даже именно для F0.
На предыдущей странице написано как ждать окончания передачи, даже именно для F0.
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3947336#p3947336"]На предыдущей странице написано как ждать окончания передачи, даже именно для F0.[/uquote]
Спасибо за наставление на путь истинный ))
В моём случае достаточно проверки BUSY флага т.к. данные посылаются одиночные. Ну соответственно это получается чуть быстрее:
- Только busy

- Busy и буффер

а nop'ы остаются лидерами, ну это так, лирика.
Спасибо за наставление на путь истинный ))
В моём случае достаточно проверки BUSY флага т.к. данные посылаются одиночные. Ну соответственно это получается чуть быстрее:
- Только busy
- Busy и буффер
а nop'ы остаются лидерами, ну это так, лирика.
Re: STM32 новичку в ARM что к чему
[uquote="pavell",url="/forum/viewtopic.php?p=3947448#p3947448"]В моём случае достаточно проверки BUSY флага т.к. данные посылаются одиночные. Ну соответственно это получается чуть быстрее[/uquote]
Во-первых, правильно писать:
Во-вторых, частота судя по всему 8MHz, но даже для нее 3us - это многовато, оптимизация хоть включена?
Во-первых, правильно писать:
Код: Выделить всё
GPIOB->BSRR = GPIO_BSRR_BS_12;
GPIOB->BSRR = GPIO_BSRR_BR_12; Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3947454#p3947454"]оптимизация хоть включена?[/uquote]
В SeS cтояла L1 поменял на "L2 speed" ситуация кардинально изменилась - пауза стала одинаковой в обоих случаях 1.6 µs
В очередной раз компилятор оказался умнее меня )
В SeS cтояла L1 поменял на "L2 speed" ситуация кардинально изменилась - пауза стала одинаковой в обоих случаях 1.6 µs
В очередной раз компилятор оказался умнее меня )
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Не получается завести DMA для изменения содержимого CCR1 таймера TIM1 на STM32F103. На F072 у меня завелось без проблем, здесь же чертовщина какая-то.
Инициализирую:
Пытаюсь запустить:
И фигвам: вместо того, чтобы один раз выдать 9 импульсов с плавно нарастающей шириной, получаю бесконечную серию импульсов длительностью 111нс с шагом в микросекунду…
Вот чего этой собаке надо?
Инициализирую:
Код: Выделить всё
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
Вот чего этой собаке надо?
Re: STM32 новичку в ARM что к чему
[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 что к чему
Ну я и осел… Спасибо!
Добавлено after 47 minutes:
А теперь - самая веселуха: как остановить таймер!
если так сделать, последний импульс обрезается, как будто бы в массиве была единица…
Проблема в том, что
срабатывает сразу же - и вызывает обработчик прерывания, который останавливает таймер. Т.е. нужно каким-то чудом указать, чтобы прерывание сработало в следующий раз.
Добавлено 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_UIERe: STM32 новичку в ARM что к чему
Добавить в массив 10й элемент и потом не использовать.Не?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: STM32 новичку в ARM что к чему
В общем, весть этот трэш решился так:
В прерывании по завершению передачи можно и так написать: TIM1->CR1=0 — ничего не изменится. Устанавливать линию в 0 внутри прерывания таймера нельзя: слишком медленно, в итоге получается лишний короткий импульс.
Код: Выделить всё
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 внутри прерывания таймера нельзя: слишком медленно, в итоге получается лишний короткий импульс.
Re: STM32 новичку в ARM что к чему
У TIM1 же есть RCR, пишешь в него количество периодов а сам таймер конфигурируешь в режиме OPM.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
Котаны здарова. Столкнулся с тем что мой китайский J-Link V8 не поддерживает Cortex M7. Перешитый свисток поддерживает. Но встроенный в кубиде софт джилинка не знает H743IG. Кароче пришлось откатиться на стлинк. Я думаю со временем кубиде обновят.
Вопрос вот в чем - у китайцев есть некий отладчик J-Link V11. Кто-то пользовался?
Вопрос вот в чем - у китайцев есть некий отладчик J-Link V11. Кто-то пользовался?
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: STM32 новичку в ARM что к чему
Коллеги, напомните, плз.
Кейл, на одном компе v5.28, на втором - 5.29. Делаю билд/ребилд проекту, все ОК, собрался. Давлю LOAD, загружается, говорит и тишина. МК висит. Нажмешь кнопик 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) эта скотина на нее тоже не реагирует.
Вопрос стандартный: что я делаю не так?
Кейл, на одном компе v5.28, на втором - 5.29. Делаю билд/ребилд проекту, все ОК, собрался. Давлю LOAD, загружается, говорит
Код: Выделить всё
Erase Done.
Programming Done.
Verify OK.
Application running ...
Flash Load finished at 19:17:11Галочка 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 что к чему
Здравствуйте! Прошу помощи по считыванию stm32f303rct6. С stm никогда не сталкивался, st-link нет. Знаю, что можно считать через бутлоадер по USART. Подскажите с подключением и подтяжкой boot0 (и я так и не понял по поводу boot1 в этом мк).
Re: STM32 новичку в ARM что к чему
BOOT0 - 1.leha_m1986 писал(а):Подскажите с подключением и подтяжкой boot0 (и я так и не понял по поводу boot1 в этом мк).
BOOT1 - 0.
Если не поняли 1 это 3.3В. 0 это общий провод.


