Я новичок в программировании сборки на плате обнаружения stm32f.Я пытаюсь написать программу (файл .S) в сборке, которую я могу вызвать на C. Я хочу, чтобы программа сборки проверила, нажата ли пользовательская кнопка.
Я провел некоторое исследование и обнаружил, чтокнопка пользователя находится в порту GPIOA, и к ее данным можно получить доступ из пространства IDR.В частности, я считаю, что первый бит GPIOA-> IDR переключается на 1 при нажатии кнопки пользователя.
Вот код, который я написал:
.global checkB1
.thumb_func
checkB1:
@; accessing B1
ldr r3,=GPIOA_BASE
ldr r2, [r3,#IDR]
and r0, r2, #GPIO_IDR_IDR_0 @; check if 1 and put in r0
bx lr
У меня нет проблемвызывает функцию в C, но r0 никогда не меняется на 1, когда пользовательская кнопка нажата?
Я довольно растерялся из-за того, что я делаю неправильно, и все, что я исследовал, делает весь процесс в C, и на самом деле это не такпомог мне.Если кто-нибудь знает об ошибке, она будет оценена.
РЕДАКТИРОВАТЬ:
Я также хотел бы включить мой код инициализации, который настраивает GPIOA:
.global initB1
.thumb_func
initB1: @;configure B1 as an input
@; make sure GPIOA is enabled
ldr r3,=RCC_BASE
ldr r2,[r3,#RCC_AHB1ENR]
orr r2,#1 @; set enable bit
str r2,[r3,#RCC_AHB1ENR]
@; configuring B1
ldr r3,=GPIOA_BASE
@; configure B1 as an input
ldr r2,[r3,#MODER]
bic r2,#3 @;clear current value if any of A0 mode
@; new value of A0 mode is general purpose input
str r2,[r3,#MODER] @; ..
@; configure input of B1 as pulldown
ldr r2,[r3,#OPUPDR]
bic r2,#3 @;clear current value if any of control bits
orr r2,#2 @; pulldown mode (bit value: 10)
str r2,[r3,#OPUPDR] @; ..
bx lr