ex02.3_SW_int - withrobot/myCortex-STM32F4 GitHub Wiki

κ°œμš”

SW_int μ˜ˆμ œλŠ” STM32 MCU의 GPIO μž…λ ₯ μΈν„°λŸ½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 예λ₯Ό 보여주기 μœ„ν•΄ μŠ€μœ„μΉ˜ μž…λ ₯을 μΈν„°λŸ½νŠΈλ‘œ λ°›μ•„ μ²˜λ¦¬ν•˜λŠ” 예제λ₯Ό λ§Œλ“  κ²ƒμž…λ‹ˆλ‹€. λ³Έ 예제λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” Switch λ“œλΌμ΄λ²„μ—μ„œ μ•ˆλ‚΄ν•˜λŠ” 바와 같이 λ³„λ„μ˜ μŠ€μœ„μΉ˜ 회둜λ₯Ό ꡬ성해야 ν•©λ‹ˆλ‹€.

κ΄€λ ¨ Peripheral

κ΄€λ ¨ Driver

μ†ŒμŠ€ μ‚΄νŽ΄λ³΄κΈ°

main.c 파일 ν•˜λ‚˜λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ex02.2_SW μ˜ˆμ œμ™€ λ‹€λ₯Έ λΆ€λΆ„λ§Œ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

15 line:

SW_INT_INIT();

μŠ€μœ„μΉ˜ κ΄€λ ¨ νŽ˜λ¦¬νŽ˜λŸ΄λ“€μ„ μ΄ˆκΈ°ν™”ν•˜κ³  μΈν„°λŸ½νŠΈ 섀정을 ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μŠ€μœ„μΉ˜ μΈν„°λŸ½νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 졜초 ν•œλ²ˆ μ΄ˆκΈ°ν™”κ°€ 이루어져야 ν•©λ‹ˆλ‹€.

19 line:

__WFI();

WFIλŠ” Wait For Interrupt μž…λ‹ˆλ‹€. 즉 이 ν•¨μˆ˜λ₯Ό λ§Œλ‚˜λ©΄ MCUμ—μ„œ 아무 μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•  λ•Œ 가지 μ €μ „λ ₯ λŒ€κΈ°μƒνƒœλ‘œ λ©ˆμΆ°μžˆμŠ΅λ‹ˆλ‹€.

24 line: // SW1 : PA0(EXTI0) Interrupt Handler void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(SW_1_EXTI_LINE) != RESET) { LED_R_TOGGLE(); EXTI_ClearITPendingBit(SW_1_EXTI_LINE); } } PA0ν•€μ—μ„œ λ°œμƒν•˜λŠ” μΈν„°λŸ½νŠΈλ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•Έλ“€λŸ¬ ν•¨μˆ˜μž…λ‹ˆλ‹€. PA0핀에 μΈν„°λŸ½νŠΈλŠ” EXTI0_IRQHandler()둜 λ“€μ–΄μ˜΅λ‹ˆλ‹€. PB0, PC0, PD0 등도 μ—­μ‹œ 이 ν•Έλ“€λŸ¬μ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€. 즉 λͺ¨λ“  포트의 0번 핀을 μœ„ν•œ 곡용 μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬μž…λ‹ˆλ‹€. 이처럼 곡용으둜 μ‚¬μš©ν•˜λŠ” μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬μ—μ„œλŠ” μ‹€μ œ μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•œ 핀이 정말 PA0인지, μ•„λ‹ˆλ©΄ PB0λ‚˜ PC0인지 ν™•μΈν•˜κ³  그에 따라 λ‹€λ₯Έ λ™μž‘μ„ ν•˜κ²Œ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이 μ˜ˆμ œμ—μ„œλŠ” EXTI0에 μ—°κ²°ν•œ μΈν„°λŸ½νŠΈ μ†ŒμŠ€λŠ” PA0 밖에 μ—†μœΌλ―€λ‘œ λ³„λ„μ˜ 확인 μ½”λ“œλŠ” 넣지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

이 ν•Έλ“€λŸ¬μ—μ„œλŠ” 적색 LEDλ₯Ό λ°˜μ „μ‹œν‚€κ³  μΈν„°λŸ½νŠΈ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•΄ μ€λ‹ˆλ‹€. μΈν„°λŸ½νŠΈ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™” ν•΄ 주지 μ•ŠμœΌλ©΄ μΈν„°λŸ½νŠΈκ°€ κ³„μ†ν•΄μ„œ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

34 line: // SW2 : PB10(EXTI10) Interrupt Handler void EXTI15_10_IRQHandler(void) { if (EXTI_GetITStatus(SW_2_EXTI_LINE) != RESET) { LED_G_TOGGLE(); EXTI_ClearITPendingBit(SW_2_EXTI_LINE); } } PA0λ₯Ό μœ„ν•œ μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬λŠ” EXTI0_IRQHandler()μ΄μ§€λ§Œ PB10 즉 10번 핀을 μœ„ν•œ μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬λŠ” EXTI15_10_IRQHandler()μž…λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” 10~15번 ν•€ 곡용으둜 μ‚¬μš©ν•©λ‹ˆλ‹€. ν•Έλ“€λŸ¬ λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬ν•˜λŠ” λ‘œμ§μ€ λ™μΌν•©λ‹ˆλ‹€.

μ‹€ν–‰ 방법

ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•΄μ„œ λ‹€μš΄λ‘œλ“œ ν•©λ‹ˆλ‹€. Switch λ“œλΌμ΄λ²„μ—μ„œ μ„€λͺ…ν•œ 바와 같이 μŠ€μœ„μΉ˜ 회둜λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

PA0에 μ—°κ²°λœ μŠ€μœ„μΉ˜λ₯Ό ν•œλ²ˆ λˆ„λ₯Ό λ•Œ λ§ˆλ‹€ 적색 LEDκ°€ ν† κΈ€λ˜λŠ” 것을 ν™•μΈν•©λ‹ˆλ‹€. PB10에 μ—°κ²°λœ μŠ€μœ„μΉ˜μ™€ 녹색 LED도 λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.