int main()
{
// clock enable for PORT-D, PORT-A
rRCC_AHB1ENR = rRCC_AHB1ENR | (0x1<<3) | (0x1<<0);
// PD12 --> output
int tmp = rGPIOD_MODER & ~ (0x3<<24);
rGPIOD_MODER = tmp | (0x1<<24);
// PA0 --> input
rGPIOA_MODER = rGPIOA_MODER & ~ (0x3<<0);
while (1)
{
if (rGPIOA_IDR & (0x1<<0))
{
rGPIOD_ODR = rGPIOD_ODR | (0x1 << 12);
}
else
{
rGPIOD_ODR = rGPIOD_ODR & ~(0x1 << 12);
}
}
}
문제 : 위의 c코드를 어셈블리어로 변환하기
<내 코드>
rRCC_AHB1ENR EQU 0x40023830
rGPIOA_MODER EQU 0x40020000
rGPIOA_IDR EQU 0x40020010
rGPIOD_MODER EQU 0x40020C00
rGPIOD_ODR EQU 0x40020C14
EXPORT gpio_control
EXPORT Loop
EXPORT ledon
EXPORT ledoff
AREA |.text|, CODE, READONLY
gpio_control PROC
ldr r1, = rRCC_AHB1ENR
ldr r0, [r1]
orr r0, r0, #(0x1<<3)
orr r0, r0, #(0x1<<0)
str r0, [r1]
;
ldr r1, = rGPIOD_MODER
ldr r2, [r1]
bic r2, r2, #(0x3 << 24)
orr r2, r2, #(0x1<<24)
str r2, [r1]
;
ldr r1, = rGPIOA_MODER
ldr r4, [r1]
bic r4, r4 ,#(0x03 << 0)
str r4, [r1]
;
b Loop
Loop
;nop
ldr r7, =rGPIOA_IDR
ldr r5, [r7]
ldr r1, = rGPIOD_ODR
ldr r3, [r1]
ands r5, r5, (0x01<<0)
orrne r3, r3, #(0x1 << 12)
biceq r3, r3, #(0x1 << 12)
str r3, [r1]
b Loop
beq ledon
cmp r5, #0x0
beq ledoff
b Loop
mov pc, lr
ledon
ldr r1, = rGPIOD_ODR
ldr r3, [r1]
orr r3, r3, #(0x1 << 12)
;bic r3, r3, #(0x1 << 12)
str r3, [r1]
b Loop
ledoff
ldr r1, = rGPIOD_ODR
ldr r3, [r1]
;orr r3, r3, #(0x1 << 12)
bic r3, r3, #(0x1 << 12)
str r3, [r1]
b Loop
ENDP
END
<교수님 수정해주신 정답 코드>
rRCC_AHB1ENR EQU 0x40023830
rGPIOA_MODER EQU 0x40020000
rGPIOA_IDR EQU 0x40020010
rGPIOD_MODER EQU 0x40020C00
rGPIOD_ODR EQU 0x40020C14
EXPORT gpio_control
EXPORT Loop
AREA |.text|, CODE, READONLY
gpio_control PROC
ldr r1, = rRCC_AHB1ENR
ldr r0, [r1]
orr r0, r0, #(0x1<<3)
orr r0, r0, #(0x1<<0)
str r0, [r1] ; 최종적으로 값을 쓰기
;
ldr r1, = rGPIOD_MODER
ldr r2, [r1]
bic r2, r2, #(0x3 << 24)
orr r2, r2, #(0x1<<24)
str r2, [r1]
;
ldr r1, = rGPIOA_MODER
ldr r4, [r1]
bic r4, r4 ,#(0x03 << 0)
str r4, [r1]
;
b Loop
Loop
;nop
ldr r7, =rGPIOA_IDR
ldr r5, [r7]
ldr r1, = rGPIOD_ODR
ldr r3, [r1]
ands r5, r5, (0x01<<0) ;
orrne r3, r3, #(0x1 << 12)
biceq r3, r3, #(0x1 << 12)
str r3, [r1] ; odr값 store
b Loop
mov pc, lr
ENDP
END
- 실행결과
파란색 스위치 누르면 led ON
스위치 안누르면 led OFF
'FW 심화 과정 > [2] STM32심화실습' 카테고리의 다른 글
0804 인터럽트 실습 완성 코드 (0) | 2022.08.04 |
---|---|
0804 인터럽트 ** (0) | 2022.08.04 |
0803 NVIC, BUS Interfaces (0) | 2022.08.03 |
[C] 유용한 함수작성 (0) | 2022.08.01 |
0729 C프로그래밍 기초 17~ (0) | 2022.07.29 |
0728 C프로그래밍 기초 15~16강 (0) | 2022.07.28 |