ะ
์ค๋์ ๋ฐ์ดํฐ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง STM32(Blue Pill) ๋ฐ STM8 ์ปจํธ๋กค๋ฌ์ ๋ํ ๋ง์ ํ๋ก์ ํธ ์์ ์ ํ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋ฐ๋ชจ ํ๋ก์ ํธ๋ ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ LED ์ ์ฉ์ด๋ฉฐ, ์ด๋ฅผ ๋๋์ผ๋ก ์กฐ๋ช ํ ์์ ์ด๋ฉฐ ์ด๋ฅผ ์ํด ๋ชจ๋ ์ข ๋ฅ์ ํฅ๋ฏธ๋ก์ด ์ฃผ๋ณ ์ฅ์น๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ ์คํธ๊ฐ ๋ค์ ๊ฑฐ๋ํด์ก์ผ๋ฏ๋ก ํธ์๋ฅผ ์ํด ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
๋ฉด์ฑ ์กฐํญ: ์ ๋ ์์ง๋์ด๊ฐ ์๋๋ฉฐ ์ ์๊ณตํ์ ๋ํ ๊น์ ์ง์์ ๊ฐ๊ณ ์๋ ์ฒํ์ง๋ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ๋ ์ ์ ๊ฐ์ ์๋ง์ถ์ด๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ฌ์ค ์ ๋ XNUMX๋ ์ ๋ถํฐ ์ ๋ฅผ ํ๊ฒ์ธต์ผ๋ก ์๊ฐํ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ต์ํ์ง ์์ ์นฉ์ ๋ฐ์ดํฐ์ํธ๊ฐ ์ฝ๊ธฐ์ ๋ฌด์ญ์ง ์๋ค๊ณ ๋งํด์ฃผ์๋ค๋ฉด ๋๋ ์ธํฐ๋ท์์ ์ฝ๋ ์กฐ๊ฐ์ ์ฐพ๊ณ ๊ฐ์์ ์ ์ฐฉ ํ ์ดํ๋ก ๋ชฉ๋ฐ์ ๋ง๋๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํ์ง ์์์ ๊ฒ์ ๋๋ค.
์ด ๊ธฐ์ฌ์ ์ด์ ์ ํ๋ก์ ํธ๊ฐ ์๋ ๋ฐ์ดํฐ์ํธ์ ์์ผ๋ฏ๋ก ์ฝ๋๊ฐ ๋งค์ฐ ๊น๋ํ์ง ์๊ณ ์ข ์ข ๋นก๋นกํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ ์์ฒด๋ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ์ ์นฉ์ ์ฒ์ ์ ํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
๋ด ๊ธฐ์ฌ๊ฐ ๋น์ทํ ์ทจ๋ฏธ ๋ชฐ์ ๋จ๊ณ์ ์๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
STM32
DM16 ๋ฐ SPI๋ฅผ ๊ฐ์ถ 634๊ฐ์ LED
Blue Pill(STM32F103C8T6) ๋ฐ DM634 LED ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ ์๊ท๋ชจ ํ๋ก์ ํธ์ ๋๋ค. ๋ฐ์ดํฐ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ผ์ด๋ฒ, STM IO ํฌํธ๋ฅผ ํ์ ํ๊ณ SPI๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
DM634
16๊ฐ์ 16๋นํธ PWM ์ถ๋ ฅ์ ๊ฐ์ถ ๋๋ง ์นฉ์ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๊ตญ๋ด ํ๋ก์ ํธ์์ ๋ณด๊ธํ 12๋นํธ ๋ชจ๋ธ์ด ์๋ ค์ง
์ ์กฐ์ฌ๊ฐ ๋๋ง์ด๋ผ์
DC ์ฑํฌ ์์ค(์คํ ๋๋ ์ธ)
์ฑํฌ๋ / ์คํ ๋๋ ์ธ ์ถ๋ ฅ - ๋ฌผ์ ๋นผ๋ค; ์ ์ ์ ๋ฅ ์์ค; ์ถ๋ ฅ์ ํ์ฑ ์ํ์์ ์ ์ง์ ์ฐ๊ฒฐ๋ฉ๋๋ค. LED๋ ์๊ทน์ ํตํด ๋๋ผ์ด๋ฒ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ฌผ๋ก ์ ๊ธฐ์ ์ผ๋ก ์ด๋ "์คํ ๋๋ ์ธ"์ด ์๋๋๋ค(๊ฐ๋ฐฉํ ๋ฐฐ์๊ตฌ), ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ์ํธ์์๋ ๋๋ ์ธ ๋ชจ๋์ ํ์ ๋ํ ์ด๋ฌํ ์ง์ ์ด ์ข ์ข ๋ฐ๊ฒฌ๋ฉ๋๋ค.
์ถ๋ ฅ ์ ๋ฅ ๊ฐ์ ์ค์ ํ๊ธฐ ์ํ REXT์ GND ์ฌ์ด์ ์ธ๋ถ ์ ํญ๊ธฐ
๊ธฐ์ค ์ ํญ์ ์ถ๋ ฅ์ ๋ด๋ถ ์ ํญ์ ์ ์ดํ๋ โโREXT ํ๊ณผ ์ ์ง ์ฌ์ด์ ์ค์น๋ฉ๋๋ค. ๋ฐ์ดํฐ์ํธ 9ํ์ด์ง์ ๊ทธ๋ํ๋ฅผ ์ฐธ์กฐํ์ธ์. DM634์์๋ ์ด ์ ํญ์ ์ํํธ์จ์ด๋ก ์ ์ดํ์ฌ ์ ์ฒด ๋ฐ๊ธฐ(์ ์ฒด ๋ฐ๊ธฐ); ์ด ๊ธฐ์ฌ์์๋ ์์ธํ ์ค๋ช ํ์ง ์๊ณ ์ฌ๊ธฐ์ 2.2 - 3kOhm ์ ํญ๊ธฐ๋ง ์ค์นํ๊ฒ ์ต๋๋ค.
์นฉ์ ์ ์ดํ๋ โโ๋ฐฉ๋ฒ์ ์ดํดํ๋ ค๋ฉด ์ฅ์น ์ธํฐํ์ด์ค์ ๋ํ ์ค๋ช ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค, ์ฌ๊ธฐ ์ค๊ตญ์ด ์์ด๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒ์ญํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ํ๋ค๋ฉด ์ดํดํ ์ ์์ง๋ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ธฐ๋ฅ์ ์ผ๋ก ์ ์ฌํ TLC5940์ ๋ํ ์ฐ๊ฒฐ์ด ๋ฐ์ดํฐ์ํธ์ ์ด๋ป๊ฒ ์ค๋ช ๋์ด ์๋์ง ์ดํด๋ณด์ญ์์ค.
... ์ฅ์น์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ ค๋ฉด ํ XNUMX๊ฐ๋ง ํ์ํฉ๋๋ค. SCLK ์ ํธ์ ์์น ์์ง๋ SIN ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ถ ๋ ์ง์คํฐ๋ก ์ด๋์ํต๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ํ ์งง์ ๋์ XLAT ์ ํธ๊ฐ ์์ฐจ์ ์ผ๋ก ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ถ ๋ ์ง์คํฐ์ ๋์นํฉ๋๋ค. ๋ด๋ถ ๋ ์ง์คํฐ๋ XLAT ์ ํธ ๋ ๋ฒจ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒ์ดํธ์
๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ต์์ ๋นํธ๋ถํฐ ๋จผ์ ์ ์ก๋ฉ๋๋ค.
๊ฑธ์ โ ๋์น/๋์น/์ ๊ธ.
๋ผ์ด์ง ์์ง โ ํ์ค์ ์์ชฝ ๊ฐ์ฅ์๋ฆฌ
MSB ํผ์คํธ โ ์ต์์(๊ฐ์ฅ ์ผ์ชฝ) ๋นํธ ์์ผ๋ก.
๋ฐ์ดํฐ๋ฅผ ์๊ณ๋ก โ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก(๋นํธ ๋จ์๋ก) ์ ์กํฉ๋๋ค.
์๋ ๊ฑธ์ ์นฉ์ ๋ํ ๋ฌธ์์์ ์์ฃผ ๋ฐ๊ฒฌ๋๋ฉฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ฒ์ญ๋๋ฏ๋ก ์ดํด๋ฅผ ๋๊ธฐ ์ํด ํ์ฉํ๊ฒ ์ต๋๋ค.
์๊ท๋ชจ ๊ต์ก ํ๋ก๊ทธ๋จLED ๋๋ผ์ด๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํํธ ๋ ์ง์คํฐ์ ๋๋ค. "์ฎ๊ธฐ๋ค" (๋ณํ) ์ด๋ฆ์์ - ์ฅ์น ๋ด๋ถ์ ๋ฐ์ดํฐ ๋นํธ ๋จ์ ์ด๋: ๋ด๋ถ์ ์ฝ์ ๋ ๊ฐ๊ฐ์ ์๋ก์ด ๋นํธ๋ ์ ์ฒด ์ฒด์ธ์ ์์ผ๋ก ๋ฐ์ด๋ ๋๋ค. ๊ต๋ ์ค์ LED๊ฐ ํผ๋์ค๋ฝ๊ฒ ๊น๋ฐ์ด๋ ๊ฒ์ ๊ด์ฐฐํ๊ณ ์ถ์ดํ๋ ์ฌ๋์ ์๋ฌด๋ ์๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค๋ ๋ํผ์ ์ํด ์๋ ๋ ์ง์คํฐ์ ๋ถ๋ฆฌ๋ ๋ฒํผ ๋ ์ง์คํฐ์์ ๋ฐ์ํฉ๋๋ค(๊ฑธ์ )์ ๋นํธ๊ฐ ์ํ๋ ์์๋ก ๋ฐฐ์ด๋์ด ์๋ ์ผ์ข ์ ๋๊ธฐ์ค์ด๋ค. ๋ชจ๋ ๊ฒ์ด ์ค๋น๋๋ฉด ์ ํฐ๊ฐ ์ด๋ฆฌ๊ณ ๋นํธ๊ฐ ์๋ํ์ฌ ์ด์ ๋ฐฐ์น๋ฅผ ๊ต์ฒดํฉ๋๋ค. ๋จ์ด ๊ฑธ์ ๋ฏธ์ธ ํ๋ก์ ๋ํ ๋ฌธ์์์๋ ์ด๋ค ์กฐํฉ์ผ๋ก ์ฌ์ฉ๋๋ ์๊ด์์ด ๊ฑฐ์ ํญ์ ์ด๋ฌํ ๋ํผ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ผ์ DM634๋ก์ ๋ฐ์ดํฐ ์ ์ก์ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฉ๋๋ค. DAI ์ ๋ ฅ์ ์๊ฑฐ๋ฆฌ LED์ ์ต์์ ๋นํธ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ DCK๋ฅผ ์์๋๋ก ๋น๊น๋๋ค. DAI ์ ๋ ฅ์ ๋ค์ ๋นํธ์ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ DCK๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋ชจ๋ ๋นํธ๊ฐ ์ ์ก๋ ๋๊น์ง ๊ณ์๋ฉ๋๋ค(์๊ณ), ๊ทธ ํ์ LAT๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด ์์ ์ ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค(๋นํธ๋ฑ ), ๊ทธ๋ฌ๋ STM32์ ๋ ๊ฐ์ ์ฌ๋ณธ์ผ๋ก ์ ๊ณต๋๋ฏ๋ก ์ด๋ฅผ ์ํด ํน๋ณํ ๋ง์ถคํ๋ SPI ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
๋ธ๋ฃจ ์์ฝ STM32F103
์๊ฐ: STM32 ์ปจํธ๋กค๋ฌ๋ ๋ฌด์์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ๋ณด๋ค Atmega328๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. ๋ํ ์๋์ง ์ ์ฝ์ ์ํด ์์ ์ ๊ฑฐ์ ๋ชจ๋ ์ฃผ๋ณ ์ฅ์น๊ฐ ๊บผ์ง๊ณ ํด๋ก ์ฃผํ์๋ ๋ด๋ถ ์์ค์์ 8MHz์
๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋ STM ํ๋ก๊ทธ๋๋จธ๋ค์ ์นฉ์ "๊ณ์ฐ๋" 72MHz๊น์ง ๋์ด์ฌ๋ฆฌ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ๋ด๊ฐ ์๋ ๋ชจ๋ IDE ์์ฑ์๋ ์ด๋ฅผ ์ด๊ธฐํ ์ ์ฐจ์ ํฌํจ์์ผฐ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํด๋ก์ ํ ํ์๊ฐ ์์ต๋๋ค(๊ทธ๋ฌ๋
๋ฌธ์: Blue Pill์๋ ์ธ๊ธฐ ์๋ STM32F103C8T6 ์นฉ์ด ์ฅ์ฐฉ๋์ด ์์ผ๋ฉฐ ์ด์ ๋ํ ๋ ๊ฐ์ง ์ ์ฉํ ๋ฌธ์๊ฐ ์์ต๋๋ค.
DATA SHEET ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ STM32F103x8 ๋ฐ STM32F103xB์ฉ;์ฐธ์กฐ ์ค๋ช ์ ์ ์ฒด STM32F103 ๋ผ์ธ ๋ฑ์ ๋ํด.
๋ฐ์ดํฐ์ํธ์์ ์ฐ๋ฆฌ๋ ๋ค์ ์ฌํญ์ ๊ด์ฌ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ํ์์ โ ์นฉ ํ์์ โ ๋ณด๋๋ฅผ ์ง์ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ
- ๋ฉ๋ชจ๋ฆฌ ๋งต โ ํน์ ์นฉ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๋งต์ ๋๋ค. ์ฐธ์กฐ ์ค๋ช ์์๋ ์ ์ฒด ๋ผ์ธ์ ๋ํ ์ง๋๊ฐ ์์ผ๋ฉฐ ์ฐ๋ฆฌ ์ ํ์๋ ์๋ ๋ ์ง์คํฐ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
- ํ ์ ์ ํ - ํ์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ๋์ฒด ๊ธฐ๋ฅ์ ๋์ดํฉ๋๋ค. "ํ๋ ์์ฝ"์ ๊ฒฝ์ฐ ํ ๋ชฉ๋ก๊ณผ ํด๋น ๊ธฐ๋ฅ์ด ํฌํจ๋ ๋ ํธ๋ฆฌํ ์ฌ์ง์ ์ธํฐ๋ท์์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ฆ์ Blue Pill ํ์์์ Google์ ๊ฒ์ํ๊ณ ์ด ์ฌ์ง์ ๊ฐ๊น์ด์ ๋ณด๊ดํฉ๋๋ค.
์ฃผ์: ์ธํฐ๋ท ์ฌ์ง์ ์ค๋ฅ๊ฐ ์์์ต๋๋ค. ๋๊ธ์ ์ธ๊ธ๋ ๋ด์ฉ์
๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ์ฌ์ง์ ๊ต์ฒด๋์์ง๋ง ์ด๋ ๊ตํ์
๋๋ค. ๋ฐ์ดํฐ์ํธ๊ฐ ์๋ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ์ดํฐ ์ํธ๋ฅผ ์ ๊ฑฐํ๊ณ ์ฐธ์กฐ ๋งค๋ด์ผ์ ์ด๊ณ ์ง๊ธ๋ถํฐ๋ ๊ทธ๊ฒ๋ง ์ฌ์ฉํฉ๋๋ค.
์ ์ฐจ: ํ์ค ์
๋ ฅ/์ถ๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , SPI๋ฅผ ๊ตฌ์ฑํ๊ณ , ํ์ํ ์ฃผ๋ณ ์ฅ์น๋ฅผ ์ผญ๋๋ค.
์ ์ถ๋ ฅ
Atmega328์์๋ I/O๊ฐ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๊ตฌํ๋๋ฏ๋ก STM32 ์ต์ ์ด ๋๋ฌด ๋ง์์ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ๊ฒฐ๋ก ๋ง ํ์ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ค ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
์คํ ๋๋ ์ธ, ํธ์ํ, ๋์ฒด ํธ์ํ, ๋์ฒด ์คํ ๋๋ ์ธ
"ํ-ํธ์"(ํธ์ ํ)๋ Arduino์ ์ผ๋ฐ์ ์ธ ์ถ๋ ฅ์ด๋ฉฐ ํ์ HIGH ๋๋ LOW ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ง๋ง "์คํ๋๋ ์ธ"์๋
์ถ๋ ฅ ๊ตฌ์ฑ / ํฌํธ๊ฐ ์ถ๋ ฅ์ ํ ๋น๋ ๊ฒฝ์ฐ: / ์ถ๋ ฅ ๋ฒํผ ํ์ฑํ๋จ: / โ ์คํ ๋๋ ์ธ ๋ชจ๋: ์ถ๋ ฅ ๋ ์ง์คํฐ์ "0"์ N-MOS๋ฅผ ํ์ฑํํ๊ณ , ์ถ๋ ฅ ๋ ์ง์คํฐ์ "1"์ ํฌํธ๋ฅผ Hi-Z ๋ชจ๋๋ก ์ ์งํฉ๋๋ค( P-MOS๊ฐ ํ์ฑํ๋์ง ์์) / โ ํธ์ํ ๋ชจ๋: ์ถ๋ ฅ ๋ ์ง์คํฐ์ "0"์ N-MOS๋ฅผ ํ์ฑํํ๊ณ , ์ถ๋ ฅ ๋ ์ง์คํฐ์ "1"์ P-MOS๋ฅผ ํ์ฑํํฉ๋๋ค.
์คํ๋๋ ์ธ์ ๋ชจ๋ ์ฐจ์ด์ (๊ฐ๋ฐฉํ ๋ฐฐ์๊ตฌ) "ํธ์-ํ"(ํธ์ ํ)๋ ์ฒซ ๋ฒ์งธ ํ์ด HIGH ์ํ๋ฅผ ๋ฐ์๋ค์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ถ๋ ฅ ๋ ์ง์คํฐ์ ํ๋๋ฅผ ์ฐ๋ฉด ๋์ ์ ํญ ๋ชจ๋๋ก ์ ํ๋ฉ๋๋ค(๊ณ ์ํผ๋์ค, ํ์ด-์ง). XNUMX์ ์ฐ๋ฉด ํ์ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ์ ๊ธฐ์ ์ผ๋ก ๋ ๋ชจ๋ ๋ชจ๋์์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
์ผ๋ฐ ์ถ๋ ฅ ๋ชจ๋์์ ํ์ ๋จ์ํ ์ถ๋ ฅ ๋ ์ง์คํฐ์ ๋ด์ฉ์ ๋ธ๋ก๋์บ์คํธํฉ๋๋ค. "๋์ฒด"์์๋ ํด๋น ์ฃผ๋ณ ์ฅ์น์ ์ํด ์ ์ด๋ฉ๋๋ค(9.1.4 ์ฐธ์กฐ).
ํฌํธ ๋นํธ๊ฐ ๋์ฒด ๊ธฐ๋ฅ ํ์ผ๋ก ๊ตฌ์ฑ๋๋ฉด ํ ๋ ์ง์คํฐ๊ฐ ๋นํ์ฑํ๋๊ณ ํ์ด ์ฃผ๋ณ ์ฅ์น ํ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
๊ฐ ํ์ ๋์ฒด ๊ธฐ๋ฅ์ ๋ค์ ํญ๋ชฉ์ ์ค๋ช ๋์ด ์์ต๋๋ค. ํ ์ ์ ๋ฐ์ดํฐ์ํธ๋ ๋ค์ด๋ก๋ํ ์ด๋ฏธ์ง์ ์์ต๋๋ค. ํ์ ์ฌ๋ฌ ๋์ฒด ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง์ ๋ํ ์ง๋ฌธ์ ๋ํ ๋ต์ ๋ฐ์ดํฐ์ํธ์ ๊ฐ์ฃผ์ ๋์ ์์ต๋๋ค.
์ฌ๋ฌ ์ฃผ๋ณ ์ฅ์น๊ฐ ๋์ผํ ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋์ฒด ๊ธฐ๋ฅ ๊ฐ์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ํ ๋ฒ์ ํ๋์ ์ฃผ๋ณ ์ฅ์น๋ง ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ฃผ๋ณ ์ฅ์น ํด๋ญ ํ์ฑํ ๋นํธ(ํด๋น RCC ๋ ์ง์คํฐ์ ์์)๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅ ๋ชจ๋์ ํ์๋ ํด๋ญ ์๋๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ ๋ค๋ฅธ ์๋์ง ์ ์ฝ ๊ธฐ๋ฅ์ผ๋ก, ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์์ด๋ฒ๋ ธ์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ SPI๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ ๋ ๊ฐ์ ํ(๋ฐ์ดํฐ ๋ฐ ํด๋ญ ์ ํธ ํฌํจ)์ด "๋์ฒด ํธ์-ํ ๊ธฐ๋ฅ"์ด์ด์ผ ํ๊ณ ๋ค๋ฅธ ํ(LAT)์ "์ผ๋ฐ ํธ์-ํ"์ด์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ํ์ง๋ง ํ ๋นํ๊ธฐ ์ ์ SPI๋ฅผ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
SPI
๋ ๋ค๋ฅธ ์๊ท๋ชจ ๊ต์ก ํ๋ก๊ทธ๋จ
SPI ๋๋ ์ง๋ ฌ ์ฃผ๋ณ ์ฅ์น ์ธํฐํ์ด์ค(์ง๋ ฌ ์ฃผ๋ณ ์ฅ์น ์ธํฐํ์ด์ค)๋ MK๋ฅผ ๋ค๋ฅธ MK ๋ฐ ์ธ๋ถ ์ธ๊ณ์ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ฐ๋จํ๊ณ ๋งค์ฐ ํจ๊ณผ์ ์ธ ์ธํฐํ์ด์ค์ ๋๋ค. ์๋ ์๋ฆฌ๋ ์ค๊ตญ LED ๋๋ผ์ด๋ฒ์ ๋ํด ์ด๋ฏธ ์์์ ์ค๋ช ํ์ต๋๋ค(์ฐธ์กฐ ๋งค๋ด์ผ, ์น์ 25 ์ฐธ์กฐ). SPI๋ ๋ง์คํฐ("๋ง์คํฐ") ๋ฐ ์ฌ๋ ์ด๋ธ("์ฌ๋ ์ด๋ธ") ๋ชจ๋์์ ์๋ํ ์ ์์ต๋๋ค. SPI์๋ XNUMX๊ฐ์ ๊ธฐ๋ณธ ์ฑ๋์ด ์์ง๋ง ๋ชจ๋ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
- MOSI, ๋ง์คํฐ ์ถ๋ ฅ/์ฌ๋ ์ด๋ธ ์ ๋ ฅ: ์ด ํ์ ๋ง์คํฐ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ์ฌ๋ ์ด๋ธ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
- MISO, ๋ง์คํฐ ์ ๋ ฅ/์ฌ๋ ์ด๋ธ ์ถ๋ ฅ: ๋ฐ๋๋ก ๋ง์คํฐ์์ ์์ ํ๊ณ ์ฌ๋ ์ด๋ธ์์ ์ ์กํฉ๋๋ค.
- SCK, Serial Clock: ๋ง์คํฐ์์ ๋ฐ์ดํฐ ์ ์ก ์ฃผํ์๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ฌ๋ ์ด๋ธ์์ ํด๋ญ ์ ํธ๋ฅผ ์์ ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋นํธ๋ฅผ ์น๋ ๊ฒ;
- SS, ์ฌ๋ ์ด๋ธ ์ ํ: ์ด ์ฑ๋์ ๋์์ผ๋ก ์ฌ๋ ์ด๋ธ๋ ์์ ์ด ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ฒ ๋ฉ๋๋ค. STM32์์๋ NSS๋ผ๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์ N = ์์์ ๋๋ค. ์ด ์ฑ๋์ ์ ์ง๊ฐ ์์ผ๋ฉด ์ปจํธ๋กค๋ฌ๋ ์ฌ๋ ์ด๋ธ๊ฐ ๋ฉ๋๋ค. ์คํ ๋๋ ์ธ ์ถ๋ ฅ ๋ชจ๋์ ์ ๊ฒฐํฉ๋์ง๋ง ์ด๋ ๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ์ ๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก STM32์ SPI๋ ๊ธฐ๋ฅ์ด ํ๋ถํ์ฌ ์ดํดํ๊ธฐ๊ฐ ๋ค์ ์ด๋ ต์ต๋๋ค. ์๋ฅผ ๋ค์ด SPI๋ฟ๋ง ์๋๋ผ I2S ์ธํฐํ์ด์ค์์๋ ์๋ํ ์ ์์ผ๋ฉฐ ๋ฌธ์์ ํด๋น ์ค๋ช ์ด ํผํฉ๋์ด ์์ผ๋ฏ๋ก ์ ์์ ์ด๊ณผ๋ถ์ ์ฐจ๋จํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ์์ ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. MOSI์ SCK๋ง ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉด ๋ฉ๋๋ค. ์น์ 25.3.4(๋ฐ์ด์ค ํต์ , ๋ฐ์ด์ค ํต์ )๋ก ์ด๋ํ์ฌ ๋ค์์ ์ฐพ์ต๋๋ค. ํด๋ก 1๊ฐ ๋ฐ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ์์ด์ด 1๊ฐ (ํด๋ญ ์ ํธ 1๊ฐ ๋ฐ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ์คํธ๋ฆผ 1๊ฐ):
์ด ๋ชจ๋์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ก ์ ์ฉ ๋๋ ์์ ์ ์ฉ ๋ชจ๋์์ SPI๋ฅผ ์ฌ์ฉํฉ๋๋ค. / ์ ์ก ์ ์ฉ ๋ชจ๋๋ ์ด์ค ๋ชจ๋์ ์ ์ฌํฉ๋๋ค. ๋ฐ์ดํฐ๋ ์ ์ก ํ(๋ง์คํฐ ๋ชจ๋์์๋ MOSI, ์ฌ๋ ์ด๋ธ ๋ชจ๋์์๋ MISO)์ ํตํด ์ ์ก๋๊ณ , ์์ ํ(๊ฐ๊ฐ MISO ๋๋ MOSI)์ ์ผ๋ฐ I/O ํ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. . ์ด ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ Rx ๋ฒํผ๋ง ๋ฌด์ํ๋ฉด ๋ฉ๋๋ค. (์ฝ๋ ๊ฒฝ์ฐ ๊ฑฐ๊ธฐ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋์ง ์์ต๋๋ค.)
์ข์ต๋๋ค. MISO ํ์ ๋น์ด ์์ต๋๋ค. LAT ์ ํธ๋ฅผ ์ฐ๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค. STM32์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ์ดํ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํ Slave Select๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์น์ 25.3.1 SPI ์ผ๋ฐ ์ค๋ช ์์ ๋์ผํ ์ด๋ฆ์ ๋จ๋ฝ์ ์ฝ์์ต๋๋ค.
์ํํธ์จ์ด ์ ์ด NSS(SSM = 1) / ์ฌ๋ ์ด๋ธ ์ ํ ์ ๋ณด๋ SPI_CR1 ๋ ์ง์คํฐ์ SSI ๋นํธ์ ํฌํจ๋ฉ๋๋ค. ์ธ๋ถ NSS ํ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์๊ตฌ ์ฌํญ์ ์ํด ๋ฌด๋ฃ๋ก ์ ์ง๋ฉ๋๋ค.
์ด์ ๋ ์ง์คํฐ์ ์ธ ์๊ฐ์ ๋๋ค. ์ ๋ SPI2๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ฐ์ดํฐ์ํธ์ 3.3 ๋ฉ๋ชจ๋ฆฌ ๋งต ์น์ ์์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ์ฐพ์๋ณด์ธ์.
์, ์์ํด ๋ด ์๋ค:
#define _SPI2_(mem_offset) (*(volatile uint32_t *)(0x40003800 + (mem_offset)))
"๋ง์คํฐ ๋ชจ๋์์ SPI ๊ตฌ์ฑ"์ด๋ผ๋ ์ ๋ชฉ์ผ๋ก ์น์ 25.3.3์ ์ฝ๋๋ค.
1. SPI_CR2 ๋ ์ง์คํฐ์ ๋นํธ BR[0:1]์ ์ฌ์ฉํ์ฌ ์ง๋ ฌ ํด๋ก ์ฃผํ์๋ฅผ ์ค์ ํฉ๋๋ค.
๋ ์ง์คํฐ๋ ๋์ผํ ์ด๋ฆ์ ์ฐธ์กฐ ๋งค๋ด์ผ ์น์ ์ ์์ง๋ฉ๋๋ค. ์ฃผ์ ์ด๋(์ฃผ์ ์คํ์ ) CR1 โ 0x00์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋นํธ๊ฐ ์ง์์ง๋๋ค(์ฌ์ค์ ๊ฐ 0x0000):
BR ๋นํธ๋ ์ปจํธ๋กค๋ฌ ํด๋ญ ๋ถ๋ฐฐ๊ธฐ๋ฅผ ์ค์ ํ์ฌ SPI๊ฐ ์๋ํ ์ฃผํ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ฐ์ดํฐ์ํธ์ ๋ฐ๋ฅด๋ฉด STM32 ์ฃผํ์๋ 72MHz์ด๊ณ LED ๋๋ผ์ด๋ฒ๋ ์ต๋ 25MHz์ ์ฃผํ์๋ก ์๋ํ๋ฏ๋ก 2๋ก ๋๋์ด์ผ ํฉ๋๋ค(BR[0:001] = XNUMX).
#define _SPI_CR1 0x00
#define BR_0 0x0008
#define BR_1 0x0010
#define BR_2 0x0020
_SPI2_ (_SPI_CR1) |= BR_0;// pclk/4
2. CPOL ๋ฐ CPHA ๋นํธ๋ฅผ ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์ ์ก๊ณผ ์ง๋ ฌ ํด๋ญ ํ์ด๋ฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํฉ๋๋ค(240ํ์ด์ง ๋ค์ด์ด๊ทธ๋จ ์ฐธ์กฐ).
์ฌ๊ธฐ์๋ ํ๋ก๋๊ฐ ์๋ ๋ฐ์ดํฐ์ํธ๋ฅผ ์ฝ๊ณ ์์ผ๋ฏ๋ก 704ํ์ด์ง(SPI ์ผ๋ฐ ์ค๋ช )์ CPOL ๋ฐ CPHA ๋นํธ์ ๋ํ ํ ์คํธ ์ค๋ช ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋ก ์์ ๋ฐ ๊ทน์ฑ
SPI_CR1 ๋ ์ง์คํฐ์ CPOL ๋ฐ CPHA ๋นํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก XNUMX๊ฐ์ ํ์ด๋ฐ ๊ด๊ณ๋ฅผ ์ ํํ ์ ์์ต๋๋ค. CPOL(ํด๋ญ ๊ทน์ฑ) ๋นํธ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋์ง ์์ ๋ ํด๋ญ ์ ํธ์ ์ํ๋ฅผ ์ ์ดํฉ๋๋ค. ์ด ๋นํธ๋ ๋ง์คํฐ ๋ฐ ์ฌ๋ ์ด๋ธ ๋ชจ๋๋ฅผ ์ ์ดํฉ๋๋ค. CPOL์ด ์ฌ์ค์ ๋๋ฉด SCK ํ์ ํด์ง ๋ชจ๋์์ ๋ก์ฐ ์ํ๊ฐ ๋ฉ๋๋ค. CPOL ๋นํธ๊ฐ ์ค์ ๋๋ฉด ํด์ง ๋ชจ๋ ๋์ SCK ํ์ด ํ์ด๊ฐ ๋ฉ๋๋ค.
CPHA(ํด๋ญ ์์) ๋นํธ๊ฐ ์ค์ ๋๋ฉด ๋์ ๋นํธ ํธ๋ฉ ์คํธ๋ก๋ธ๋ SCK ์ ํธ์ ๋ ๋ฒ์งธ ์์ง์
๋๋ค(CPOL์ด ํด๋ฆฌ์ด๋๋ฉด ํ๋ฝ, CPOL์ด ์ค์ ๋๋ฉด ์์น). ๋ฐ์ดํฐ๋ ํด๋ก ์ ํธ์ ๋ ๋ฒ์งธ ๋ณํ์ ์ํด ์บก์ฒ๋ฉ๋๋ค. CPHA ๋นํธ๊ฐ ํด๋ฆฌ์ด๋ ๊ฒฝ์ฐ ํ์ด ๋นํธ ํธ๋ฉ ์คํธ๋ก๋ธ๋ SCK ์ ํธ์ ์์น ์์ง์
๋๋ค(CPOL์ด ์ค์ ๋ ๊ฒฝ์ฐ ํ๊ฐ ์์ง, CPOL์ด ํด๋ฆฌ์ด๋ ๊ฒฝ์ฐ ์์น ์์ง). ๋ฐ์ดํฐ๋ ํด๋ญ ์ ํธ๊ฐ ์ฒ์ ๋ณ๊ฒฝ๋ ๋ ์บก์ฒ๋ฉ๋๋ค.
์ด ์ง์์ ํก์ํ ํ ์ฐ๋ฆฌ๋ ๋ ๋นํธ๊ฐ ๋ชจ๋ XNUMX์ผ๋ก ์ ์ง๋์ด์ผ ํ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ฉํ์ง ์์ ๋ SCK ์ ํธ๊ฐ ๋ฎ๊ฒ ์ ์ง๋๊ณ ํ์ค์ ์์น ์์ง์์ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๊ธฐ๋ฅผ ์ํฉ๋๋ค(๊ทธ๋ฆผ XNUMX ์ฐธ์กฐ). ๋ผ์ด์ง ์์ง DM634 ๋ฐ์ดํฐ์ํธ ์ฐธ์กฐ).
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฒ์์ผ๋ก ST ๋ฐ์ดํฐ์ํธ์์ ์ดํ์ ํน์ง์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฌ๊ธฐ์๋ "๋นํธ๋ฅผ XNUMX์ผ๋ก ์ฌ์ค์ "์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๊ธฐ๋ก๋์ด ์์ต๋๋ค. ์กฐ๊ธ ์ฌ์ค์ ํ๋ ค๋ฉด์๋๋ผ ์กฐ๊ธ ํด๋ฆฌ์ดํ๋ค, ์๋ฅผ ๋ค์ด Atmega์ ๊ฐ์ต๋๋ค.
3. DFF ๋นํธ๋ฅผ ์ค์ ํ์ฌ ๋ฐ์ดํฐ ๋ธ๋ก์ด 8๋นํธ ํ์์ธ์ง 16๋นํธ ํ์์ธ์ง ๊ฒฐ์ ํฉ๋๋ค.
๋๋ DM16์ฒ๋ผ 634๋นํธ PWM ๋ฐ์ดํฐ ์ ์ก์ ๋ฐฉํด๊ฐ ๋์ง ์๋๋ก ํน๋ณํ 12๋นํธ DM633๋ฅผ ์ ํํ์ต๋๋ค. DFF๋ฅผ XNUMX๋ก ์ค์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
#define DFF 0x0800
_SPI2_ (_SPI_CR1) |= DFF; // 16-bit mode
4. SPI_CR1 ๋ ์ง์คํฐ์ LSBFIRST ๋นํธ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ธ๋ก ํ์์ ๊ฒฐ์ ํฉ๋๋ค.
LSBFIRST๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ตํ์ ๋นํธ๋ฅผ ๋จผ์ ์ฌ์ฉํ์ฌ ์ ์ก์ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ DM634๋ ์ต์์ ๋นํธ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ค์ ๋ ์ํ๋ก ๋ก๋๋ค.
5. ํ๋์จ์ด ๋ชจ๋์์ NSS ํ์ ์ ๋ ฅ์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐ์ดํธ ์ ์ก ์ํ์ค ๋์ NSS ํ์ ๋์ ์ ํธ๋ฅผ ์ ์ฉํฉ๋๋ค. NSS ์ํํธ์จ์ด ๋ชจ๋์์๋ SPI_CR1 ๋ ์ง์คํฐ์ SSM ๋ฐ SSI ๋นํธ๋ฅผ ์ค์ ํฉ๋๋ค. NSS ํ์ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด SSOE ๋นํธ๋ง ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
NSS ํ๋์จ์ด ๋ชจ๋๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ค๋ฉด SSM ๋ฐ SSI๋ฅผ ์ค์นํ์ญ์์ค.
#define SSI 0x0100
#define SSM 0x0200
_SPI2_ (_SPI_CR1) |= SSM | SSI; //enable software control of SS, SS high
6. MSTR ๋ฐ SPE ๋นํธ๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค(NSS ์ ํธ๊ฐ ๋์ ๊ฒฝ์ฐ์๋ง ์ค์ ๋ ์ํ๋ก ์ ์ง๋จ).
์ค์ ๋ก ์ด๋ฌํ ๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ SPI๋ฅผ ๋ง์คํฐ๋ก ์ง์ ํ๊ณ ์ผญ๋๋ค.
#define MSTR 0x0004
#define SPE 0x0040
_SPI2_ (_SPI_CR1) |= MSTR; //SPI master
//ะบะพะณะดะฐ ะฒัะต ะณะพัะพะฒะพ, ะฒะบะปััะฐะตะผ SPI
_SPI2_ (_SPI_CR1) |= SPE;
SPI๊ฐ ๊ตฌ์ฑ๋์์ผ๋ฏ๋ก ๋๋ผ์ด๋ฒ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋ ํจ์๋ฅผ ์ฆ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๊ณ์ ์ฝ๊ธฐ 25.3.3 โ๋ง์คํฐ ๋ชจ๋์์ SPI ๊ตฌ์ฑโ:
๋ฐ์ดํฐ ์ ์ก ์์
Tx ๋ฒํผ์ ๋ฐ์ดํธ๊ฐ ๊ธฐ๋ก๋๋ฉด ์ ์ก์ด ์์๋ฉ๋๋ค.
๋ฐ์ดํฐ ๋ฐ์ดํธ๋ ์ํํธ ๋ ์ง์คํฐ์ ๋ก๋๋ฉ๋๋ค. ํํ ์ฒซ ๋ฒ์งธ ๋นํธ๋ฅผ ์ ์กํ๋ ๋์ ๋ชจ๋(๋ด๋ถ ๋ฒ์ค์์), ๊ทธ ํ ๋ค์์ผ๋ก ์ ์ก๋ฉ๋๋ค. ์๋ฌ์ ์ผ์ด๋๋ MOSI ํ ๋ชจ๋, CPI_CR1 ๋ ์ง์คํฐ์ LSBFIRST ๋นํธ ์ค์ ์ ๋ฐ๋ผ ์ฒซ ๋ฒ์งธ ๋๋ ๋ง์ง๋ง ๋นํธ ์ ๋ฌ. TXE ํ๋๊ทธ๋ ๋ฐ์ดํฐ ์ ์ก ํ์ ์ค์ ๋ฉ๋๋ค. Tx ๋ฒํผ์์ ์ํํธ ๋ ์ง์คํฐ๋ก, CPI_CR1 ๋ ์ง์คํฐ์ TXEIE ๋นํธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ ์ธํฐ๋ฝํธ๋ฅผ ์์ฑํฉ๋๋ค.
STM ์ปจํธ๋กค๋ฌ์ SPI ๊ตฌํ ๊ธฐ๋ฅ ์ค ํ๋์ ์ฃผ์๋ฅผ ๋๊ธฐ ์ํด ๋ฒ์ญ์์ ๋ช ๋จ์ด๋ฅผ ๊ฐ์กฐํ์ต๋๋ค. Atmega์์๋ TXE ํ๋๊ทธ(์ก์ ์ด ๋น์ด ์์, Tx๋ ๋น์ด ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ค๋น๊ฐ ๋์ด ์์)๋ ์ ์ฒด ๋ฐ์ดํธ๊ฐ ์ ์ก๋ ํ์๋ง ์ค์ ๋ฉ๋๋ค. ๋ฐ. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ด ํ๋๊ทธ๋ ๋ฐ์ดํธ๊ฐ ๋ด๋ถ ์ํํธ ๋ ์ง์คํฐ์ ์ฝ์ ๋ ํ์ ์ค์ ๋ฉ๋๋ค. ๋ชจ๋ ๋นํธ๊ฐ ๋์์(๋ณ๋ ฌ๋ก) ํธ์๋ ๋ค์ ๋ฐ์ดํฐ๊ฐ ์์ฐจ์ ์ผ๋ก ์ ์ก๋๋ฏ๋ก TXE๋ ๋ฐ์ดํธ๊ฐ ์์ ํ ์ ์ก๋๊ธฐ ์ ์ ์ค์ ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ค์ํ ์ด์ ๋ LED ๋๋ผ์ด๋ฒ์ ๊ฒฝ์ฐ ์ ์ก ํ LAT ํ์ ๋น๊ฒจ์ผ ํฉ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ, ์ฆ TXE ํ๋๊ทธ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ด๋ ๋ ๋ค๋ฅธ ํ๋๊ทธ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. 25.3.7 - "์ํ ํ๋๊ทธ"๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
<โฆ>
BUSY ํ๋๊ทธ
BSY ํ๋๊ทธ๋ ํ๋์จ์ด์ ์ํด ์ค์ ๋๊ณ ์ง์์ง๋๋ค(๊ธฐ๋กํด๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค). BSY ํ๋๊ทธ๋ SPI ํต์ ๊ณ์ธต์ ์ํ๋ฅผ ๋ํ๋
๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ค์ ๋ฉ๋๋ค.
์ ์ก์ด ์๋ฃ๋ ๊ฒฝ์ฐ(์ ์ก์ด ์ฐ์๋๋ ๊ฒฝ์ฐ ๋ง์คํฐ ๋ชจ๋ ์ ์ธ)
SPI๊ฐ ๋นํ์ฑํ๋ ๊ฒฝ์ฐ
๋ง์คํฐ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ(MODF=1)
์ ์ก์ด ์ฐ์์ ์ด์ง ์์ผ๋ฉด ๊ฐ ๋ฐ์ดํฐ ์ ์ก ์ฌ์ด์ BSY ํ๋๊ทธ๊ฐ ์ง์์ง๋๋ค.
์ข์์, ์ด๊ฒ ๋์์ด ๋ ๊ฑฐ์์. Tx ๋ฒํผ๊ฐ ์ด๋์ ์๋์ง ์์๋ด ์๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด "SPI ๋ฐ์ดํฐ ๋ ์ง์คํฐ"๋ฅผ ์ฝ์ผ์ญ์์ค.
๋นํธ 15:0 DR[15:0] ๋ฐ์ดํฐ ๋ ์ง์คํฐ
์์ ๋ ๋ฐ์ดํฐ ๋๋ ์ ์กํ ๋ฐ์ดํฐ์
๋๋ค.
๋ฐ์ดํฐ ๋ ์ง์คํฐ๋ ๋ ๊ฐ์ ๋ฒํผ๋ก ๋๋์ด์ง๋๋ค. ํ๋๋ ์ฐ๊ธฐ์ฉ(์ ์ก ๋ฒํผ)์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ฝ๊ธฐ์ฉ(์์ ๋ฒํผ)์
๋๋ค. ๋ฐ์ดํฐ ๋ ์ง์คํฐ์ ์ฐ๋ฉด Tx ๋ฒํผ์ ์ฐ๊ณ , ๋ฐ์ดํฐ ๋ ์ง์คํฐ์์ ์ฝ์ผ๋ฉด Rx ๋ฒํผ์ ํฌํจ๋ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ TXE ๋ฐ BSY ํ๋๊ทธ๊ฐ ์๋ ์ํ ๋ ์ง์คํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ค:
#define _SPI_DR 0x0C
#define _SPI_SR 0x08
#define BSY 0x0080
#define TXE 0x0002
void dm_shift16(uint16_t value)
{
_SPI2_(_SPI_DR) = value; //send 2 bytes
while (!(_SPI2_(_SPI_SR) & TXE)); //wait until they're sent
}
LED ๋๋ผ์ด๋ฒ ์ถ๋ ฅ ์์ ๋ฐ๋ผ 16๋ฐ์ดํธ์ XNUMX๋ฐฐ๋ฅผ ์ ์กํด์ผ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
void sendLEDdata()
{
LAT_low();
uint8_t k = 16;
do
{ k--;
dm_shift16(leds[k]);
} while (k);
while (_SPI2_(_SPI_SR) & BSY); // finish transmission
LAT_pulse();
}
ํ์ง๋ง ์์ง LAT ํ์ ์ด๋ป๊ฒ ๋ฝ๋์ง ๋ชจ๋ฅด๋ฏ๋ก I/O๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค.
ํ ํ ๋น
STM32F1์์ ํ ์ํ๋ฅผ ๋ด๋นํ๋ ๋ ์ง์คํฐ๋ ๋งค์ฐ ํน์ดํฉ๋๋ค. Atmega๋ณด๋ค ๋ ๋ง์ ๊ฒ์ด ๋ถ๋ช ํ์ง๋ง ๋ค๋ฅธ STM ์นฉ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ์น์ 9.1 GPIO์ ์ผ๋ฐ ์ค๋ช :
๊ฐ ๋ฒ์ฉ I/O ํฌํธ (GPIO) 32๊ฐ์ 32๋นํธ ๊ตฌ์ฑ ๋ ์ง์คํฐ(GPIOx_CRL ๋ฐ GPIOx_CRH), 32๊ฐ์ 16๋นํธ ๋ฐ์ดํฐ ๋ ์ง์คํฐ(GPIOx_IDR ๋ฐ GPIOx_ODR), 32๋นํธ ์ค์ /์ฌ์ค์ ๋ ์ง์คํฐ(GPIOx_BSRR), XNUMX๋นํธ ์ฌ์ค์ ๋ ์ง์คํฐ(GPIOx_BRR) ๋ฐ XNUMX๋นํธ ๋ฐ์ดํฐ ๋ ์ง์คํฐ๊ฐ ์์ต๋๋ค. ๋นํธ ์ฐจ๋จ ๋ ์ง์คํฐ(GPIOx_LCKR).
์ฒ์ ๋ ๊ฐ์ ๋ ์ง์คํฐ๋ ํน์ดํ๊ณ ๋งค์ฐ ๋ถํธํฉ๋๋ค. 16๊ฐ์ ํฌํธ ํ์ด "ํ์ ๋น XNUMX๋นํธ" ํ์์ผ๋ก ๋ถ์ฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๊ฒ๋ค. ํ XNUMX~XNUMX์ CRL์ ์๊ณ ๋๋จธ์ง๋ CRH์ ์์ต๋๋ค. ๋์์ ๋๋จธ์ง ๋ ์ง์คํฐ์๋ ํฌํธ์ ๋ชจ๋ ํ ๋นํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ํฌํจ๋๋ฉฐ, ์ข ์ข ์ ๋ฐ์ด "์์ฝ"๋์ด ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๋จ์ํ๋ฅผ ์ํด ๋ชฉ๋ก์ ๋๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
์ฐจ๋จ ๋ ์ง์คํฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์ค์ ๋ฐ ์ฌ์ค์ ๋ ์ง์คํฐ๋ ์๋ก ๋ถ๋ถ์ ์ผ๋ก ๋ณต์ ๋๋ค๋ ์ ์์ ๋งค์ฐ ์ฌ๋ฏธ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ BSRR์๋ง ์ธ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ 16๋นํธ๋ ํ์ 1์ผ๋ก ์ฌ์ค์ ํ๊ณ ํ์ ๋นํธ๋ 16๋ก ์ค์ ๋ฉ๋๋ค. ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์๋ ์์ต๋๋ค. BRR์ ์ฌ์ฉํ์ธ์. ํ์ XNUMX๋นํธ๋ ํ๋ง ์ฌ์ค์ ํฉ๋๋ค. ๋๋ ๋ ๋ฒ์งธ ์ต์ ์ ์ข์ํฉ๋๋ค. ์ด๋ฌํ ๋ ์ง์คํฐ๋ ํ์ ๋ํ ์์์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค.
์์ ์ค์ ๋๋ ์ฌ์ค์
๋นํธ ์์ค์์ GPIOx_ODR์ ํ๋ก๊ทธ๋๋ฐํ ๋ ์ธํฐ๋ฝํธ๋ฅผ ๋นํ์ฑํํ ํ์๊ฐ ์์ต๋๋ค. ๋จ์ผ ์์ ์ฐ๊ธฐ ์์
APB2๋ก ํ๋ ์ด์์ ๋นํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ๋ณ๊ฒฝํด์ผ ํ๋ ๋นํธ์ ์ค์ /์ฌ์ค์ ๋ ์ง์คํฐ(GPIOx_BSRR ๋๋ ์ฌ์ค์ ์ ๊ฒฝ์ฐ GPIOx_BRR)์ "1"์ ๊ธฐ๋กํจ์ผ๋ก์จ ๋ฌ์ฑ๋ฉ๋๋ค. ๋ค๋ฅธ ๋นํธ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๋ฐ์ดํฐ ๋ ์ง์คํฐ์๋ ์ค๋ช ์ด ๋งค์ฐ ํ์ํ ์ด๋ฆ์ด ์์ต๋๋ค. IDR = ์ ๋ ฅ ๋ฐฉํฅ ๋ ์ง์คํฐ, ์ ๋ ฅ ๋ ์ง์คํฐ; ODR = ์ฐ์ถ ๋ฐฉํฅ ๋ ์ง์คํฐ, ์ถ๋ ฅ ๋ ์ง์คํฐ. ํ์ฌ ํ๋ก์ ํธ์์๋ ํ์ํ์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ์ด ๋ ์ง์คํฐ์ ๋๋ค. ๋ ๋ฒ์งธ SPI ํ์ธ PB13, PB14 ๋ฐ PB15์ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ์ฆ์ CRH๋ฅผ ์ดํด๋ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ 20์์ 31๊น์ง์ ๋นํธ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์์ ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ด๋ฏธ ์์๋์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ์คํฌ๋ฆฐ์ท์ ์๋ตํ๊ณ MODE๊ฐ ๋ฐฉํฅ(๋ ๋นํธ๊ฐ ๋ชจ๋ 0์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ ๋ ฅ)๊ณผ ํ ์๋(50MHz๊ฐ ํ์ํจ, ์ฆ 1MHz๊ฐ ํ์ํจ)๋ฅผ ์ง์ ํ๋ค๊ณ ๋ง ํ๊ฒ ์ต๋๋ค. ๋ ํ ๋ชจ๋ "00"๋ก ์ค์ ), CNF๋ ๋ชจ๋๋ฅผ ์ผ๋ฐ "ํธ์-ํ" - 10, "๋์ฒด" - 0์ผ๋ก ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ ๋ณผ ์ ์๋ฏ์ด ๋ชจ๋ ํ์๋ ์๋์์ ์ธ ๋ฒ์งธ ๋นํธ(CNFXNUMX)๊ฐ ์์ต๋๋ค. ๋ชจ๋๋ก ์ค์ ํฉ๋๋ค ๋ถ๋ ์ ๋ ฅ.
์ด ์นฉ์ผ๋ก ๋ค๋ฅธ ์์ ์ ์ํํ ๊ณํ์ด๋ฏ๋ก ๋จ์ํ๋ฅผ ์ํด ํ์ ๋ฐ ์์ ์ ์ด ๋ ์ง์คํฐ ๋ชจ๋์ ๋ํด ๊ฐ๋ฅํ ๋ชจ๋ MODE ๋ฐ CNF ๊ฐ์ ์ ์ํ์ต๋๋ค.
์, ๊ทธ๋ฐ ๊ฒ
#define CNF0_0 0x00000004
#define CNF0_1 0x00000008
#define CNF1_0 0x00000040
#define CNF1_1 0x00000080
#define CNF2_0 0x00000400
#define CNF2_1 0x00000800
#define CNF3_0 0x00004000
#define CNF3_1 0x00008000
#define CNF4_0 0x00040000
#define CNF4_1 0x00080000
#define CNF5_0 0x00400000
#define CNF5_1 0x00800000
#define CNF6_0 0x04000000
#define CNF6_1 0x08000000
#define CNF7_0 0x40000000
#define CNF7_1 0x80000000
#define CNF8_0 0x00000004
#define CNF8_1 0x00000008
#define CNF9_0 0x00000040
#define CNF9_1 0x00000080
#define CNF10_0 0x00000400
#define CNF10_1 0x00000800
#define CNF11_0 0x00004000
#define CNF11_1 0x00008000
#define CNF12_0 0x00040000
#define CNF12_1 0x00080000
#define CNF13_0 0x00400000
#define CNF13_1 0x00800000
#define CNF14_0 0x04000000
#define CNF14_1 0x08000000
#define CNF15_0 0x40000000
#define CNF15_1 0x80000000
#define MODE0_0 0x00000001
#define MODE0_1 0x00000002
#define MODE1_0 0x00000010
#define MODE1_1 0x00000020
#define MODE2_0 0x00000100
#define MODE2_1 0x00000200
#define MODE3_0 0x00001000
#define MODE3_1 0x00002000
#define MODE4_0 0x00010000
#define MODE4_1 0x00020000
#define MODE5_0 0x00100000
#define MODE5_1 0x00200000
#define MODE6_0 0x01000000
#define MODE6_1 0x02000000
#define MODE7_0 0x10000000
#define MODE7_1 0x20000000
#define MODE8_0 0x00000001
#define MODE8_1 0x00000002
#define MODE9_0 0x00000010
#define MODE9_1 0x00000020
#define MODE10_0 0x00000100
#define MODE10_1 0x00000200
#define MODE11_0 0x00001000
#define MODE11_1 0x00002000
#define MODE12_0 0x00010000
#define MODE12_1 0x00020000
#define MODE13_0 0x00100000
#define MODE13_1 0x00200000
#define MODE14_0 0x01000000
#define MODE14_1 0x02000000
#define MODE15_0 0x10000000
#define MODE15_1 0x20000000
ํ์ ํฌํธ B(๊ธฐ๋ณธ ์ฃผ์ โ 0x40010C00)์ ์์ผ๋ฉฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#define _PORTB_(mem_offset) (*(volatile uint32_t *)(0x40010C00 + (mem_offset)))
#define _BRR 0x14
#define _BSRR 0x10
#define _CRL 0x00
#define _CRH 0x04
//ะธัะฟะพะปัะทัะตะผ ััะฐะฝะดะฐััะฝัะน SPI2: MOSI ะฝะฐ B15, CLK ะฝะฐ B13
//LAT ะฟัััั ะฑัะดะตั ะฝะฐ ะฝะตะธัะฟะพะปัะทัะตะผะพะผ MISO โ B14
//ะพัะธัะฐะตะผ ะดะตัะพะปัะฝัะน ะฑะธั, ะพะฝ ะฝะฐะผ ัะพัะฝะพ ะฝะต ะฝัะถะตะฝ
_PORTB_ (_CRH) &= ~(CNF15_0 | CNF14_0 | CNF13_0 | CNF12_0);
//ะฐะปััะตัะฝะฐัะธะฒะฝัะต ััะฝะบัะธะธ ะดะปั MOSI ะธ SCK
_PORTB_ (_CRH) |= CNF15_1 | CNF13_1;
//50 ะะั, MODE = 11
_PORTB_ (_CRH) |= MODE15_1 | MODE15_0 | MODE14_1 | MODE14_0 | MODE13_1 | MODE13_0;
๋ฐ๋ผ์ BRR ๋ฐ BSRR ๋ ์ง์คํฐ์ ์ํด ํธ์์นญ๋๋ LAT์ ๋ํ ์ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
/*** LAT pulse โ high, then low */
#define LAT_pulse() _PORTB_(_BSRR) = (1<<14); _PORTB_(_BRR) = (1<<14)
#define LAT_low() _PORTB_(_BRR) = (1<<14)
(๊ด์ฑ์ ์ํ LAT_low, ํญ์ ๊ทธ๋์์ผ๋ ๊ทธ๋๋ก ๋์ธ์)
์ด์ ๋ชจ๋ ๊ฒ์ด ํ๋ฅญํ์ง๋ง ์๋ํ์ง ์์ต๋๋ค. STM32์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ์ ์ ์ฝํ๋ฏ๋ก ํ์ํ ์ฃผ๋ณ ์ฅ์น์ ํด๋กํน์ ํ์ฑํํด์ผ ํฉ๋๋ค.
์๊ณ ์ผ๊ธฐ
์๊ณ๋ผ๊ณ ๋ ์๋ ค์ง ์๊ณ๋ ์๊ฐ ์ธก์ ์ ๋ด๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฏธ RCC๋ผ๋ ์ฝ์ด๋ฅผ ๋ณผ ์ ์์์ต๋๋ค. ๋ฌธ์์์ ์ด๋ฅผ ์ฐพ์ต๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ ๋ฐ ์๊ณ ์ ์ด์ ๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด ๋คํ์ค๋ฝ๊ฒ๋ ์๊ณ ์ธก์ ์ฃผ์ ์ค ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ์ STM ์ง์์ด ์ฐ๋ฆฌ๋ฅผ ์ํด ์ํํด ์ฃผ์์ต๋๋ค. ์ด์ ๋ํด ๋งค์ฐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. (๋ค์ ํ ๋ฒ ๋งํฌ๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
#define _RCC_(mem_offset) (*(volatile uint32_t *)(0x40021000 + (mem_offset)))
๊ทธ๋ฐ ๋ค์ ํ๋ ์ดํธ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐพ์ผ๋ ค๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ํจ์ฌ ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ค์ ์น์ ์์ ํ์ฑํ ๋ ์ง์คํฐ์ ๋ํ ์ค๋ช ์ ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. ๋ ์ง์คํฐ ํ์ฑํ. RCC_APB1ENR ๋ฐ RCC_APB2ENR์ ์ฐพ์ ์์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ SPI2, IOPB(I/O ํฌํธ B) ๋ฐ ๋์ฒด ๊ธฐ๋ฅ(AFIO)์ ํด๋ฌํน์ ํฌํจํ๋ ๋นํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
#define _APB2ENR 0x18
#define _APB1ENR 0x1C
#define IOPBEN 0x0008
#define SPI2EN 0x4000
#define AFIOEN 0x0001
//ะฒะบะปััะฐะตะผ ัะฐะบัะธัะพะฒะฐะฝะธะต ะฟะพััะฐ B ะธ ะฐะปัั. ััะฝะบัะธะน
_RCC_(_APB2ENR) |= IOPBEN | AFIOEN;
//ะฒะบะปััะฐะตะผ ัะฐะบัะธัะพะฒะฐะฝะธะต SPI2
_RCC_(_APB1ENR) |= SPI2EN;
์ต์ข
์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค
ํ ์คํธํ ๊ธฐํ์ ์๊ตฌ๊ฐ ์๋ค๋ฉด DM634๋ฅผ DAI๋ฅผ PB15์, DCK๋ฅผ PB13์, LAT๋ฅผ PB14์ ์ฐ๊ฒฐํ์ญ์์ค. ์ฐ๋ฆฌ๋ 5V์์ ๋๋ผ์ด๋ฒ์ ์ ์์ ๊ณต๊ธํ๋ฉฐ ์ ์ง๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
STM8 PWM
STM8์ PWM
์ ๊ฐ ์ด ๊ธฐ์ฌ๋ฅผ ๊ธฐํํ ๋น์, ์ ๋ ๋ถ์ธ ์์ด ์ ๋ฐ์ ๋ง๋๋ ์ฌ๋์ด ๋์ง ์๋๋ก ๋ฐ์ดํฐ์ํธ๋ง ์ฌ์ฉํ์ฌ ์ต์ํ์ง ์์ ์นฉ์ ์ผ๋ถ ๊ธฐ๋ฅ์ ๋ง์คํฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. STM8์ ์ด ์ญํ ์ ์ด์์ ์ด์์ต๋๋ค. ์ฒซ์งธ, STM8S103์ด ํฌํจ๋ ์ค๊ตญ ๋ณด๋ ๋ ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์๊ณ ๋์งธ, ๊ทธ๋ค์ง ์ธ๊ธฐ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท์์ ์๋ฃจ์ ์ ์ฝ๊ณ ์ฐพ๊ณ ์ถ์ ์ ํน์ ๋ฐ๋ก ์ด๋ฌํ ์๋ฃจ์ ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์นฉ์๋ ๋ํ
ํด๋ฌํน ๋ฐ I/O
๊ธฐ๋ณธ์ ์ผ๋ก STM8์ 2MHz์ ์ฃผํ์์์ ์๋ํ๋ฏ๋ก ์ฆ์ ์์ ํด์ผ ํฉ๋๋ค.
HSI(๊ณ ์ ๋ด๋ถ) ํด๋ก
HSI ํด๋ก ์ ํธ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ๋ถ๋ฐฐ๊ธฐ(16~1)๊ฐ ์๋ ๋ด๋ถ 8MHz RC ๋ฐ์ง๊ธฐ์์ ํ์๋ฉ๋๋ค. ์ด๋ ํด๋ญ ๋ถ๋ฐฐ๊ธฐ ๋ ์ง์คํฐ(CLK_CKDIVR)์ ์ค์ ๋ฉ๋๋ค.
์ฐธ๊ณ : ์ฒ์์๋ ๋ถ๋ฐฐ๊ธฐ๊ฐ 8์ธ HSI RC ๋ฐ์ง๊ธฐ๊ฐ ํด๋ก ์ ํธ์ ์ฃผ์ ์์ค๋ก ์ ํ๋ฉ๋๋ค.
๋ฐ์ดํฐ์ํธ์์ ๋ ์ง์คํฐ ์ฃผ์๋ฅผ ์ฐพ๊ณ refman์์ ์ค๋ช ์ ์ฐพ์ ๋ ์ง์คํฐ๋ฅผ ์ง์์ผ ํจ์ ํ์ธํฉ๋๋ค.
#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6
CLK_CKDIVR &= ~(0x18);
PWM์ ์คํํ๊ณ LED๋ฅผ ์ฐ๊ฒฐํ ๊ฒ์ด๋ฏ๋ก ํ์์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์นฉ์ ์๊ณ ๋ง์ ๊ธฐ๋ฅ์ด ๋์ผํ ํ์ ์ ์ง๋์ด ์์ต๋๋ค. ๋๊ดํธ ์์ ๋ด์ฉ์ "๋์ฒด ๊ธฐ๋ฅ"์ด๋ฉฐ "์ต์ ๋ฐ์ดํธ"(์ต์ ๋ฐ์ดํธ) โ Atmega ํจ์ฆ์ ๊ฐ์ ๊ฒ์ ๋๋ค. ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ๋ถํ ํ์๋ง ํ์ฑํ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ST Visual Programmer(Visual Development์ ํจ๊ป ๋ค์ด๋ก๋)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ํ์์์ ์ฒซ ๋ฒ์งธ ํ์ด๋จธ์ CH1 ๋ฐ CH2 ํ์ด ๋๊ดํธ ์์ ์จ๊ฒจ์ ธ ์์์ ๋ณด์ฌ์ค๋๋ค. STVP์์ AFR1 ๋ฐ AFR0 ๋นํธ๋ฅผ ์ค์ ํด์ผ ํ๋ฉฐ ๋ ๋ฒ์งธ ๋นํธ๋ ๋ ๋ฒ์งธ ํ์ด๋จธ์ CH1 ์ถ๋ ฅ๋ PD4์์ PC5๋ก ์ ์กํฉ๋๋ค.
๋ฐ๋ผ์ 6๊ฐ์ ํ์ด LED๋ฅผ ์ ์ดํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํ์ด๋จธ์ ๊ฒฝ์ฐ PC6, PC7 ๋ฐ PC3, ๋ ๋ฒ์งธ ํ์ด๋จธ์ ๊ฒฝ์ฐ PC5, PD3 ๋ฐ PA3์ ๋๋ค.
STM8์์ I/O ํ ์์ฒด๋ฅผ ์ค์ ํ๋ ๊ฒ์ STM32๋ณด๋ค ๋ ๊ฐ๋จํ๊ณ ๋ ผ๋ฆฌ์ ์ ๋๋ค.
- Atmega DDR ๋ฐ์ดํฐ ๋ฐฉํฅ ๋ ์ง์คํฐ(๋ฐ์ดํฐ ๋ฐฉํฅ ๋ ์ง์คํฐ): 1 = ์ถ๋ ฅ;
- ์ฒซ ๋ฒ์งธ ์ ์ด ๋ ์ง์คํฐ CR1์ ์ถ๋ ฅ ์ ํธ์ํ ๋ชจ๋(1) ๋๋ ์คํ ๋๋ ์ธ(0)์ ์ค์ ํฉ๋๋ค. LED๋ฅผ ์๊ทน์ผ๋ก ์นฉ์ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ XNUMX์ ๋จ๊ฒจ ๋ก๋๋ค.
- ๋ ๋ฒ์งธ ์ ์ด ๋ ์ง์คํฐ CR2๋ ์ถ๋ ฅ ์ ํด๋ญ ์๋๋ฅผ ์ค์ ํฉ๋๋ค. 1 = 10MHz
#define PA_DDR *(volatile uint8_t *)0x005002
#define PA_CR2 *(volatile uint8_t *)0x005004
#define PD_DDR *(volatile uint8_t *)0x005011
#define PD_CR2 *(volatile uint8_t *)0x005013
#define PC_DDR *(volatile uint8_t *)0x00500C
#define PC_CR2 *(volatile uint8_t *)0x00500E
PA_DDR = (1<<3); //output
PA_CR2 |= (1<<3); //fast
PD_DDR = (1<<3); //output
PD_CR2 |= (1<<3); //fast
PC_DDR = ((1<<3) | (1<<5) | (1<<6) | (1<<7)); //output
PC_CR2 |= ((1<<3) | (1<<5) | (1<<6) | (1<<7)); //fast
PWM ์ค์
๋จผ์ ์ฉ์ด๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค.
- PWM ์ฃผํ์ โ ํ์ด๋จธ๊ฐ ์๋ํ๋ ๋น๋;
- ์๋ ์ฌ์ฅ์ , AR โ ํ์ด๋จธ๊ฐ ๊ณ์ฐ๋๋ ์๋ ๋ก๋ ๊ฐ๋ฅ ๊ฐ(ํ์ค ์ฃผ๊ธฐ)
- ์ ๋ฐ์ดํธ ์ด๋ฒคํธ, UEV โ ํ์ด๋จธ๊ฐ AR๊น์ง ์นด์ดํธ๋์์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ;
- PWM ๋ํฐ ์ฌ์ดํด โ ํํ "๋ํฐ ํฉํฐ"๋ผ๊ณ ๋ถ๋ฆฌ๋ PWM ๋ํฐ ์ฌ์ดํด
- ๊ฐ ์บก์ฒ/๋น๊ต โ ํ์ด๋จธ๊ฐ ๊ณ์ฐํ ์บก์ฒ/๋น๊ต ๊ฐ ๋ญ๊ฐ ํ ๊ฒ์ด๋ค (PWM์ ๊ฒฝ์ฐ ์ถ๋ ฅ ์ ํธ๋ฅผ ๋ฐ์ ์ํต๋๋ค.)
- ์์ ๊ฐ โ ๋ฏธ๋ฆฌ ๋ก๋๋ ๊ฐ. ๊ฐ์น ๋น๊ต ํ์ด๋จธ๊ฐ ์๋ํ๋ ๋์์๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด PWM ์ฌ์ดํด์ด ์ค๋จ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด ์ ์ก๋ ๊ฐ์ ๋ฒํผ์ ๋ฐฐ์น๋๊ณ ํ์ด๋จธ๊ฐ ์นด์ดํธ๋ค์ด์ ๋์ ๋๋ฌํ์ฌ ์ฌ์ค์ ๋ ๋ ๊บผ๋ด์ง๋๋ค.
- ๊ฐ์ฅ์๋ฆฌ ์ ๋ ฌ ะธ ์ค์ ์ ๋ ฌ ๋ชจ๋ โ ๊ฒฝ๊ณ์ ๊ณผ ์ค์์ ์ ๋ ฌ, Atmel๊ณผ ๋์ผ ๋น ๋ฅธ PWM ะธ ์์์ฐจ PWM.
- OCiREF, ์ถ๋ ฅ ๋น๊ต ์ฐธ์กฐ ์ ํธ โ ์ค์ ๋ก PWM ๋ชจ๋์์ ํด๋น ํ์ ๋ํ๋๋ ์ฐธ์กฐ ์ถ๋ ฅ ์ ํธ์ ๋๋ค.
ํ์์์์ ์ด๋ฏธ ์ ์ ์๋ฏ์ด ๋ ๊ฐ์ ํ์ด๋จธ์๋ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ์ PWM ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ ๋ค 16๋นํธ์ด๊ณ , ์ฒซ ๋ฒ์งธ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ๋ง์ด ์์ต๋๋ค(ํนํ ์์๋๋ก ์นด์ดํธํ ์ ์์ต๋๋ค). ์ฐ๋ฆฌ๋ ๋ ๋ค ๋๋ฑํ๊ฒ ์๋ํด์ผ ํ๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์๋ ๊ฒ์ ์ค์๋ก ์ฌ์ฉํ์ง ์๊ธฐ ์ํด ๋ถ๋ช ํ ๋ ์ด์ ํ ๋ ๋ฒ์งธ ๊ฒ๋ถํฐ ์์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ช ๊ฐ์ง ๋ฌธ์ ๋ ์ฐธ์กฐ ๋งค๋ด์ผ์ ๋ชจ๋ ํ์ด๋จธ์ PWM ๊ธฐ๋ฅ์ ๋ํ ์ค๋ช ์ด ์ฒซ ๋ฒ์งธ ํ์ด๋จธ(17.5.7 PWM ๋ชจ๋)์ ๋ํ ์ฅ์ ์์ผ๋ฏ๋ก ํญ์ ๋ฌธ์ ์ ์ฒด์์ ์๋ค๋ก ์ด๋ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
STM8์ PWM์ Atmega์ PWM์ ๋นํด ์ค์ํ ์ด์ ์ด ์์ต๋๋ค.
๊ฒฝ๊ณ ์ ๋ ฌ PWM
์๋์์ ์๋ก ๊ณ์ ๊ตฌ์ฑ
TIM_CR1 ๋ ์ง์คํฐ์ DIR ๋นํธ๊ฐ ์ง์์ง๋ฉด ์ํฅ์ ์นด์ดํ
์ด ํ์ฑํ๋ฉ๋๋ค.
์
์ด ์์์๋ ์ฒซ ๋ฒ์งธ PWM ๋ชจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. PWM ๊ธฐ์ค ์ ํธ OCiREF๋ TIM1_CNT < TIM1_CCRi์ธ ๋์ ๋๊ฒ ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฎ์ ์์ค์ด ํ์ํฉ๋๋ค. TIM1_CCRi ๋ ์ง์คํฐ์ ๋น๊ต ๊ฐ์ด ์๋ ๋ก๋ ๊ฐ(TIM1_ARR ๋ ์ง์คํฐ)๋ณด๋ค ํฐ ๊ฒฝ์ฐ OCiREF ์ ํธ๋ 1๋ก ์ ์ง๋ฉ๋๋ค. ๋น๊ต๊ฐ์ด 0์ด๋ฉด OCiREF๋ XNUMX์ผ๋ก ์ ์ง๋ฉ๋๋ค....
๋์ STM8 ํ์ด๋จธ ์
๋ฐ์ดํธ ์ด๋ฒคํธ ๋จผ์ ํ์ธ ๊ฐ์ ๋น๊ตํ๋ค, ๊ทธ๋ฐ ๋ค์์๋ง ์ฐธ์กฐ ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. Atmega์ ํ์ด๋จธ๋ ๋จผ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ ๋ค์ ๋น๊ตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค. compare value == 0
์ถ๋ ฅ์ ์ด๋ป๊ฒ๋ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ๋ฐ๋์
๋๋ค(์: ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋
ผ๋ฆฌ๋ฅผ ๋ฐ์ ํ์ฌ).
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ๊ฒ์: 8๋นํธ PWM(AR == 255
), ์๋์์ ์๋ก ๊ณ์ฐํ๊ณ ํ
๋๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ ๋ ฌํฉ๋๋ค. ์ ๊ตฌ๋ ์๊ทน์ผ๋ก ์นฉ์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก PWM์ ๋ค์์ด ๋ ๋๊น์ง 0(LED ์ผ์ง)์ ์ถ๋ ฅํด์ผ ํฉ๋๋ค. ๊ฐ์ ๋น๊ตํ๋ค ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ดํ 1๊ฐ.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ผ๋ถ ๋ด์ฉ์ ์ฝ์์ต๋๋ค. PWM ๋ชจ๋, ๋ฐ๋ผ์ ์ฐธ์กฐ ๋งค๋ด์ผ์์ ์ด ๋ฌธ๊ตฌ(18.6.8 - TIMx_CCMR1)๋ฅผ ๊ฒ์ํ์ฌ ๋ ๋ฒ์งธ ํ์ด๋จธ์ ํ์ ๋ ์ง์คํฐ๋ฅผ ์ฐพ์ต๋๋ค.
110: ์ฒซ ๋ฒ์งธ PWM ๋ชจ๋ โ ์๋์์ ์๋ก ๊ณ์ฐํ ๋ TIMx_CNT < TIMx_CCR1์ธ ๋์ ์ฒซ ๋ฒ์งธ ์ฑ๋์ด ํ์ฑํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ์ฑ๋์ด ๋นํ์ฑํ๋ฉ๋๋ค. [์ถ๊ฐ ๋ฌธ์์๋ ํ์ด๋จธ 1์์ ์๋ชป๋ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ์์ต๋๋ค.] 111: ๋ ๋ฒ์งธ PWM ๋ชจ๋ โ ์๋์์ ์๋ก ๊ณ์ฐํ ๋ TIMx_CNT < TIMx_CCR1 ๋์ ์ฒซ ๋ฒ์งธ ์ฑ๋์ด ๋นํ์ฑํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ์ฑ๋์ด ํ์ฑํ๋ฉ๋๋ค.
LED๋ ์๊ทน์ผ๋ก MK์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ๋ ๋ฒ์งธ ๋ชจ๋๊ฐ ์ ํฉํฉ๋๋ค(์ฒซ ๋ฒ์งธ ๋ชจ๋๋ ๋ง์ฐฌ๊ฐ์ง์ง๋ง ์์ง์ ์์ง ๋ชปํฉ๋๋ค).
๋นํธ 3 OC1PE: ํ 1 ์์ ํ์ฑํ
0: TIMx_CCR1์ ์ฌ์ ๋ก๋ ๋ ์ง์คํฐ๊ฐ ๋นํ์ฑํ๋ฉ๋๋ค. ์ธ์ ๋ ์ง TIMx_CCR1์ ์ธ ์ ์์ต๋๋ค. ์๋ก์ด ๊ฐ์ ์ฆ์ ์ ์ฉ๋ฉ๋๋ค.
1: TIMx_CCR1์ ์ฌ์ ๋ก๋ ๋ ์ง์คํฐ๊ฐ ํ์ฑํ๋ฉ๋๋ค. ์ฝ๊ธฐ/์ฐ๊ธฐ ์์
์ ์ฌ์ ๋ก๋ ๋ ์ง์คํฐ์ ์ก์ธ์คํฉ๋๋ค. ๋ฏธ๋ฆฌ ๋ก๋๋ ๊ฐ TIMx_CCR1์ ๊ฐ ์
๋ฐ์ดํธ ์ด๋ฒคํธ ์ค์ ์๋์ฐ ๋ ์ง์คํฐ์ ๋ก๋๋ฉ๋๋ค.
*์ฐธ๊ณ : PWM ๋ชจ๋๊ฐ ์ ๋๋ก ์๋ํ๋ ค๋ฉด ์ฌ์ ๋ก๋ ๋ ์ง์คํฐ๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ ๋จ์ผ ์ ํธ ๋ชจ๋์์๋ ํ์ํ์ง ์์ต๋๋ค(OPM ๋นํธ๋ TIMx_CR1 ๋ ์ง์คํฐ์ ์ค์ ๋จ).
์ข์ต๋๋ค. ๋ ๋ฒ์งธ ํ์ด๋จธ์ ์ธ ์ฑ๋์ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ผ๊ฒ ์ต๋๋ค.
#define TIM2_CCMR1 *(volatile uint8_t *)0x005307
#define TIM2_CCMR2 *(volatile uint8_t *)0x005308
#define TIM2_CCMR3 *(volatile uint8_t *)0x005309
#define PWM_MODE2 0x70 //PWM mode 2, 0b01110000
#define OCxPE 0x08 //preload enable
TIM2_CCMR1 = (PWM_MODE2 | OCxPE);
TIM2_CCMR2 = (PWM_MODE2 | OCxPE);
TIM2_CCMR3 = (PWM_MODE2 | OCxPE);
AR์ ๋ ๊ฐ์ XNUMX๋นํธ ๋ ์ง์คํฐ๋ก ๊ตฌ์ฑ๋๋ฉฐ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค.
#define TIM2_ARRH *(volatile uint8_t *)0x00530F
#define TIM2_ARRL *(volatile uint8_t *)0x005310
TIM2_ARRH = 0;
TIM2_ARRL = 255;
๋ ๋ฒ์งธ ํ์ด๋จธ๋ ์๋์์ ์๋ก๋ง ๊ณ์ฐํ ์ ์์ผ๋ฉฐ ํ ๋๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ ๋ ฌ๋๋ฏ๋ก ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผํ์ ๋ถ๋ฐฐ๊ธฐ๋ฅผ 256์ผ๋ก ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ๋ฒ์งธ ํ์ด๋จธ์ ๊ฒฝ์ฐ ๋ถ๋ฐฐ๊ธฐ๋ TIM2_PSCR ๋ ์ง์คํฐ์ ์ค์ ๋๋ฉฐ XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๋๋ค.
#define TIM2_PSCR *(volatile uint8_t *)0x00530E
TIM2_PSCR = 8;
๋จ์ ๊ฒ์ ๊ฒฐ๋ก ๊ณผ ๋ ๋ฒ์งธ ํ์ด๋จธ ์์ฒด๋ฅผ ์ผ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ ๋ ์ง์คํฐ๋ฅผ ํตํด ํด๊ฒฐ๋ฉ๋๋ค. ์บก์ฒ/๋น๊ต ์ฌ์ฉ: 1, XNUMX๊ฐ์ ์ฑ๋์ด ๋น๋์นญ์ผ๋ก ํฉ์ด์ ธ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ ํธ์ ๊ทน์ฑ์ ๋ฐ๊พธ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์์น์ ์ผ๋ก PWM ๋ชจ๋ XNUMX์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
#define TIM2_CCER1 *(volatile uint8_t *)0x00530A
#define TIM2_CCER2 *(volatile uint8_t *)0x00530B
#define CC1E (1<<0) // CCER1
#define CC2E (1<<4) // CCER1
#define CC3E (1<<0) // CCER2
TIM2_CCER1 = (CC1E | CC2E);
TIM2_CCER2 = CC3E;
๋ง์ง๋ง์ผ๋ก TIMx_CR1 ๋ ์ง์คํฐ์์ ํ์ด๋จธ๋ฅผ ์์ํฉ๋๋ค.
#define TIM2_CR1 *(volatile uint8_t *)0x005300
TIM2_CR1 |= 1;
๋น๊ต๋ฅผ ์ํด ์ค์ ๊ฐ์ ํ์ด๋จธ๋ก ์ ์กํ๋ AnalogWrite()์ ๊ฐ๋จํ ์๋ ๋ก๊ทธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ์ง์คํฐ ์ด๋ฆ์ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ง์ ๋ฉ๋๋ค. ์บก์ฒ/๋น๊ต ๋ ์ง์คํฐ, ๊ฐ ์ฑ๋๋ง๋ค ๋ ๊ฐ๊ฐ ์์ต๋๋ค: TIM8_CCRxL์ ํ์ 2๋นํธ์ TIM2_CCRxH์ ์์ 8๋นํธ. XNUMX๋นํธ PWM์ ์์ฑํ์ผ๋ฏ๋ก ์ตํ์ ๋นํธ๋ง ์ฐ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
#define TIM2_CCR1L *(volatile uint8_t *)0x005312
#define TIM2_CCR2L *(volatile uint8_t *)0x005314
#define TIM2_CCR3L *(volatile uint8_t *)0x005316
void setRGBled(uint8_t r, uint8_t g, uint8_t b)
{
TIM2_CCR1L = r;
TIM2_CCR2L = g;
TIM2_CCR3L = b;
}
์ธ์ฌํ ๋ ์๋ผ๋ฉด 100% ์ฑ์์ ์์ฑํ ์ ์๋ ์ฝ๊ฐ ๊ฒฐํจ์ด ์๋ PWM์ด ์์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค(์ต๋ ๊ฐ 255์์ ์ ํธ๋ ํ ํ์ด๋จธ ์ฃผ๊ธฐ ๋์ ๋ฐ์ ๋ฉ๋๋ค). LED์ ๊ฒฝ์ฐ ์ด๋ ์ค์ํ์ง ์์ผ๋ฉฐ ์ธ์ฌํ ๋ ์๋ ์ด๋ฏธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ถ์ธกํ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ํ์ด๋จธ์ PWM์ด ์๋ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํ์ด๋จธ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ํ์ด๋จธ๋ ๋์ผํ ๋ ์ง์คํฐ์ ์ ํํ ๋์ผํ ๋นํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค(๋ ๋ฒ์งธ ํ์ด๋จธ์ "์์ฝ"๋ ์ํ๋ก ๋จ์ ์๋ ๋นํธ๋ ๋ชจ๋ ์ข ๋ฅ์ ๊ณ ๊ธ ์์ ์ ์ํด ์ฒซ ๋ฒ์งธ ํ์ด๋จธ์์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค). ๋ฐ๋ผ์ ๋ฐ์ดํฐ์ํธ์์ ๋์ผํ ๋ ์ง์คํฐ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ์, ์ฃผํ์ ๋ถ๋ฐฐ๊ธฐ์ ๊ฐ์ ๋ฐ๊พธ์ธ์. ์๋๋ฉด... ์ฒซ ๋ฒ์งธ ํ์ด๋จธ๋ 16์ ๊ฑฐ๋ญ์ ๊ณฑ์ด ์๋ ๋ ๋ ์ง์คํฐ์ ์ ํํ XNUMX๋นํธ ๊ฐ์ ์์ ํ๋ ค๊ณ ํฉ๋๋ค. ํ๋ฆฌ์ค์ผ์ผ๋ฌ ๋์ ะธ ๋ฎ์. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ๋ค ํ๋๋ฐ... ์ฒซ ๋ฒ์งธ ํ์ด๋จธ๊ฐ ์๋ํ์ง ์์ต๋๋ค. ๋ฌด์จ ์ผ์ด์ผ?
๋ฌธ์ ๋ ํ์ด๋จธ 1์ ์ ์ด ๋ ์ง์คํฐ์ ๋ํ ์ ์ฒด ์น์ ์ ์ดํด๋ด์ผ๋ก์จ๋ง ํด๊ฒฐ๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ ๋ฒ์งธ ํ์ด๋จธ์ ์๋ ๊ฒ์ ์ฐพ์ต๋๋ค. ์์ ๊ฒ์ด๋ค 17.7.30 ๋ธ๋ ์ดํฌ ๋ ์ง์คํฐ(TIM1_BKR), ์ฌ๊ธฐ์ ๋ค์ ๋นํธ๊ฐ ์์ต๋๋ค.
๋ฉ์ธ ์ถ๋ ฅ ํ์ฑํ
#define TIM1_BKR *(volatile uint8_t *)0x00526D
TIM1_BKR = (1<<7);
์ด์ ํ์คํด์ก์ต๋๋ค. ์ฝ๋๋
STM8 ๋ฉํฐํ๋ ์ค
STM8์ ๋ฉํฐํ๋ ์ฑ
์ธ ๋ฒ์งธ ๋ฏธ๋ ํ๋ก์ ํธ๋ XNUMX๊ฐ์ RGB LED๋ฅผ ๋ ๋ฒ์งธ ํ์ด๋จธ์ PWM ๋ชจ๋๋ก ์ฐ๊ฒฐํด ์๋ก ๋ค๋ฅธ ์์์ ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. ์ด๋ LED ๋ฉํฐํ๋ ์ฑ์ ๊ฐ๋
์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ฆ, LED๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ผ๊ณ ๋๋ฉด LED๊ฐ ๊ณ์ ์ผ์ ธ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค(๋น์ ์ ์ง์์ฑ, ์๊ฐ์ ์ธ์์ ๊ด์ฑ). ๋๋ ํ๋ ๊ทธ๋ฌ์ด
์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ RGB LED์ ์๊ทน์ ์ฐ๊ฒฐํ๊ณ ;
- ๋ถ์ ์ผ๊ณ ํ์ํ ์ ํธ๋ฅผ ์๊ทน์ ๋ณด๋ ๋๋ค.
- PWM ์ฌ์ดํด์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ์ต๋๋ค.
- ๋ ๋ฒ์งธ RGB LED์ ์๊ทน์ ์ฐ๊ฒฐํ๊ณ ;
- ๋ถ์ ๋ถ์๋ค...
๊ธ์์. ๋ฌผ๋ก , ์๋ฆ๋ค์ด ์๋์ ์ํด์๋ ์๊ทน์ด ์ฐ๊ฒฐ๋๊ณ ๋์์ LED๊ฐ "์ ๋ฑ"๋์ด์ผ ํฉ๋๋ค. ๊ธ์, ์๋๋ฉด ๊ฑฐ์. ์ด์จ๋ ๋ ๋ฒ์งธ ํ์ด๋จธ์ XNUMX๊ฐ ์ฑ๋์ ๊ฐ์ ์ถ๋ ฅํ๊ณ UEV์ ๋๋ฌํ๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋์์ ํ์ฌ ํ์ฑํ๋ RGB LED๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
LED ์ ํ์ ์๋์ด๋ฏ๋ก ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ "๋น๋์ค ๋ฉ๋ชจ๋ฆฌ"๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋จํ ๋ฐฐ์ด์ ๋๋ค:
uint8_t colors[8][3];
ํน์ LED์ ์์์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ด ๋ฐฐ์ด์ ํ์ํ ๊ฐ์ ์ฐ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ์๋ ํ์ฑ LED์ ์๋ฅผ ๋ด๋นํฉ๋๋ค.
uint8_t cnt;
๋๋จน์ค
์ ์ ํ ๋ฉํฐํ๋ ์ฑ์ ์ํด์๋ ์ด์ํ๊ฒ๋ CD74HC238 ๋๋ฉํฐํ๋ ์๊ฐ ํ์ํฉ๋๋ค. ๋๋ฉํฐํ๋ ์ - ํ๋์จ์ด์์ ์ฐ์ฐ์๋ฅผ ๊ตฌํํ๋ ์นฉ <<
. 0๊ฐ์ ์
๋ ฅ ํ(๋นํธ 1, 2, XNUMX)์ ํตํด XNUMX๋นํธ ์ซ์ X๋ฅผ ๊ณต๊ธํ๊ณ ์ด์ ๋ํ ์๋ต์ผ๋ก ์ถ๋ ฅ ์ซ์(1<<X
). ์นฉ์ ๋๋จธ์ง ์
๋ ฅ์ ์ ์ฒด ์ค๊ณ๋ฅผ ํ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ดํฌ๋ก ์ปจํธ๋กค๋ฌ์ ์ ์ ํ ์๋ฅผ ์ค์ด๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ค์๋ก ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ๋ ๋ง์ LED๋ฅผ ์ผ์ง ์๊ณ MK๋ฅผ ํ์ฐ์ง ์๋๋ก ์์ ์ ์ํด์๋์ด ์นฉ์ด ํ์ํฉ๋๋ค. ์นฉ์ ๊ฐ๊ฒฉ์ XNUMXํ๋์ด๋ฉฐ ํญ์ ๊ฐ์ ์ ์ฝ์ฅ์ ๋ณด๊ดํด์ผ ํฉ๋๋ค.
CD74HC238์ ์ํ๋ LED์ ์๊ทน์ ์ ์์ ๊ณต๊ธํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ณธ๊ฒฉ์ ์ธ ๋ฉํฐํ๋ ์ค์์๋ P-MOSFET์ ํตํด ์ด์ ์ ์์ ๊ณต๊ธํ์ง๋ง ์ด ๋ฐ๋ชจ์์๋ ์ง์ ๊ฐ๋ฅํฉ๋๋ค. ์ ๋ฐ๋ฅด๋ฉด 20mA๋ฅผ ์๋ชจํฉ๋๋ค. ์ ๋ ์ต๋ ๋ฑ๊ธ ๋ฐ์ดํฐ ์ํธ์์. ์์
H = ๋์ ์ ์ ๋ ๋ฒจ, L = ๋ฎ์ ์ ์ ๋ ๋ฒจ, X โ ์๊ด ์์
E2์ E1์ ์ ์ง์ ์ฐ๊ฒฐํ๊ณ E3, A0, A1 ๋ฐ A3์ STM5์ PD3, PC4, PC5 ๋ฐ PC8 ํ์ ์ฐ๊ฒฐํฉ๋๋ค. ์์ ํ์๋ ๋ก์ฐ ๋ ๋ฒจ๊ณผ ํ์ด ๋ ๋ฒจ์ด ๋ชจ๋ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ด๋ฌํ ํ์ ํธ์ํ ํ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
PWM
๋ ๋ฒ์งธ ํ์ด๋จธ์ PWM์ ์ด์ ์ด์ผ๊ธฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋์ง๋ง ๋ ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๋จผ์ , ์ธํฐ๋ฝํธ๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ ๋ฐ์ดํธ ์ด๋ฒคํธ (UEV) ํ์ฑ LED๋ฅผ ์ ํํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ ๋นํธ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ํ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ ์ธํฐ๋ฝํธ ํ์ฑํ ์ด๋ฆ์ ์ ์ ์๋ ๊ธฐ๋ก๋ถ์
์ธํฐ๋ฝํธ ํ์ฑํ ๋ ์ง์คํฐ
#define TIM2_IER *(volatile uint8_t *)0x005303
//enable interrupt
TIM2_IER = 1;
๋ ๋ฒ์งธ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ค์คํ ํ์๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ณ ์คํธ โ ๋ค์ด์ค๋์ ๊ธฐ์ ๋ฐ๊ด. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ UEV์์ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํจ ํ์ด๋จธ๊ฐ ๊ณ์ ํฑํ๊ณ ํ์ด๋จธ๊ฐ ํ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐ๊ธฐ ์์ํ๊ธฐ ์ ์ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๊ฐ LED๋ฅผ ์ ํํ ์๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋ํ๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ ผ๋ฆฌ๋ฅผ ๋ฐ์ ํ๊ณ (0 = ์ต๋ ๋ฐ๊ธฐ, 255 = ์๋ฌด๊ฒ๋ ์ผ์ง์ง ์์) ๊ทน๋จ์ ์ธ ๋ํฐ ์ฌ์ดํด ๊ฐ์ ํผํด์ผ ํฉ๋๋ค. ์ ๊ฒ๋ค. UEV ์ดํ LED๊ฐ ํ ๋ฒ์ PWM ์ฌ์ดํด ๋์ ์์ ํ ๊บผ์ง๋์ง ํ์ธํ์ญ์์ค.
๊ทน์ฑ ๋ณ๊ฒฝ:
//set polarity
TIM2_CCER1 |= (CC1P | CC2P);
TIM2_CCER2 |= CC3P;
r, g, b๋ฅผ 255๋ก ์ค์ ํ๋ ๊ฒ์ ํผํ๊ณ ์ฌ์ฉํ ๋ ์ด๋ฅผ ๋ฐ์ ์ํค๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์ธํฐ๋ฝํธ
์ธํฐ๋ฝํธ์ ๋ณธ์ง์ ํน์ ์ํฉ์์ ์นฉ์ด ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ ์คํ์ ์ค์งํ๊ณ ์ผ๋ถ ์ธ๋ถ ๊ธฐ๋ฅ์ ํธ์ถํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ด๋จธ๋ฅผ ํฌํจํ ์ธ๋ถ ๋๋ ๋ด๋ถ ์ํฅ์ผ๋ก ์ธํด ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
ST Visual Development์์ ์ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ ๋, main.c
์ฐ๋ฆฌ๋ ์ ๋นํ ํ์ผ์ด ์๋ ์ฐฝ์ ๋ฐ์์ต๋๋ค stm8_interrupt_vector.c
, ํ๋ก์ ํธ์ ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค. ์ด ํ์ผ์์๋ ๊ฐ ์ธํฐ๋ฝํธ์ ๊ธฐ๋ฅ์ด ํ ๋น๋ฉ๋๋ค. NonHandledInterrupt
. ํจ์๋ฅผ ์ํ๋ ์ธํฐ๋ฝํธ์ ๋ฐ์ธ๋ฉํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ์ํธ์๋ ์ธํฐ๋ฝํธ ๋ฒกํฐ ํ ์ด๋ธ์ด ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ํ์ํ ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค.
13 TIM2 ์
๋ฐ์ดํธ/์ค๋ฒํ๋ก
14 TIM2 ์บก์ฒ/๋น๊ต
UEV์์ LED๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฏ๋ก ์ธํฐ๋ฝํธ #13์ด ํ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋จผ์ ํ์ผ์์ stm8_interrupt_vector.c
13๋ฒ ์ธํฐ๋ฝํธ(IRQ13)๋ฅผ ๋ด๋นํ๋ ํจ์์ ๊ธฐ๋ณธ ์ด๋ฆ์ ์ํ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
{0x82, TIM2_Overflow}, /* irq13 */
๋ ๋ฒ์งธ๋ก ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค. main.h
๋ค์ ๋ด์ฉ์ผ๋ก:
#ifndef __MAIN_H
#define __MAIN_H
@far @interrupt void TIM2_Overflow (void);
#endif
๋ง์ง๋ง์ผ๋ก ์ด ํจ์๋ฅผ main.c
:
@far @interrupt void TIM2_Overflow (void)
{
PD_ODR &= ~(1<<5); // ะฒัััะฑะฐะตะผ ะดะตะผัะปััะธะฟะปะตะบัะพั
PC_ODR = (cnt<<3); // ะทะฐะฟะธััะฒะฐะตะผ ะฒ ะดะตะผัะปััะธะฟะปะตะบัะพั ะฝะพะฒะพะต ะทะฝะฐัะตะฝะธะต
PD_ODR |= (1<<5); // ะฒะบะปััะฐะตะผ ะดะตะผัะปััะธะฟะปะตะบัะพั
TIM2_SR1 = 0; // ัะฑัะฐััะฒะฐะตะผ ัะปะฐะณ Update Interrupt Pending
cnt++;
cnt &= 7; // ะดะฒะธะณะฐะตะผ ััะตััะธะบ LED
TIM2_CCR1L = ~colors[cnt][0]; // ะฟะตัะตะดะฐะตะผ ะฒ ะฑััะตั ะธะฝะฒะตััะธัะพะฒะฐะฝะฝัะต ะทะฝะฐัะตะฝะธั
TIM2_CCR2L = ~colors[cnt][1]; // ะดะปั ัะปะตะดัััะตะณะพ ัะธะบะปะฐ ะจะะ
TIM2_CCR3L = ~colors[cnt][2]; //
return;
}
๋จ์ ๊ฒ์ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฑํํ๋ ๊ฒ๋ฟ์
๋๋ค. ์ด๋ ์ด์
๋ธ๋ฌ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. rim
- ๋น์ ์ ๊ทธ๊ฒ์ ์ฐพ์์ผ ํ ๊ฒ์
๋๋ค
//enable interrupts
_asm("rim");
๋ ๋ค๋ฅธ ์ด์
๋ธ๋ฌ ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. sim
โ ์ธํฐ๋ฝํธ๋ฅผ ๋๋๋ค. ์๋ก์ด ๊ฐ์ด "๋น๋์ค ๋ฉ๋ชจ๋ฆฌ"์ ๊ธฐ๋ก๋๋ ๋์์๋ ๊บผ์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ์๋ชป๋ ์๊ฐ์ ๋ฐ์ํ ์ธํฐ๋ฝํธ๋ก ์ธํด ์ด๋ ์ด๊ฐ ์์๋์ง ์์ต๋๋ค.
๋ชจ๋ ์ฝ๋ -
๋๊ตฐ๊ฐ ์ด ๊ธ์ด ์ ์ฉํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด, ์ ๊ฐ ์ด ๊ธ์ ํ๋์ด ์ด ๊ฒ์ ์๋๋๋ค. ๋๋ ์๊ฒฌ๊ณผ ๋ฐ์ธ์ ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ด๊ณ ๋ชจ๋ ๊ฒ์ ๋ต๋ณํ๋๋ก ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com