Перейти к содержанию
    

Всем доброго!

STM32F030, хотя какая разница в данном случае.

Есть такой фрагмент:   

    GPIOA->MODER &= ~GPIO_MODER_MODER6;                    //порт A бит 6 - вход
    GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;                    //висит в воздухе, подтяжка в схеме

//********** Определяем наличие 1 на входе
    if(((GPIOA->IDR) & 0x40) == 0x40)                       
    {
        goto _1; 					// 1                                                                      
    }
    else
    {
        goto _2; 					// 0                                           
    }

Смысл простой, определяем наличие 1 или 0 на входе порта и дальше идем лесом или полем.

Режиме отладки - не зависимо от сигнала на входе порта всегда переходит на goto _2; те выполняется конструкция else. При этом отладчик адекватно показывает наличие 1 или 0 на входе порта.

В данном случае для меня не важно, куда что идет в реальности, важно, что показывает отладчик. Верить или не верить. Если он врет на простых вещах, то как жить в этом мире? Или всё таки я туплю? При всех глюках stm32, что встречаются в тырнете, всегда грешить на stm не хочется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Vlad_G сказал:

Режиме отладки - не зависимо от сигнала на входе порта всегда переходит на goto _2; те выполняется конструкция else. При этом отладчик адекватно показывает наличие 1 или 0 на входе порта.

Реально отладчик показывает именно "наличие 1 или 0 на входе порта"??? :shok:

У вас уникальный отладчик, с уникальными функциями! :biggrin: Ибо обычные показывают только содержимое регистров периферии.

Цитата

При всех глюках stm32, что встречаются в тырнете, всегда грешить на stm не хочется.

Грешить в любом случае нехорошо. Надо просто заглянуть в ассемблерный листинг данного фрагмента.

 

PS: Хотя конечно осознаю, что "CubeIDE" и "ассемблер" - видимо вещи несовместимые по природе.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, Vlad_G said:

if(((GPIOA->IDR) & 0x40) == 0x40) 

Понизьте количество скобок, а? Посочувствуйте читающим)

12 minutes ago, Vlad_G said:

Если он врет на простых вещах, то как жить в этом мире?

Не живите. Средств перейти в иной мир сейчас предостаточно. Можете выйти без маски на улицу. Но всё же, не делайте таких громких заявлений. Для начала:

1. Посмотрите, что у вас физически на пине микроконтроллера.

2. Проверьте настройки данного пина (тактирование, направление).

3. Убедитесь, что ваша программа работает правильно.

3 minutes ago, jcxz said:

Надо просто заглянуть в ассемблерный листинг данного фрагмента.

Не пугайте людей))))))))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, отладчик уникальный... Да, показывает состояние регистра IDR, ну а это состояние как соотносится с реальностью .... .!. знает. Скобки - это уже варианты, думал, мало ли какие неоднозначности при компиляции.

Поставил: if( 0x40 == 0x40) - переход сделал правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Vlad_G said:

Да, показывает состояние регистра IDR

Да при чём здесь регистр-то? На ножке что? Посмотрите измерительным прибором. Я так всегда делаю в спорных ситуациях. Дел на 1 минуту, даже меньше, и хотя бы понятно, куда смотреть: в железо или программу.

8 minutes ago, Vlad_G said:

неоднозначности при компиляции

Да, неоднозначности есть) Они называются стандарт) Но можете начать с книжки. Керниган, Ричи "Язык Си". Обязательно третье издание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, haker_fox said:

Да при чём здесь регистр-то? На ножке что?

В начале я написал, что отладчик показывает адекватно... мне показалось, что этого достаточно. Смотрю осциллографом, ц"ы"фровым. Сейчас подтянул резистором к питанию - 1 всегда висит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Vlad_G said:

мне показалось, что этого достаточно

Я же вас не знаю, и рядом с вами не нахожусь. Откуда же мне знать ваш уровень адекватности, поэтому и задаю уточняющие вопросы. Если IDR читает адекватно, как вы сказали, то условие тоже дожно выполняться. Т.к. отладчик и программа читают регистры одинаково. Тогда:

1. Номер ножки в студию.

2. Ассемблерный листине с условным оператором +- десяток строк в студию.

3. Уровень оптимизации компилятора тоже в студию.

4. Что находится по меткам goto_1 и goto_2.

