STM32 новичку в ARM что к чему
- Сообщения: 718
- Зарегистрирован: Сб апр 14, 2012 16:11:35
Не, кубами и халами не пользуюсь принципиально, только низкоуровневыми либами.
- Реклама
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Сообщения: 148
- Зарегистрирован: Сб июн 04, 2022 05:21:07
Если бы SWD-шные ноги были бы сожжены, то МК не прошивался бы даже.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
Значит, остается лишь грепать по всем исходникам флаги отключения SWD/JTAG: вполне возможно, что с копипастой из старого кода, оно где-то пролезло.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Serj_K",url="/forum/viewtopic.php?p=4245449#p4245449"]только низкоуровневыми либами.[/uquote]Искать где "низкоуровневая либа" с GPIOA->MODER нарукоблудила.
- Реклама
- Сообщения: 718
- Зарегистрирован: Сб апр 14, 2012 16:11:35
Вывел на экранчик железки, которую делаю, состояния некоторых регистров.
1) GPIOA->MODER для SWD в состоянии альтернативной функции как по умолчанию для порта А.
2) RCC->APB2RSTR->DBGMCURST = 0
3) RCC->APB2ENR->DBGMCUEN = 1 - включал вручную, так как по умолчанию был выключен
4) DBGMCU->CR = 6, изменение значения на работу не влияло
Вроде бы с SWD больше ничего не связано. Программирование остаётся всё равно только под ресетом.
1) GPIOA->MODER для SWD в состоянии альтернативной функции как по умолчанию для порта А.
2) RCC->APB2RSTR->DBGMCURST = 0
3) RCC->APB2ENR->DBGMCUEN = 1 - включал вручную, так как по умолчанию был выключен
4) DBGMCU->CR = 6, изменение значения на работу не влияло
Вроде бы с SWD больше ничего не связано. Программирование остаётся всё равно только под ресетом.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
А как насчет альтернативной функции? Что в GPIOA->AFR[1]? GPIOA->PUPDR? Посмотри в мануале табличку 25 в разделе 9.4.12 (GPIO register map and reset values).
И нет ли защиты?
И нет ли защиты?
Последний раз редактировалось Eddy_Em Ср июн 15, 2022 16:11:18, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 1336
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Такое бывает, когда в коде меняется функция пина. Возможно, ты не всё нашёл.Программирование остаётся всё равно только под ресетом
- Сообщения: 148
- Зарегистрирован: Сб июн 04, 2022 05:21:07
Serj_K, если вы прошиваете через ST-Link Utility, тогда в его настройках (Settings) переключите режим соединения на Hot Plug и режим сброса выберите Software System Reset (не обязательно). Потому что если назначение пинов PA13, PA14 не менялось, то подключение по SWD "на ходу" без сброса производится отправкой особой комбинации сигналов. Для этого программатор-отладчик должен быть переключен в соответствующий режим. IDE обычно самостоятельно это делает. Либо, если через IDE прошиваете, то в ее настройках проверьте подобный режим
- Сообщения: 718
- Зарегистрирован: Сб апр 14, 2012 16:11:35
Up2805, спасибо, с Software System Reset даже в нормальном режиме коннектится нормально. Теперь хоть прошивать можно без аппаратной кнопки сброса. Жаль, что BlackMagik пока не заработал. Если не заработает, придётся перенастраивать отладку под ST-Link, а он мне меньше нравится, так как не хавает китайские псевдо-стмки.
Вообще ситуация странная. Порт А был изначально настроен и отладка работала, а потом без перенастройки порта отладка отвалилась. Попробую разобраться в процессе работы.
Вообще ситуация странная. Порт А был изначально настроен и отладка работала, а потом без перенастройки порта отладка отвалилась. Попробую разобраться в процессе работы.
всем привет пол дня убил пол дня на энокодер, купленный в чипе новый но валялся давно, так и не смог его нормально запустить а оказалось что с ним что-то не так он в одну сторону ведет себя как нормальный энкодер а в другую у него почему то совпадает старт фронта, я и во и так и так пока понял что дело то в бобине
....

тут еще кокой то прикол кайл мой почему-то не запускает прерывания таймера на котором энкодер, я че тока не делал и HAL и LL и CMSIS. Потом этот же проект компилирую под CUBIDE и там все заработало сразу не пойму раньше такого не было, я его недавно скачал с оф. сайта через vpn, может кто сталкивался?
тут еще кокой то прикол кайл мой почему-то не запускает прерывания таймера на котором энкодер, я че тока не делал и HAL и LL и CMSIS. Потом этот же проект компилирую под CUBIDE и там все заработало сразу не пойму раньше такого не было, я его недавно скачал с оф. сайта через vpn, может кто сталкивался?
Всем добра строи все свой бп на мк набросал уже почти программу осталось только настройка. Скажу несколько слов в защиту не любителей халакуба, пытался запустить обычный ацп на мк f373с применением библиотеки LL, на регулярном канале все быстро заработало а вот на ижекционном(прошу извинить за мой французский) ничего так и не заработало переписал инициализацию вручную и все очень быстро заработало. Так что самый большой плюс куба скорость в данном случае как то сильно пострадали, вот и выходит что лучше бы вручную все прописывал меньше времени ушло бы... Ну да бог с ним двигаемся дальше Спрошу тут, т.к. не знаю как разбить вопрос и отправить его часть в "питание". У меня будет вполне себе обычная схема БП коих на просторах интерната много т.к. 2 операционника управляют одним или более транзисторами, один отвечает за ток другой за напряжение. Вот только опорное напряжение будет формировать МК от поворота энкодера, это я уже все запрограммировал и сам себя МК меряет нормально, т.е. АЦП меряет выход ЦАП. Теперь вопрос стоит об измерение на выходе, думки у меня такие как обычно операционник и МК ну тоесть вариант 2, но тут мучают всякие нехорошие мысли у сигма-дельта АЦП можно вывести оба вывода в наружу и + и - а еще и можно включить усиление в 32 раза вот и думаю о варианте 1, но тут возникнет другая проблема как защитить выводы МК хватит ли этого коэф.... Что скажут знатоки?

