FW 심화 과정/[2] STM32심화실습

0802 어셈블리어로 보드 제어 (sw / led)

천숭이 2022. 8. 2. 16:54
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