В вашем случае мог просто сработать оптимизатор. Выбросить условие из программы, если метки ссылаются на один и тот же фрагмент кода. Или на одинаковые фрагменты кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ножка - РА6

Листинг:

if(( (GPIOA->IDR) & 0x40) == 0x40)                        //
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
 26               goto _2;                                            //
0800064a:   nop     ; (mov r8, r8)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Vlad_G said:

Листинг:

Больше строк: от условного оператора выше и ниже по десять строк. Хотя и тут видно, что со считанным значением ничего не делается. Исходника тоже больше дайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вся подпрограмма:

    GPIOA->MODER &= ~GPIO_MODER_MODER6;						//порт A бит 6 - вход
	GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;						//висит в воздухе, подтяжка в схеме

	GPIOA->MODER |= GPIO_MODER_MODER5_0;					//порт A бит 5 - выход
	GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5;						//порт A бит 5 пушпул
	GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5_1;				//высокая скорость порта

	GPIOA->BSRR = GPIO_BSRR_BS_5;							//РА5 = 1

//********** Определяем наличие несущей
	if(GPIOA->IDR & 0x40 == 0x40)						    //определяем наличие несущей

	{
		goto _1;											//несущая есть
	}
	else
	{
		goto _2;											//несущей нет
	}
_2:	;
_1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6

	EXTI->RTSR |= 0x40; 									//прерывание по фронту
	EXTI->FTSR |= 0x40; 									//прерывание по спаду

	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий

Оптимизация выключена - NONE (-O0)

Листинг:

push    {r7, lr}
080005e6:   add     r7, sp, #0
  9       	GPIOA->MODER &= ~GPIO_MODER_MODER6;						//порт A бит 6 - вход