Калибруй смещение при пуске, и всё будет ОК.
- Сообщения: 1743
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Serj_K",url="/forum/viewtopic.php?p=4245261#p4245261"]Пин BOOT0 сидит на земле, то есть используется запуск из прошивки флеш[/uquote]При отладке под эмулятором, лучше делать как раз наоборот. Чтобы предыдущее содержимое флеши никак не влияло на старт новой отладочной сессии.
есть такой вопросик. можно ли уговорить компилятор более активно использовать адресацию со смещением? (F103, Keil.v5, C (не плюсы), оптимизация -время) Конкретизирую:
в обработчике исп. 9 адресов (2 переменные, 3 рег. SPI, 4 рег. TIM1) компиль только для трех из них исп. обращение по смещению.
или альтернатива только вставка asm?
сейчас мне пока не критично, но на будущее заинтересовал этот вопрос.
(в рабочее время выхода в тырнет не имею, если что отвечу только вечером)
в обработчике исп. 9 адресов (2 переменные, 3 рег. SPI, 4 рег. TIM1) компиль только для трех из них исп. обращение по смещению.
или альтернатива только вставка asm?
сейчас мне пока не критично, но на будущее заинтересовал этот вопрос.
(в рабочее время выхода в тырнет не имею, если что отвечу только вечером)
Спойлер
Код: Выделить всё
void SPI2_IRQHandler(void){
uint16_t h;
uint32_t w;
h = SPI2->DR;
if(wi) {
wi = wi|h;
TIM1->CR1 = 0; TIM1->SR = 0; TIM1->DIER = 0;
SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
// uint32_t z,s;
// z=w; s=0;
// while (z){if (z&1) {s++;} z>>=1;}
// if (s&1) break;
// wi=0;
status |= 1;
}else{
if (adri==(h>>8)) wi =(h<<16);
else { // stop restart
TIM1->CR1 = 0; TIM1->SR = 0;
SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
TIM1->EGR = TIM_EGR_UG;
TIM1->DIER = TIM_DIER_CC3IE;
TIM1->CR1 |= TIM_CR1_CEN;
}
}
}
листинг начало:
0x08001D86 B4F0 PUSH {r4-r7}
0x08001D88 4810 LDR r0,[pc,#64] ; @0x08001DCC
0x08001D8A F8B0C000 LDRH r12,[r0,#0x00]
0x08001D8E 481B LDR r0,[pc,#108] ; @0x08001DFC
0x08001D90 6887 LDR r7,[r0,#0x08]
0x08001D92 4E1E LDR r6,[pc,#120] ; @0x08001E0C
0x08001D94 4A0E LDR r2,[pc,#56] ; @0x08001DD0
0x08001D96 2100 MOVS r1,#0x00
0x08001D98 4B0A LDR r3,[pc,#40] ; @0x08001DC4
0x08001D9A 1F35 SUBS r5,r6,#4
0x08001D9C 1D14 ADDS r4,r2,#4
0x08001D9E B3CF CBZ r7,0x08001E14
0x08001DA0 6887 LDR r7,[r0,#0x08]
0x08001DA2 EA470C0C ORR r12,r7,r12
0x08001DA6 F8C0C008 STR r12,[r0,#0x08]
0x08001DAA 8019 STRH r1,[r3,#0x00]
0x08001DAC 8031 STRH r1,[r6,#0x00]
0x08001DAE 8029 STRH r1,[r5,#0x00]
0x08001DB0 8813 LDRH r3,[r2,#0x00]
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
a797945, переходите на 6-й компилятор. Оптимизация -O3.
Спойлер
Код: Выделить всё
7: extern "C" void SPI2_IRQHandler(){
8: uint16_t h;
9: uint32_t w;
10: h = SPI2->DR;
0x080005E0 F6430000 MOVW r0,#0x3800
11: if(wi) {
0x080005E4 F6400190 MOVW r1,#0x890
0x080005E8 F2C40000 MOVT r0,#0x4000
0x080005EC F2C20100 MOVT r1,#0x2000
10: h = SPI2->DR;
11: if(wi) {
0x080005F0 68C2 LDR r2,[r0,#0x0C]
0x080005F2 880B LDRH r3,[r1,#0x00]
0x080005F4 B1C3 CBZ r3,0x08000628
12: wi = wi|h;
0x080005F6 880B LDRH r3,[r1,#0x00]
0x080005F8 431A ORRS r2,r2,r3
0x080005FA 800A STRH r2,[r1,#0x00]
0x080005FC F6424100 MOVW r1,#0x2C00
0x08000600 F2C40101 MOVT r1,#0x4001
0x08000604 2200 MOVS r2,#0x00
13: TIM1->CR1 = 0;
0x08000606 600A STR r2,[r1,#0x00]
14: TIM1->SR = 0;
0x08000608 610A STR r2,[r1,#0x10]
15: TIM1->DIER = 0;
0x0800060A 60CA STR r2,[r1,#0x0C]
16: SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
0x0800060C 6801 LDR r1,[r0,#0x00]
0x0800060E F4417180 ORR r1,r1,#0x100
0x08000612 6001 STR r1,[r0,#0x00]
0x08000614 6042 STR r2,[r0,#0x04]
17: status |= 1;
18: }else{
19: if (adri==(h>>8)) wi =(h<<16);
20: else { // stop restart
21: TIM1->CR1 = 0; TIM1->SR = 0;
22: SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
23: TIM1->EGR = TIM_EGR_UG;
24: TIM1->DIER = TIM_DIER_CC3IE;
25: TIM1->CR1 |= TIM_CR1_CEN;
26: }
27: }
0x08000616 F6400094 MOVW r0,#0x894
0x0800061A F2C20000 MOVT r0,#0x2000
0x0800061E 6801 LDR r1,[r0,#0x00]
0x08000620 F0410101 ORR r1,r1,#0x01
0x08000624 6001 STR r1,[r0,#0x00]
28: }
0x08000626 4770 BX lr
19: if (adri==(h>>8)) wi =(h<<16);
20: else { // stop restart
0x08000628 F6400398 MOVW r3,#0x898
0x0800062C F2C20300 MOVT r3,#0x2000
0x08000630 881B LDRH r3,[r3,#0x00]
0x08000632 F3C22207 UBFX r2,r2,#8,#8
0x08000636 429A CMP r2,r3
0x08000638 BF02 ITTT EQ
0x0800063A 2000 MOVEQ r0,#0x00
0x0800063C 8008 STRHEQ r0,[r1,#0x00]
0x0800063E 4770 BXEQ lr
0x08000640 F6424100 MOVW r1,#0x2C00
0x08000644 F2C40101 MOVT r1,#0x4001
0x08000648 2200 MOVS r2,#0x00
21: TIM1->CR1 = 0; TIM1->SR = 0;
0x0800064A 600A STR r2,[r1,#0x00]
0x0800064C 610A STR r2,[r1,#0x10]
22: SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
0x0800064E 6803 LDR r3,[r0,#0x00]
0x08000650 F4437380 ORR r3,r3,#0x100
0x08000654 6003 STR r3,[r0,#0x00]
0x08000656 6042 STR r2,[r0,#0x04]
0x08000658 2001 MOVS r0,#0x01
23: TIM1->EGR = TIM_EGR_UG;
0x0800065A 6148 STR r0,[r1,#0x14]
0x0800065C 2008 MOVS r0,#0x08
24: TIM1->DIER = TIM_DIER_CC3IE;
0x0800065E 60C8 STR r0,[r1,#0x0C]
25: TIM1->CR1 |= TIM_CR1_CEN;
26: }
27: }
0x08000660 6808 LDR r0,[r1,#0x00]
0x08000662 F0400001 ORR r0,r0,#0x01
0x08000666 6008 STR r0,[r1,#0x00]
28: }
0x08000668 4770 BX lr
0x0800066A 0000 MOVS r0,r0- Сообщения: 333
- Зарегистрирован: Ср мар 09, 2016 08:07:41
ковыряю один из клонов stm32 на m4f.
обработчик прерывания таймера завершается кодом:
проблема в том, что флаг прерывания не снимается с первого раза. прерывание отрабатывает по два раза. поставил барьерную инструкцию DSB после упомянутого кода, заработало как надо.
это нормальное поведение для STM32? кто-нибудь сталкивался?
обработчик прерывания таймера завершается кодом:
Код: Выделить всё
TIM4->SR &= ~(0x01);это нормальное поведение для STM32? кто-нибудь сталкивался?
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Нормально. Барьер не нужен, нужна задержка. Просто переместите команду очистки флага ближе к началу обработчика прерывания. А саму команду я бы упростил до записи нуля.
- Сообщения: 333
- Зарегистрирован: Ср мар 09, 2016 08:07:41
[uquote="VladislavS",url="/forum/viewtopic.php?p=4295410#p4295410"]Нормально. Барьер не нужен, нужна задержка. Просто переместите команду очистки флага ближе к началу обработчика прерывания. А саму команду я бы упростил до записи нуля.[/uquote]
угу. проверил на F103. та же самая фигня.
угу. проверил на F103. та же самая фигня.