080005e8:   movs    r3, #144        ; 0x90
080005ea:   lsls    r3, r3, #23
080005ec:   ldr     r2, [r3, #0]
080005ee:   movs    r3, #144        ; 0x90
080005f0:   lsls    r3, r3, #23
080005f2:   ldr     r1, [pc, #156]  ; (0x8000690 <GpioInitDali+172>)
080005f4:   ands    r2, r1
080005f6:   str     r2, [r3, #0]
 10       	GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6;						//висит в воздухе, подтяжка в схеме
080005f8:   movs    r3, #144        ; 0x90
080005fa:   lsls    r3, r3, #23
080005fc:   ldr     r2, [r3, #12]
080005fe:   movs    r3, #144        ; 0x90
08000600:   lsls    r3, r3, #23
08000602:   ldr     r1, [pc, #140]  ; (0x8000690 <GpioInitDali+172>)
08000604:   ands    r2, r1
08000606:   str     r2, [r3, #12]
 12       	GPIOA->MODER |= GPIO_MODER_MODER5_0;					//порт A бит 5 - выход
08000608:   movs    r3, #144        ; 0x90
0800060a:   lsls    r3, r3, #23
0800060c:   ldr     r2, [r3, #0]
0800060e:   movs    r3, #144        ; 0x90
08000610:   lsls    r3, r3, #23
08000612:   movs    r1, #128        ; 0x80
08000614:   lsls    r1, r1, #3
08000616:   orrs    r2, r1
08000618:   str     r2, [r3, #0]
 13       	GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5;						//порт A бит 5 пушпул
0800061a:   movs    r3, #144        ; 0x90
0800061c:   lsls    r3, r3, #23
0800061e:   ldr     r2, [r3, #4]
08000620:   movs    r3, #144        ; 0x90
08000622:   lsls    r3, r3, #23
08000624:   movs    r1, #32
08000626:   bics    r2, r1
08000628:   str     r2, [r3, #4]
 14       	GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5_1;				//высокая скорость порта
0800062a:   movs    r3, #144        ; 0x90
0800062c:   lsls    r3, r3, #23
0800062e:   ldr     r2, [r3, #8]
08000630:   movs    r3, #144        ; 0x90
08000632:   lsls    r3, r3, #23
08000634:   movs    r1, #128        ; 0x80
08000636:   lsls    r1, r1, #4
08000638:   orrs    r2, r1
0800063a:   str     r2, [r3, #8]
 16       	GPIOA->BSRR = GPIO_BSRR_BS_5;							//РА5 = 1
0800063c:   movs    r3, #144        ; 0x90
0800063e:   lsls    r3, r3, #23
08000640:   movs    r2, #32
08000642:   str     r2, [r3, #24]
 19       	if(GPIOA->IDR & 0x40 == 0x40)						//определяем наличие несущей
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
 26       		goto _2;											//несущей нет
0800064a:   nop     ; (mov r8, r8)
 29       _1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
0800064c:   ldr     r3, [pc, #68]   ; (0x8000694 <GpioInitDali+176>)
0800064e:   ldr     r2, [r3, #12]
08000650:   ldr     r3, [pc, #64]   ; (0x8000694 <GpioInitDali+176>)
08000652:   ldr     r1, [pc, #68]   ; (0x8000698 <GpioInitDali+180>)
08000654:   ands    r2, r1
08000656:   str     r2, [r3, #12]
 30       	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6
08000658:   ldr     r3, [pc, #64]   ; (0x800069c <GpioInitDali+184>)
0800065a:   ldr     r2, [r3, #0]
0800065c:   ldr     r3, [pc, #60]   ; (0x800069c <GpioInitDali+184>)
0800065e:   movs    r1, #64 ; 0x40
08000660:   orrs    r2, r1
08000662:   str     r2, [r3, #0]
 32       	EXTI->RTSR |= 0x40; 									//прерывание по фронту
08000664:   ldr     r3, [pc, #52]   ; (0x800069c <GpioInitDali+184>)
08000666:   ldr     r2, [r3, #8]
08000668:   ldr     r3, [pc, #48]   ; (0x800069c <GpioInitDali+184>)
0800066a:   movs    r1, #64 ; 0x40
0800066c:   orrs    r2, r1
0800066e:   str     r2, [r3, #8]
 33       	EXTI->FTSR |= 0x40; 									//прерывание по спаду
08000670:   ldr     r3, [pc, #40]   ; (0x800069c <GpioInitDali+184>)
08000672:   ldr     r2, [r3, #12]
08000674:   ldr     r3, [pc, #36]   ; (0x800069c <GpioInitDali+184>)
08000676:   movs    r1, #64 ; 0x40
08000678:   orrs    r2, r1
0800067a:   str     r2, [r3, #12]
 35       	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
0800067c:   movs    r0, #7
0800067e:   bl      0x80004d4 <__NVIC_EnableIRQ>
 36       	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий
08000682:   movs    r1, #1
08000684:   movs    r0, #7
08000686:   bl      0x8000508 <__NVIC_SetPriority>
 37       }
0800068a:   nop     ; (mov r8, r8)
0800068c:   mov     sp, r7
0800068e:   pop     {r7, pc}
08000690:   ldmia   r7, {r0, r1, r2, r3, r4, r5, r6, r7}
08000692:   vaddl.u<illegal width 64>       q8, d15, d0
08000696:   ands    r1, r0
08000698:   bl      0x810069a
0800069c:   lsls    r0, r0, #16
0800069e:   ands    r1, r0

Вижу, что  в листе есть только goto _2; а goto _1; нет.

Я полагал, что если оптимизации нет, то компилятор должен (как бы должен) компилировать все подряд.

Какое ему дело до того, что метки идут в одно и тоже место.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раскидал метки:

if(GPIOA->IDR & 0x40 == 0x40)								//определяем наличие несущей
	{
		goto _1;											//несущая есть
	}
	else
	{
		goto _2;											//несущей нет
	}

_1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
	EXTI->IMR |= 0x40; 										//Прерывание от 6-й линии EXTI6

	EXTI->RTSR |= 0x40; 									//прерывание по фронту
_2:	EXTI->FTSR |= 0x40; 									//прерывание по спаду

	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий

Лист:

if(GPIOA->IDR & 0x40 == 0x40)											//определяем наличие несущей
08000644:   movs    r3, #144        ; 0x90
08000646:   lsls    r3, r3, #23
08000648:   ldr     r3, [r3, #16]
0800064a:   movs    r2, #1
0800064c:   ands    r3, r2
0800064e:   beq.n   0x8000678 <GpioInitDali+148>
 21       		goto _1;												//несущая есть
08000650:   nop     ; (mov r8, r8)
 28       _1:	SYSCFG->EXTICR[1] &= ~SYSCFG_EXTICR2_EXTI6; 			//выбираем порт A пин 6 для внешнего прерывания
08000652:   ldr     r3, [pc, #76]   ; (0x80006a0 <GpioInitDali+188>)
08000654:   ldr     r2, [r3, #12]
08000656:   ldr     r3, [pc, #72]   ; (0x80006a0 <GpioInitDali+188>)
08000658:   ldr     r1, [pc, #72]   ; (0x80006a4 <GpioInitDali+192>)
0800065a:   ands    r2, r1
0800065c:   str     r2, [r3, #12]
 29       	EXTI->IMR |= 0x40; 											//Прерывание от 6-й линии EXTI6
0800065e:   ldr     r3, [pc, #72]   ; (0x80006a8 <GpioInitDali+196>)
08000660:   ldr     r2, [r3, #0]
08000662:   ldr     r3, [pc, #68]   ; (0x80006a8 <GpioInitDali+196>)
08000664:   movs    r1, #64 ; 0x40
08000666:   orrs    r2, r1
08000668:   str     r2, [r3, #0]
 31       	EXTI->RTSR |= 0x40; 									//прерывание по фронту
0800066a:   ldr     r3, [pc, #60]   ; (0x80006a8 <GpioInitDali+196>)
0800066c:   ldr     r2, [r3, #8]
0800066e:   ldr     r3, [pc, #56]   ; (0x80006a8 <GpioInitDali+196>)
08000670:   movs    r1, #64 ; 0x40
08000672:   orrs    r2, r1
08000674:   str     r2, [r3, #8]
08000676:   b.n     0x800067a <GpioInitDali+150>
 25       		goto _2;											//несущей нет
08000678:   nop     ; (mov r8, r8)
 32       _2:	EXTI->FTSR |= 0x40; 									//прерывание по спаду
0800067a:   ldr     r3, [pc, #44]   ; (0x80006a8 <GpioInitDali+196>)
0800067c:   ldr     r2, [r3, #12]
0800067e:   ldr     r3, [pc, #40]   ; (0x80006a8 <GpioInitDali+196>)
08000680:   movs    r1, #64 ; 0x40
08000682:   orrs    r2, r1
08000684:   str     r2, [r3, #12]
 34       	NVIC_EnableIRQ(EXTI4_15_IRQn); 							//включили прерывание по измению на РА6 EXTI0_1
08000686:   movs    r0, #7
08000688:   bl      0x80004d4 <__NVIC_EnableIRQ>
 35       	NVIC_SetPriority(EXTI4_15_IRQn,1); 						//установили приоритет EXTI4_15 0 - самый высокий
0800068c:   movs    r1, #1
0800068e:   movs    r0, #7
08000690:   bl      0x8000508 <__NVIC_SetPriority>
 36       }
08000694:   nop     ; (mov r8, r8)
08000696:   mov     sp, r7
08000698:   pop     {r7, pc}
0800069a:   nop     ; (mov r8, r8)
0800069c:   ldmia   r7, {r0, r1, r2, r3, r4, r5, r6, r7}
0800069e:   vaddl.u<illegal width 64>       q8, d15, d0
080006a2:   ands    r1, r0
080006a4:   bl      0x81006a6
080006a8:   lsls    r0, r0, #16
080006aa:   ands    r1, r0

Теперь есть и goto _1 и goto _2, но все равно переходит на goto _2, хотя на РА6 висит единица и по замыслу должен быть переход на goto _1.

Программа работает, естественно в изначальном варианте. Заглушки сделал на будущее, потом буду делать варианты в зависимости от наличия 1 на РА6. Сейчас пока отлаживаю другие части не стал усложнять. В отладчик полез за другим надом, но наткнулся на эту фигню. 

Изменено пользователем Vlad_G

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Vlad_G said:

movs r2, #1

Вот это в упор не понимаю при маске 0x40. Но условный переход после раскидывания меток всё-таки появился.

9 minutes ago, Vlad_G said:

movs r3, #144 ; 0x90

И что за адрес такой не понимаю.

А как GPIOA  у вас описан?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, Vlad_G said:

ldr r3, [r3, #16]

Вот здесь r3 совпадает с тем, что отладчик читает в IDR?

1 minute ago, Tolyaha said:

тактирование порта включено правильно?

Всё это я автора просил проверить вот тут

1 hour ago, haker_fox said:

Для начала:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...