ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

В ಮೊದಲ ಭಾಗ ನಾನು Arduino ಪ್ಯಾಂಟ್‌ನಿಂದ ಬೆಳೆದ ಹವ್ಯಾಸ ಎಲೆಕ್ಟ್ರಾನಿಕ್ಸ್ ಎಂಜಿನಿಯರ್‌ಗಳಿಗೆ ಡೇಟಾಶೀಟ್‌ಗಳು ಮತ್ತು ಮೈಕ್ರೋಕಂಟ್ರೋಲರ್‌ಗಳಿಗಾಗಿ ಇತರ ದಾಖಲಾತಿಗಳನ್ನು ಹೇಗೆ ಮತ್ತು ಏಕೆ ಓದಬೇಕು ಎಂದು ಹೇಳಲು ಪ್ರಯತ್ನಿಸಿದೆ. ಪಠ್ಯವು ದೊಡ್ಡದಾಗಿದೆ, ಆದ್ದರಿಂದ ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳನ್ನು ಪ್ರತ್ಯೇಕ ಲೇಖನದಲ್ಲಿ ತೋರಿಸಲು ನಾನು ಭರವಸೆ ನೀಡಿದ್ದೇನೆ. ಸರಿ, ಅವನು ತನ್ನನ್ನು ತಾನು ಹಾಲಿನ ಮಶ್ರೂಮ್ ಎಂದು ಕರೆದನು ...

STM32 (ಬ್ಲೂ ಪಿಲ್) ಮತ್ತು STM8 ನಿಯಂತ್ರಕಗಳಲ್ಲಿನ ಕಾರ್ಯಗಳು, ಸಾಕಷ್ಟು ಸರಳವಾದ, ಆದರೆ ಅನೇಕ ಯೋಜನೆಗಳಿಗೆ ಅಗತ್ಯವಾಗಿ ಪರಿಹರಿಸಲು ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಹೇಗೆ ಬಳಸುವುದು ಎಂದು ಇಂದು ನಾನು ನಿಮಗೆ ತೋರಿಸುತ್ತೇನೆ. ಎಲ್ಲಾ ಡೆಮೊ ಯೋಜನೆಗಳು ನನ್ನ ನೆಚ್ಚಿನ ಎಲ್ಇಡಿಗಳಿಗೆ ಮೀಸಲಾಗಿವೆ, ನಾವು ಅವುಗಳನ್ನು ದೊಡ್ಡ ಪ್ರಮಾಣದಲ್ಲಿ ಬೆಳಗಿಸುತ್ತೇವೆ, ಇದಕ್ಕಾಗಿ ನಾವು ಎಲ್ಲಾ ರೀತಿಯ ಆಸಕ್ತಿದಾಯಕ ಪೆರಿಫೆರಲ್ಗಳನ್ನು ಬಳಸಬೇಕಾಗುತ್ತದೆ.

ಪಠ್ಯವು ಮತ್ತೊಮ್ಮೆ ದೊಡ್ಡದಾಗಿದೆ, ಆದ್ದರಿಂದ ಅನುಕೂಲಕ್ಕಾಗಿ ನಾನು ವಿಷಯವನ್ನು ತಯಾರಿಸುತ್ತಿದ್ದೇನೆ:

STM32 ಬ್ಲೂ ಪಿಲ್: DM16 ಡ್ರೈವರ್‌ನೊಂದಿಗೆ 634 LED ಗಳು
STM8: ಆರು PWM ಪಿನ್‌ಗಳನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ
STM8: ಮೂರು ಪಿನ್‌ಗಳಲ್ಲಿ 8 RGB LEDಗಳು, ಅಡಚಣೆಗಳು

ಹಕ್ಕು ನಿರಾಕರಣೆ: ನಾನು ಇಂಜಿನಿಯರ್ ಅಲ್ಲ, ನಾನು ಎಲೆಕ್ಟ್ರಾನಿಕ್ಸ್‌ನಲ್ಲಿ ಆಳವಾದ ಜ್ಞಾನವನ್ನು ಹೊಂದಿರುವಂತೆ ನಟಿಸುವುದಿಲ್ಲ, ಲೇಖನವು ನನ್ನಂತಹ ಹವ್ಯಾಸಿಗಳಿಗಾಗಿ ಉದ್ದೇಶಿಸಲಾಗಿದೆ. ವಾಸ್ತವವಾಗಿ, ನಾನು ಎರಡು ವರ್ಷಗಳ ಹಿಂದೆ ನನ್ನನ್ನು ಗುರಿ ಪ್ರೇಕ್ಷಕರು ಎಂದು ಪರಿಗಣಿಸಿದೆ. ಪರಿಚಯವಿಲ್ಲದ ಚಿಪ್‌ನಲ್ಲಿರುವ ಡೇಟಾಶೀಟ್‌ಗಳು ಓದಲು ಹೆದರುವುದಿಲ್ಲ ಎಂದು ಯಾರಾದರೂ ನನಗೆ ಹೇಳಿದ್ದರೆ, ನಾನು ಇಂಟರ್ನೆಟ್‌ನಲ್ಲಿ ಕೆಲವು ಕೋಡ್‌ಗಳನ್ನು ಹುಡುಕಲು ಮತ್ತು ಕತ್ತರಿ ಮತ್ತು ಅಂಟಿಕೊಳ್ಳುವ ಟೇಪ್‌ನಿಂದ ಊರುಗೋಲುಗಳನ್ನು ಕಂಡುಹಿಡಿದು ಹೆಚ್ಚು ಸಮಯ ಕಳೆಯುತ್ತಿರಲಿಲ್ಲ.

ಈ ಲೇಖನದ ಗಮನವು ಡೇಟಾಶೀಟ್‌ಗಳ ಮೇಲೆ, ಯೋಜನೆಗಳಲ್ಲ, ಆದ್ದರಿಂದ ಕೋಡ್ ತುಂಬಾ ಅಚ್ಚುಕಟ್ಟಾಗಿರಬಾರದು ಮತ್ತು ಆಗಾಗ್ಗೆ ಇಕ್ಕಟ್ಟಾಗಿರಬಹುದು. ಹೊಸ ಚಿಪ್ನೊಂದಿಗೆ ಮೊದಲ ಪರಿಚಯಕ್ಕೆ ಸೂಕ್ತವಾದರೂ ಯೋಜನೆಗಳು ತುಂಬಾ ಸರಳವಾಗಿದೆ.

ನನ್ನ ಲೇಖನವು ಹವ್ಯಾಸದಲ್ಲಿ ಮುಳುಗುವ ಇದೇ ಹಂತದಲ್ಲಿ ಯಾರಿಗಾದರೂ ಸಹಾಯ ಮಾಡುತ್ತದೆ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ.

ಎಸ್‌ಟಿಎಂ 32

DM16 ಮತ್ತು SPI ಜೊತೆಗೆ 634 LED ಗಳು

ಬ್ಲೂ ಪಿಲ್ (STM32F103C8T6) ಮತ್ತು DM634 LED ಡ್ರೈವರ್ ಅನ್ನು ಬಳಸುವ ಸಣ್ಣ ಯೋಜನೆ. ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು, ನಾವು ಚಾಲಕ, STM IO ಪೋರ್ಟ್‌ಗಳನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತೇವೆ ಮತ್ತು SPI ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ.

DM634

16 16-ಬಿಟ್ PWM ಔಟ್‌ಪುಟ್‌ಗಳೊಂದಿಗೆ ತೈವಾನೀಸ್ ಚಿಪ್ ಅನ್ನು ಸರಪಳಿಗಳಲ್ಲಿ ಸಂಪರ್ಕಿಸಬಹುದು. ಕಡಿಮೆ-ಮಟ್ಟದ 12-ಬಿಟ್ ಮಾದರಿಯು ದೇಶೀಯ ಯೋಜನೆಯಿಂದ ತಿಳಿದುಬಂದಿದೆ ಲೈಟ್ಪ್ಯಾಕ್. ಒಂದು ಸಮಯದಲ್ಲಿ, DM63x ಮತ್ತು ಪ್ರಸಿದ್ಧ TLC5940 ನಡುವೆ ಆಯ್ಕೆಮಾಡುವಾಗ, ನಾನು ಹಲವಾರು ಕಾರಣಗಳಿಗಾಗಿ DM ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿದ್ದೇನೆ: 1) Aliexpress ನಲ್ಲಿ TLC ಖಂಡಿತವಾಗಿಯೂ ನಕಲಿಯಾಗಿದೆ, ಆದರೆ ಇದು ಅಲ್ಲ; 2) DM ತನ್ನದೇ ಆದ ಆವರ್ತನ ಜನರೇಟರ್ನೊಂದಿಗೆ ಸ್ವಾಯತ್ತ PWM ಅನ್ನು ಹೊಂದಿದೆ; 3) ಅಲಿಯಿಂದ ಪಾರ್ಸೆಲ್‌ಗಾಗಿ ಕಾಯುವುದಕ್ಕಿಂತ ಹೆಚ್ಚಾಗಿ ಮಾಸ್ಕೋದಲ್ಲಿ ಅಗ್ಗವಾಗಿ ಖರೀದಿಸಬಹುದು. ಮತ್ತು, ಸಹಜವಾಗಿ, ಸಿದ್ಧವಾದ ಲೈಬ್ರರಿಯನ್ನು ಬಳಸುವುದಕ್ಕಿಂತ ಹೆಚ್ಚಾಗಿ ಚಿಪ್ ಅನ್ನು ನೀವೇ ಹೇಗೆ ನಿಯಂತ್ರಿಸಬೇಕೆಂದು ಕಲಿಯುವುದು ಆಸಕ್ತಿದಾಯಕವಾಗಿದೆ. ಚಿಪ್‌ಗಳನ್ನು ಈಗ ಮುಖ್ಯವಾಗಿ SSOP24 ಪ್ಯಾಕೇಜ್‌ನಲ್ಲಿ ಪ್ರಸ್ತುತಪಡಿಸಲಾಗಿದೆ; ಅವುಗಳನ್ನು ಅಡಾಪ್ಟರ್‌ಗೆ ಬೆಸುಗೆ ಹಾಕಲು ಸುಲಭವಾಗಿದೆ.

ತಯಾರಕರು ತೈವಾನೀಸ್ ಆಗಿರುವುದರಿಂದ, ಮಾಹಿತಿಯ ಕಾಗದ ಚಿಪ್ ಅನ್ನು ಚೈನೀಸ್ ಇಂಗ್ಲಿಷ್ನಲ್ಲಿ ಬರೆಯಲಾಗಿದೆ, ಅಂದರೆ ಅದು ವಿನೋದಮಯವಾಗಿರುತ್ತದೆ. ಮೊದಲು ನಾವು ಪಿನ್ಔಟ್ ಅನ್ನು ನೋಡುತ್ತೇವೆ (ಪಿನ್ ಸಂಪರ್ಕ) ಯಾವ ಲೆಗ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಬೇಕು ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ಪಿನ್‌ಗಳ ವಿವರಣೆ (ಪಿನ್ ವಿವರಣೆ) 16 ಪಿನ್ಗಳು:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
DC ಸಿಂಕ್ ಮೂಲಗಳು (ಓಪನ್ ಡ್ರೈನ್)

ಸಿಂಕ್ / ತೆರೆದ ಡ್ರೈನ್ ಔಟ್ಪುಟ್ - ಹರಿಸುತ್ತವೆ; ಒಳಹರಿವಿನ ಪ್ರವಾಹದ ಮೂಲ; ಔಟ್ಪುಟ್ ಅನ್ನು ಸಕ್ರಿಯ ಸ್ಥಿತಿಯಲ್ಲಿ ನೆಲಕ್ಕೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ - ಎಲ್ಇಡಿಗಳು ಕ್ಯಾಥೋಡ್ಗಳ ಮೂಲಕ ಚಾಲಕಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿವೆ. ವಿದ್ಯುನ್ಮಾನವಾಗಿ, ಇದು ಸಹಜವಾಗಿ, "ತೆರೆದ ಡ್ರೈನ್" ಅಲ್ಲ (ತೆರೆದ ಚರಂಡಿ), ಆದರೆ ಡೇಟಾಶೀಟ್‌ಗಳಲ್ಲಿ ಡ್ರೈನ್ ಮೋಡ್‌ನಲ್ಲಿರುವ ಪಿನ್‌ಗಳಿಗೆ ಈ ಪದನಾಮವು ಹೆಚ್ಚಾಗಿ ಕಂಡುಬರುತ್ತದೆ.

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಔಟ್ಪುಟ್ ಪ್ರಸ್ತುತ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸಲು REXT ಮತ್ತು GND ನಡುವಿನ ಬಾಹ್ಯ ಪ್ರತಿರೋಧಕಗಳು

REXT ಪಿನ್ ಮತ್ತು ನೆಲದ ನಡುವೆ ರೆಫರೆನ್ಸ್ ರೆಸಿಸ್ಟರ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ, ಇದು ಔಟ್‌ಪುಟ್‌ಗಳ ಆಂತರಿಕ ಪ್ರತಿರೋಧವನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ, ಡೇಟಾಶೀಟ್‌ನ ಪುಟ 9 ರಲ್ಲಿನ ಗ್ರಾಫ್ ಅನ್ನು ನೋಡಿ. DM634 ನಲ್ಲಿ, ಈ ಪ್ರತಿರೋಧವನ್ನು ಸಾಫ್ಟ್‌ವೇರ್ ಮೂಲಕ ನಿಯಂತ್ರಿಸಬಹುದು, ಒಟ್ಟಾರೆ ಹೊಳಪನ್ನು ಹೊಂದಿಸಬಹುದು (ಜಾಗತಿಕ ಹೊಳಪು); ನಾನು ಈ ಲೇಖನದಲ್ಲಿ ವಿವರಗಳಿಗೆ ಹೋಗುವುದಿಲ್ಲ, ನಾನು ಇಲ್ಲಿ 2.2 - 3 kOhm ರೆಸಿಸ್ಟರ್ ಅನ್ನು ಹಾಕುತ್ತೇನೆ.

ಚಿಪ್ ಅನ್ನು ಹೇಗೆ ನಿಯಂತ್ರಿಸುವುದು ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು, ಸಾಧನ ಇಂಟರ್ಫೇಸ್ನ ವಿವರಣೆಯನ್ನು ನೋಡೋಣ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಹೌದು, ಇಲ್ಲಿದೆ, ಅದರ ಎಲ್ಲಾ ವೈಭವದಲ್ಲಿ ಚೈನೀಸ್ ಇಂಗ್ಲಿಷ್. ಇದನ್ನು ಅನುವಾದಿಸುವುದು ಸಮಸ್ಯಾತ್ಮಕವಾಗಿದೆ, ನೀವು ಬಯಸಿದರೆ ನೀವು ಅದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬಹುದು, ಆದರೆ ಇನ್ನೊಂದು ಮಾರ್ಗವಿದೆ - ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಹೋಲುವ TLC5940 ಗೆ ಸಂಪರ್ಕವನ್ನು ಹೇಗೆ ವಿವರಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನೋಡಿ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
... ಸಾಧನಕ್ಕೆ ಡೇಟಾವನ್ನು ನಮೂದಿಸಲು ಕೇವಲ ಮೂರು ಪಿನ್‌ಗಳು ಅಗತ್ಯವಿದೆ. SCLK ಸಿಗ್ನಲ್‌ನ ಏರುತ್ತಿರುವ ಅಂಚು SIN ಪಿನ್‌ನಿಂದ ಆಂತರಿಕ ರಿಜಿಸ್ಟರ್‌ಗೆ ಡೇಟಾವನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ. ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಲೋಡ್ ಮಾಡಿದ ನಂತರ, ಚಿಕ್ಕದಾದ ಹೆಚ್ಚಿನ XLAT ಸಂಕೇತವು ಅನುಕ್ರಮವಾಗಿ ವರ್ಗಾವಣೆಗೊಂಡ ಡೇಟಾವನ್ನು ಆಂತರಿಕ ರೆಜಿಸ್ಟರ್‌ಗಳಿಗೆ ಲಗತ್ತಿಸುತ್ತದೆ. ಆಂತರಿಕ ರೆಜಿಸ್ಟರ್‌ಗಳು XLAT ಸಿಗ್ನಲ್ ಮಟ್ಟದಿಂದ ಪ್ರಚೋದಿಸಲ್ಪಟ್ಟ ಗೇಟ್‌ಗಳಾಗಿವೆ. ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅತ್ಯಂತ ಮಹತ್ವದ ಬಿಟ್ ಅನ್ನು ಮೊದಲು ರವಾನಿಸಲಾಗುತ್ತದೆ.

ಬೀಗ ಹಾಕಿಕೊ - ತಾಳ / ತಾಳ / ಬೀಗ.
ಏರುತ್ತಿರುವ ಅಂಚು - ನಾಡಿನ ಪ್ರಮುಖ ಅಂಚು
ಮೊದಲು MSB - ಅತ್ಯಂತ ಮಹತ್ವದ (ಎಡಭಾಗದ) ಬಿಟ್ ಫಾರ್ವರ್ಡ್.
ಗಡಿಯಾರ ಡೇಟಾಗೆ - ಡೇಟಾವನ್ನು ಅನುಕ್ರಮವಾಗಿ ರವಾನಿಸಿ (ಬಿಟ್ ಬೈ ಬಿಟ್).

ಪದ ಲಾಚ್ ಚಿಪ್ಸ್‌ಗಾಗಿ ದಸ್ತಾವೇಜನ್ನು ಹೆಚ್ಚಾಗಿ ಕಂಡುಬರುತ್ತದೆ ಮತ್ತು ವಿವಿಧ ರೀತಿಯಲ್ಲಿ ಅನುವಾದಿಸಲಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನಾನು ನನ್ನನ್ನು ಅನುಮತಿಸುತ್ತೇನೆ

ಒಂದು ಸಣ್ಣ ಶೈಕ್ಷಣಿಕ ಕಾರ್ಯಕ್ರಮಎಲ್ಇಡಿ ಡ್ರೈವರ್ ಮೂಲಭೂತವಾಗಿ ಶಿಫ್ಟ್ ರಿಜಿಸ್ಟರ್ ಆಗಿದೆ. "ಶಿಫ್ಟ್" (ಶಿಫ್ಟ್) ಹೆಸರಿನಲ್ಲಿ - ಸಾಧನದ ಒಳಗೆ ಡೇಟಾದ ಬಿಟ್‌ವೈಸ್ ಚಲನೆ: ಒಳಗೆ ನೂಕಲಾದ ಪ್ರತಿಯೊಂದು ಹೊಸ ಬಿಟ್ ಸಂಪೂರ್ಣ ಸರಪಳಿಯನ್ನು ಅದರ ಮುಂದೆ ಮುಂದಕ್ಕೆ ತಳ್ಳುತ್ತದೆ. ಶಿಫ್ಟ್ ಸಮಯದಲ್ಲಿ ಎಲ್ಇಡಿಗಳ ಅಸ್ತವ್ಯಸ್ತವಾಗಿರುವ ಮಿಟುಕಿಸುವಿಕೆಯನ್ನು ಯಾರೂ ವೀಕ್ಷಿಸಲು ಬಯಸುವುದಿಲ್ಲವಾದ್ದರಿಂದ, ಪ್ರಕ್ರಿಯೆಯು ಡ್ಯಾಂಪರ್ನಿಂದ ಕೆಲಸ ಮಾಡುವ ರೆಜಿಸ್ಟರ್ಗಳಿಂದ ಪ್ರತ್ಯೇಕಿಸಲಾದ ಬಫರ್ ರೆಜಿಸ್ಟರ್ಗಳಲ್ಲಿ ನಡೆಯುತ್ತದೆ (ಲಾಚ್) ಒಂದು ರೀತಿಯ ಕಾಯುವ ಕೋಣೆಯಾಗಿದ್ದು, ಅಲ್ಲಿ ಬಿಟ್‌ಗಳನ್ನು ಅಪೇಕ್ಷಿತ ಅನುಕ್ರಮದಲ್ಲಿ ಜೋಡಿಸಲಾಗುತ್ತದೆ. ಎಲ್ಲವೂ ಸಿದ್ಧವಾದಾಗ, ಶಟರ್ ತೆರೆಯುತ್ತದೆ ಮತ್ತು ಬಿಟ್‌ಗಳು ಕೆಲಸಕ್ಕೆ ಹೋಗುತ್ತವೆ, ಹಿಂದಿನ ಬ್ಯಾಚ್ ಅನ್ನು ಬದಲಾಯಿಸುತ್ತವೆ. ಪದ ಲಾಚ್ ಮೈಕ್ರೊ ಸರ್ಕ್ಯುಟ್‌ಗಳ ದಸ್ತಾವೇಜನ್ನು ಯಾವಾಗಲೂ ಅಂತಹ ಡ್ಯಾಂಪರ್ ಅನ್ನು ಸೂಚಿಸುತ್ತದೆ, ಅದನ್ನು ಯಾವ ಸಂಯೋಜನೆಯಲ್ಲಿ ಬಳಸಿದರೂ ಪರವಾಗಿಲ್ಲ.

ಆದ್ದರಿಂದ, DM634 ಗೆ ಡೇಟಾ ವರ್ಗಾವಣೆಯನ್ನು ಈ ರೀತಿ ನಡೆಸಲಾಗುತ್ತದೆ: DAI ಇನ್‌ಪುಟ್ ಅನ್ನು ದೂರದ LED ಯ ಅತ್ಯಂತ ಮಹತ್ವದ ಬಿಟ್‌ನ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಿ, DCK ಅನ್ನು ಮೇಲಕ್ಕೆ ಮತ್ತು ಕೆಳಕ್ಕೆ ಎಳೆಯಿರಿ; DAI ಇನ್‌ಪುಟ್ ಅನ್ನು ಮುಂದಿನ ಬಿಟ್‌ನ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಿ, DCK ಅನ್ನು ಎಳೆಯಿರಿ; ಮತ್ತು ಎಲ್ಲಾ ಬಿಟ್‌ಗಳು ರವಾನೆಯಾಗುವವರೆಗೆ (ಗಡಿಯಾರದಲ್ಲಿ), ಅದರ ನಂತರ ನಾವು LAT ಅನ್ನು ಎಳೆಯುತ್ತೇವೆ. ಇದನ್ನು ಕೈಯಾರೆ ಮಾಡಬಹುದು (ಬಿಟ್-ಬ್ಯಾಂಗ್), ಆದರೆ ಇದಕ್ಕಾಗಿ ವಿಶೇಷವಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ SPI ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ಬಳಸುವುದು ಉತ್ತಮ, ಏಕೆಂದರೆ ಇದನ್ನು ನಮ್ಮ STM32 ನಲ್ಲಿ ಎರಡು ಪ್ರತಿಗಳಲ್ಲಿ ಪ್ರಸ್ತುತಪಡಿಸಲಾಗಿದೆ.

ನೀಲಿ ಮಾತ್ರೆ STM32F103

ಪರಿಚಯಾತ್ಮಕ: STM32 ನಿಯಂತ್ರಕಗಳು Atmega328 ಗಿಂತ ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾಗಿವೆ, ಅವುಗಳು ಭಯಾನಕವೆಂದು ತೋರುತ್ತದೆ. ಇದಲ್ಲದೆ, ಶಕ್ತಿಯ ಉಳಿತಾಯದ ಕಾರಣಗಳಿಗಾಗಿ, ಪ್ರಾರಂಭದಲ್ಲಿ ಬಹುತೇಕ ಎಲ್ಲಾ ಪೆರಿಫೆರಲ್‌ಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ಗಡಿಯಾರದ ಆವರ್ತನವು ಆಂತರಿಕ ಮೂಲದಿಂದ 8 MHz ಆಗಿದೆ. ಅದೃಷ್ಟವಶಾತ್, STM ಪ್ರೋಗ್ರಾಮರ್‌ಗಳು ಚಿಪ್ ಅನ್ನು "ಲೆಕ್ಕಾಚಾರದ" 72 MHz ವರೆಗೆ ತರುವ ಕೋಡ್ ಅನ್ನು ಬರೆದಿದ್ದಾರೆ ಮತ್ತು ನನಗೆ ತಿಳಿದಿರುವ ಎಲ್ಲಾ IDE ಗಳ ಲೇಖಕರು ಅದನ್ನು ಪ್ರಾರಂಭದ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ಸೇರಿಸಿದ್ದಾರೆ, ಆದ್ದರಿಂದ ನಾವು ಗಡಿಯಾರ ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ (ಆದರೆ ನೀವು ನಿಜವಾಗಿಯೂ ಬಯಸಿದರೆ ನೀವು ಮಾಡಬಹುದು) ಆದರೆ ನೀವು ಪೆರಿಫೆರಲ್ಸ್ ಅನ್ನು ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.

ದಾಖಲೆ: ಬ್ಲೂ ಪಿಲ್ ಜನಪ್ರಿಯ STM32F103C8T6 ಚಿಪ್‌ನೊಂದಿಗೆ ಸಜ್ಜುಗೊಂಡಿದೆ, ಅದಕ್ಕೆ ಎರಡು ಉಪಯುಕ್ತ ದಾಖಲೆಗಳಿವೆ:

ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ ನಾವು ಆಸಕ್ತಿ ಹೊಂದಿರಬಹುದು:

  • ಪಿನ್ಔಟ್ಗಳು - ಚಿಪ್ ಪಿನ್ಔಟ್ಗಳು - ನಾವು ಬೋರ್ಡ್ಗಳನ್ನು ನಾವೇ ಮಾಡಲು ನಿರ್ಧರಿಸಿದರೆ;
  • ಮೆಮೊರಿ ನಕ್ಷೆ - ನಿರ್ದಿಷ್ಟ ಚಿಪ್‌ಗಾಗಿ ಮೆಮೊರಿ ನಕ್ಷೆ. ಉಲ್ಲೇಖದ ಕೈಪಿಡಿಯು ಸಂಪೂರ್ಣ ಸಾಲಿಗೆ ನಕ್ಷೆಯನ್ನು ಹೊಂದಿದೆ ಮತ್ತು ಅದು ನಮ್ಮಲ್ಲಿ ಇಲ್ಲದಿರುವ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಉಲ್ಲೇಖಿಸುತ್ತದೆ.
  • ಪಿನ್ ವ್ಯಾಖ್ಯಾನಗಳ ಟೇಬಲ್ - ಪಿನ್ಗಳ ಮುಖ್ಯ ಮತ್ತು ಪರ್ಯಾಯ ಕಾರ್ಯಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡುವುದು; "ನೀಲಿ ಮಾತ್ರೆ" ಗಾಗಿ ನೀವು ಪಿನ್‌ಗಳ ಪಟ್ಟಿ ಮತ್ತು ಅವುಗಳ ಕಾರ್ಯಗಳೊಂದಿಗೆ ಅಂತರ್ಜಾಲದಲ್ಲಿ ಹೆಚ್ಚು ಅನುಕೂಲಕರ ಚಿತ್ರಗಳನ್ನು ಕಾಣಬಹುದು. ಆದ್ದರಿಂದ, ನಾವು ತಕ್ಷಣವೇ ಬ್ಲೂ ಪಿಲ್ ಪಿನ್ಔಟ್ ಅನ್ನು ಗೂಗಲ್ ಮಾಡುತ್ತೇವೆ ಮತ್ತು ಈ ಚಿತ್ರವನ್ನು ಕೈಯಲ್ಲಿ ಇಟ್ಟುಕೊಳ್ಳುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
NB: ಇಂಟರ್ನೆಟ್‌ನಿಂದ ಚಿತ್ರದಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ, ಅದನ್ನು ಕಾಮೆಂಟ್‌ಗಳಲ್ಲಿ ಗುರುತಿಸಲಾಗಿದೆ, ಅದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು. ಚಿತ್ರವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ, ಆದರೆ ಇದು ಒಂದು ಪಾಠವಾಗಿದೆ - ಡೇಟಾಶೀಟ್‌ಗಳಿಂದ ಅಲ್ಲದ ಮಾಹಿತಿಯನ್ನು ಪರಿಶೀಲಿಸುವುದು ಉತ್ತಮ.

ನಾವು ಡೇಟಾಶೀಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕುತ್ತೇವೆ, ಉಲ್ಲೇಖದ ಕೈಪಿಡಿಯನ್ನು ತೆರೆಯುತ್ತೇವೆ ಮತ್ತು ಇಂದಿನಿಂದ ನಾವು ಅದನ್ನು ಮಾತ್ರ ಬಳಸುತ್ತೇವೆ.
ಕಾರ್ಯವಿಧಾನ: ನಾವು ಪ್ರಮಾಣಿತ ಇನ್‌ಪುಟ್/ಔಟ್‌ಪುಟ್‌ನೊಂದಿಗೆ ವ್ಯವಹರಿಸುತ್ತೇವೆ, SPI ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ, ಅಗತ್ಯ ಪೆರಿಫೆರಲ್‌ಗಳನ್ನು ಆನ್ ಮಾಡುತ್ತೇವೆ.

ಇನ್ಪುಟ್ ಔಟ್ಪುಟ್

Atmega328 ನಲ್ಲಿ, I/O ಅನ್ನು ಅತ್ಯಂತ ಸರಳವಾಗಿ ಅಳವಡಿಸಲಾಗಿದೆ, ಅದಕ್ಕಾಗಿಯೇ STM32 ಆಯ್ಕೆಗಳ ಸಮೃದ್ಧಿಯು ಗೊಂದಲಕ್ಕೊಳಗಾಗಬಹುದು. ಈಗ ನಮಗೆ ಕೇವಲ ತೀರ್ಮಾನಗಳು ಬೇಕಾಗುತ್ತವೆ, ಆದರೆ ಇವುಗಳಿಗೆ ನಾಲ್ಕು ಆಯ್ಕೆಗಳಿವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ತೆರೆದ ಡ್ರೈನ್, ಪುಶ್-ಪುಲ್, ಪರ್ಯಾಯ ಪುಶ್-ಪುಲ್, ಪರ್ಯಾಯ ತೆರೆದ ಡ್ರೈನ್

"ಎಳೆ ತಳ್ಳು" (ತಳ್ಳು ಎಳೆ) Arduino ನಿಂದ ಸಾಮಾನ್ಯ ಔಟ್‌ಪುಟ್ ಆಗಿದೆ, ಪಿನ್ ಹೆಚ್ಚಿನ ಅಥವಾ ಕಡಿಮೆ ಮೌಲ್ಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ಆದರೆ "ತೆರೆದ ಡ್ರೈನ್" ನೊಂದಿಗೆ ಇವೆ ತೊಂದರೆಗಳು, ವಾಸ್ತವವಾಗಿ ಇಲ್ಲಿ ಎಲ್ಲವೂ ಸರಳವಾಗಿದ್ದರೂ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಔಟ್‌ಪುಟ್ ಕಾನ್ಫಿಗರೇಶನ್ / ಔಟ್‌ಪುಟ್‌ಗೆ ಪೋರ್ಟ್ ಅನ್ನು ನಿಯೋಜಿಸಿದಾಗ: / ಔಟ್‌ಪುಟ್ ಬಫರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: / - ಓಪನ್ ಡ್ರೈನ್ ಮೋಡ್: ಔಟ್‌ಪುಟ್ ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ “0” N-MOS ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ಔಟ್‌ಪುಟ್ ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ “1” ಪೋರ್ಟ್ ಅನ್ನು ಹೈ-ಝಡ್ ಮೋಡ್‌ನಲ್ಲಿ ಬಿಡುತ್ತದೆ ( P-MOS ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ ) / – ಪುಶ್-ಪುಲ್ ಮೋಡ್: ಔಟ್ಪುಟ್ ರಿಜಿಸ್ಟರ್ನಲ್ಲಿ "0" N-MOS ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ಔಟ್ಪುಟ್ ರಿಜಿಸ್ಟರ್ನಲ್ಲಿ "1" P-MOS ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.

ತೆರೆದ ಡ್ರೈನ್ ನಡುವಿನ ಎಲ್ಲಾ ವ್ಯತ್ಯಾಸಗಳು (ತೆರೆದ ಚರಂಡಿ) "ಪುಶ್-ಪುಲ್" ನಿಂದ (ತಳ್ಳು ಎಳೆ) ಮೊದಲ ಪಿನ್‌ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಲಾಗುವುದಿಲ್ಲ: ಔಟ್‌ಪುಟ್ ರಿಜಿಸ್ಟರ್‌ಗೆ ಒಂದನ್ನು ಬರೆಯುವಾಗ, ಅದು ಹೆಚ್ಚಿನ ಪ್ರತಿರೋಧ ಮೋಡ್‌ಗೆ ಹೋಗುತ್ತದೆ (ಹೆಚ್ಚಿನ ಪ್ರತಿರೋಧ, ಹೈ-ಝಡ್) ಶೂನ್ಯವನ್ನು ಬರೆಯುವಾಗ, ಪಿನ್ ತಾರ್ಕಿಕವಾಗಿ ಮತ್ತು ವಿದ್ಯುತ್ ಎರಡೂ ವಿಧಾನಗಳಲ್ಲಿ ಒಂದೇ ರೀತಿ ವರ್ತಿಸುತ್ತದೆ.

ಸಾಮಾನ್ಯ ಔಟ್‌ಪುಟ್ ಮೋಡ್‌ನಲ್ಲಿ, ಔಟ್‌ಪುಟ್ ರಿಜಿಸ್ಟರ್‌ನ ವಿಷಯಗಳನ್ನು ಪಿನ್ ಸರಳವಾಗಿ ಪ್ರಸಾರ ಮಾಡುತ್ತದೆ. "ಪರ್ಯಾಯ"ದಲ್ಲಿ ಇದು ಅನುಗುಣವಾದ ಪೆರಿಫೆರಲ್‌ಗಳಿಂದ ನಿಯಂತ್ರಿಸಲ್ಪಡುತ್ತದೆ (ನೋಡಿ 9.1.4):

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಪೋರ್ಟ್ ಬಿಟ್ ಅನ್ನು ಪರ್ಯಾಯ ಫಂಕ್ಷನ್ ಪಿನ್ ಆಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದರೆ, ಪಿನ್ ರಿಜಿಸ್ಟರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಪಿನ್ ಅನ್ನು ಪೆರಿಫೆರಲ್ ಪಿನ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತದೆ.

ಪ್ರತಿ ಪಿನ್‌ನ ಪರ್ಯಾಯ ಕಾರ್ಯವನ್ನು ವಿವರಿಸಲಾಗಿದೆ ಪಿನ್ ವ್ಯಾಖ್ಯಾನಗಳು ಡೇಟಾಶೀಟ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಚಿತ್ರದಲ್ಲಿದೆ. ಪಿನ್ ಹಲವಾರು ಪರ್ಯಾಯ ಕಾರ್ಯಗಳನ್ನು ಹೊಂದಿದ್ದರೆ ಏನು ಮಾಡಬೇಕು ಎಂಬ ಪ್ರಶ್ನೆಗೆ, ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿನ ಅಡಿಟಿಪ್ಪಣಿಯಿಂದ ಉತ್ತರವನ್ನು ನೀಡಲಾಗುತ್ತದೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಪರ್ಯಾಯ ಕಾರ್ಯಗಳ ನಡುವಿನ ಘರ್ಷಣೆಯನ್ನು ತಪ್ಪಿಸಲು ಬಹು ಪೆರಿಫೆರಲ್‌ಗಳು ಒಂದೇ ಪಿನ್ ಅನ್ನು ಬಳಸಿದರೆ, ಒಂದು ಸಮಯದಲ್ಲಿ ಕೇವಲ ಒಂದು ಪೆರಿಫೆರಲ್ ಅನ್ನು ಮಾತ್ರ ಬಳಸಬೇಕು, ಬಾಹ್ಯ ಗಡಿಯಾರ ಸಕ್ರಿಯಗೊಳಿಸುವ ಬಿಟ್ ಬಳಸಿ ಟಾಗಲ್ ಮಾಡಬೇಕು (ಸೂಕ್ತ RCC ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ).

ಅಂತಿಮವಾಗಿ, ಔಟ್‌ಪುಟ್ ಮೋಡ್‌ನಲ್ಲಿರುವ ಪಿನ್‌ಗಳು ಗಡಿಯಾರದ ವೇಗವನ್ನು ಸಹ ಹೊಂದಿರುತ್ತವೆ. ಇದು ಮತ್ತೊಂದು ಶಕ್ತಿ ಉಳಿಸುವ ವೈಶಿಷ್ಟ್ಯವಾಗಿದೆ; ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ, ನಾವು ಅದನ್ನು ಗರಿಷ್ಠಕ್ಕೆ ಹೊಂದಿಸುತ್ತೇವೆ ಮತ್ತು ಅದನ್ನು ಮರೆತುಬಿಡುತ್ತೇವೆ.

ಆದ್ದರಿಂದ: ನಾವು SPI ಅನ್ನು ಬಳಸುತ್ತಿದ್ದೇವೆ, ಅಂದರೆ ಎರಡು ಪಿನ್‌ಗಳು (ಡೇಟಾದೊಂದಿಗೆ ಮತ್ತು ಗಡಿಯಾರದ ಸಂಕೇತದೊಂದಿಗೆ) "ಪರ್ಯಾಯ ಪುಶ್-ಪುಲ್ ಕಾರ್ಯ" ಆಗಿರಬೇಕು ಮತ್ತು ಇನ್ನೊಂದು (LAT) "ನಿಯಮಿತ ಪುಶ್-ಪುಲ್" ಆಗಿರಬೇಕು. ಆದರೆ ಅವರನ್ನು ನಿಯೋಜಿಸುವ ಮೊದಲು, ನಾವು SPI ಯೊಂದಿಗೆ ವ್ಯವಹರಿಸೋಣ.

SPI

ಮತ್ತೊಂದು ಸಣ್ಣ ಶೈಕ್ಷಣಿಕ ಕಾರ್ಯಕ್ರಮ

SPI ಅಥವಾ ಸೀರಿಯಲ್ ಪೆರಿಫೆರಲ್ ಇಂಟರ್‌ಫೇಸ್ (ಸೀರಿಯಲ್ ಪೆರಿಫೆರಲ್ ಇಂಟರ್‌ಫೇಸ್) ಒಂದು MK ಅನ್ನು ಇತರ MK ಗಳೊಂದಿಗೆ ಮತ್ತು ಸಾಮಾನ್ಯವಾಗಿ ಹೊರಗಿನ ಪ್ರಪಂಚದೊಂದಿಗೆ ಸಂಪರ್ಕಿಸಲು ಸರಳ ಮತ್ತು ಅತ್ಯಂತ ಪರಿಣಾಮಕಾರಿ ಇಂಟರ್‌ಫೇಸ್ ಆಗಿದೆ. ಅದರ ಕಾರ್ಯಾಚರಣೆಯ ತತ್ವವನ್ನು ಈಗಾಗಲೇ ಮೇಲೆ ವಿವರಿಸಲಾಗಿದೆ, ಅಲ್ಲಿ ಚೈನೀಸ್ ಎಲ್ಇಡಿ ಡ್ರೈವರ್ ಬಗ್ಗೆ (ಉಲ್ಲೇಖ ಕೈಪಿಡಿಯಲ್ಲಿ, ವಿಭಾಗ 25 ನೋಡಿ). SPI ಮಾಸ್ಟರ್ ("ಮಾಸ್ಟರ್") ಮತ್ತು ಸ್ಲೇವ್ ("ಗುಲಾಮ") ಮೋಡ್‌ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. SPI ನಾಲ್ಕು ಮೂಲ ಚಾನಲ್‌ಗಳನ್ನು ಹೊಂದಿದೆ, ಅವುಗಳಲ್ಲಿ ಎಲ್ಲವನ್ನೂ ಬಳಸಲಾಗುವುದಿಲ್ಲ:

  • MOSI, ಮಾಸ್ಟರ್ ಔಟ್‌ಪುಟ್ / ಸ್ಲೇವ್ ಇನ್‌ಪುಟ್: ಈ ಪಿನ್ ಮಾಸ್ಟರ್ ಮೋಡ್‌ನಲ್ಲಿ ಡೇಟಾವನ್ನು ರವಾನಿಸುತ್ತದೆ ಮತ್ತು ಸ್ಲೇವ್ ಮೋಡ್‌ನಲ್ಲಿ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ;
  • MISO, ಮಾಸ್ಟರ್ ಇನ್‌ಪುಟ್ / ಸ್ಲೇವ್ ಔಟ್‌ಪುಟ್: ಇದಕ್ಕೆ ವಿರುದ್ಧವಾಗಿ, ಇದು ಮಾಸ್ಟರ್‌ನಲ್ಲಿ ಸ್ವೀಕರಿಸುತ್ತದೆ ಮತ್ತು ಗುಲಾಮರಲ್ಲಿ ರವಾನಿಸುತ್ತದೆ;
  • SCK, ಸೀರಿಯಲ್ ಗಡಿಯಾರ: ಮಾಸ್ಟರ್‌ನಲ್ಲಿ ಡೇಟಾ ಪ್ರಸರಣದ ಆವರ್ತನವನ್ನು ಹೊಂದಿಸುತ್ತದೆ ಅಥವಾ ಸ್ಲೇವ್‌ನಲ್ಲಿ ಗಡಿಯಾರ ಸಂಕೇತವನ್ನು ಪಡೆಯುತ್ತದೆ. ಮೂಲಭೂತವಾಗಿ ಹೊಡೆಯುವ ಬೀಟ್ಸ್;
  • SS, ಸ್ಲೇವ್ ಸೆಲೆಕ್ಟ್: ಈ ಚಾನಲ್‌ನ ಸಹಾಯದಿಂದ, ಗುಲಾಮನಿಗೆ ಅವನಿಂದ ಏನಾದರೂ ಬೇಕು ಎಂದು ತಿಳಿದಿದೆ. STM32 ನಲ್ಲಿ ಇದನ್ನು NSS ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ, ಅಲ್ಲಿ N = ಋಣಾತ್ಮಕ, ಅಂದರೆ. ಈ ಚಾನಲ್‌ನಲ್ಲಿ ನೆಲವಿದ್ದರೆ ನಿಯಂತ್ರಕನು ಗುಲಾಮನಾಗುತ್ತಾನೆ. ಇದು ಓಪನ್ ಡ್ರೈನ್ ಔಟ್‌ಪುಟ್ ಮೋಡ್‌ನೊಂದಿಗೆ ಚೆನ್ನಾಗಿ ಸಂಯೋಜಿಸುತ್ತದೆ, ಆದರೆ ಅದು ಇನ್ನೊಂದು ಕಥೆ.

ಉಳಿದಂತೆ, STM32 ನಲ್ಲಿ SPI ಕ್ರಿಯಾತ್ಮಕತೆಯಲ್ಲಿ ಸಮೃದ್ಧವಾಗಿದೆ, ಇದು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಸ್ವಲ್ಪ ಕಷ್ಟವಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಇದು SPI ಯೊಂದಿಗೆ ಮಾತ್ರವಲ್ಲದೆ I2S ಇಂಟರ್ಫೇಸ್ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಬಹುದು, ಮತ್ತು ದಸ್ತಾವೇಜನ್ನು ಅವರ ವಿವರಣೆಗಳು ಮಿಶ್ರಣವಾಗಿದ್ದು, ಸಕಾಲಿಕ ವಿಧಾನದಲ್ಲಿ ಹೆಚ್ಚುವರಿವನ್ನು ಕತ್ತರಿಸುವ ಅವಶ್ಯಕತೆಯಿದೆ. ನಮ್ಮ ಕಾರ್ಯವು ತುಂಬಾ ಸರಳವಾಗಿದೆ: ನಾವು ಕೇವಲ MOSI ಮತ್ತು SCK ಅನ್ನು ಬಳಸಿಕೊಂಡು ಡೇಟಾವನ್ನು ಕಳುಹಿಸಬೇಕಾಗಿದೆ. ನಾವು ವಿಭಾಗ 25.3.4 (ಅರ್ಧ ಡ್ಯುಪ್ಲೆಕ್ಸ್ ಸಂವಹನ, ಅರ್ಧ ಡ್ಯುಪ್ಲೆಕ್ಸ್ ಸಂವಹನ) ಗೆ ಹೋಗುತ್ತೇವೆ, ಅಲ್ಲಿ ನಾವು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ. 1 ಗಡಿಯಾರ ಮತ್ತು 1 ಏಕ ದಿಕ್ಕಿನ ಡೇಟಾ ತಂತಿ (1 ಗಡಿಯಾರದ ಸಂಕೇತ ಮತ್ತು 1 ಏಕಮುಖ ಡೇಟಾ ಸ್ಟ್ರೀಮ್):

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಈ ಕ್ರಮದಲ್ಲಿ, ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಸರಣ-ಮಾತ್ರ ಅಥವಾ ಸ್ವೀಕರಿಸಲು-ಮಾತ್ರ ಮೋಡ್‌ನಲ್ಲಿ SPI ಅನ್ನು ಬಳಸುತ್ತದೆ. / ಟ್ರಾನ್ಸ್‌ಮಿಟ್-ಮಾತ್ರ ಮೋಡ್ ಡ್ಯುಪ್ಲೆಕ್ಸ್ ಮೋಡ್‌ಗೆ ಹೋಲುತ್ತದೆ: ಟ್ರಾನ್ಸ್‌ಮಿಟ್ ಪಿನ್‌ನಲ್ಲಿ ಡೇಟಾ ರವಾನೆಯಾಗುತ್ತದೆ (ಮಾಸ್ಟರ್ ಮೋಡ್‌ನಲ್ಲಿ MOSI ಅಥವಾ ಸ್ಲೇವ್ ಮೋಡ್‌ನಲ್ಲಿ MISO), ಮತ್ತು ಸ್ವೀಕರಿಸುವ ಪಿನ್ (ಕ್ರಮವಾಗಿ MISO ಅಥವಾ MOSI) ಅನ್ನು ಸಾಮಾನ್ಯ I/O ಪಿನ್ ಆಗಿ ಬಳಸಬಹುದು . ಈ ಸಂದರ್ಭದಲ್ಲಿ, ಅಪ್ಲಿಕೇಶನ್ Rx ಬಫರ್ ಅನ್ನು ನಿರ್ಲಕ್ಷಿಸಬೇಕಾಗಿದೆ (ಅದನ್ನು ಓದಿದರೆ, ಅಲ್ಲಿ ಯಾವುದೇ ವರ್ಗಾವಣೆ ಡೇಟಾ ಇರುವುದಿಲ್ಲ).

ಅದ್ಭುತವಾಗಿದೆ, MISO ಪಿನ್ ಉಚಿತವಾಗಿದೆ, ಅದಕ್ಕೆ LAT ಸಿಗ್ನಲ್ ಅನ್ನು ಸಂಪರ್ಕಿಸೋಣ. STM32 ನಲ್ಲಿ ಪ್ರೋಗ್ರಾಮ್ಯಾಟಿಕ್ ಆಗಿ ನಿಯಂತ್ರಿಸಬಹುದಾದ ಸ್ಲೇವ್ ಸೆಲೆಕ್ಟ್ ಅನ್ನು ನೋಡೋಣ, ಇದು ಅತ್ಯಂತ ಅನುಕೂಲಕರವಾಗಿದೆ. ನಾವು ವಿಭಾಗ 25.3.1 SPI ಸಾಮಾನ್ಯ ವಿವರಣೆಯಲ್ಲಿ ಅದೇ ಹೆಸರಿನ ಪ್ಯಾರಾಗ್ರಾಫ್ ಅನ್ನು ಓದುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಸಾಫ್ಟ್‌ವೇರ್ ನಿಯಂತ್ರಣ NSS (SSM = 1) / ಸ್ಲೇವ್ ಆಯ್ಕೆಯ ಮಾಹಿತಿಯು SPI_CR1 ರಿಜಿಸ್ಟರ್‌ನ SSI ಬಿಟ್‌ನಲ್ಲಿದೆ. ಇತರ ಅಪ್ಲಿಕೇಶನ್ ಅಗತ್ಯಗಳಿಗಾಗಿ ಬಾಹ್ಯ NSS ಪಿನ್ ಉಚಿತವಾಗಿರುತ್ತದೆ.

ರಿಜಿಸ್ಟರ್‌ಗಳಿಗೆ ಬರೆಯಲು ಇದು ಸಮಯ. ನಾನು SPI2 ಅನ್ನು ಬಳಸಲು ನಿರ್ಧರಿಸಿದೆ, ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ ಅದರ ಮೂಲ ವಿಳಾಸವನ್ನು ನೋಡಿ - ವಿಭಾಗ 3.3 ಮೆಮೊರಿ ನಕ್ಷೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಸರಿ, ಪ್ರಾರಂಭಿಸೋಣ:

#define _SPI2_(mem_offset) (*(volatile uint32_t *)(0x40003800 + (mem_offset)))

"ಮಾಸ್ಟರ್ ಮೋಡ್‌ನಲ್ಲಿ SPI ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗುತ್ತಿದೆ" ಸ್ವಯಂ ವಿವರಣಾತ್ಮಕ ಶೀರ್ಷಿಕೆಯೊಂದಿಗೆ ವಿಭಾಗ 25.3.3 ತೆರೆಯಿರಿ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

1. SPI_CR2 ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ ಬಿಟ್‌ಗಳು BR[0:1] ನೊಂದಿಗೆ ಸರಣಿ ಗಡಿಯಾರದ ಆವರ್ತನವನ್ನು ಹೊಂದಿಸಿ.

ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಅದೇ ಹೆಸರಿನ ಉಲ್ಲೇಖ ಕೈಪಿಡಿ ವಿಭಾಗದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿದೆ. ವಿಳಾಸ ಶಿಫ್ಟ್ (ವಿಳಾಸ ಆಫ್‌ಸೆಟ್CR1 - 0x00 ಗಾಗಿ, ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಎಲ್ಲಾ ಬಿಟ್‌ಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ (ಮೌಲ್ಯವನ್ನು ಮರುಹೊಂದಿಸಿ 0x0000):

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

BR ಬಿಟ್‌ಗಳು ನಿಯಂತ್ರಕ ಗಡಿಯಾರ ವಿಭಾಜಕವನ್ನು ಹೊಂದಿಸುತ್ತದೆ, ಹೀಗಾಗಿ SPI ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಆವರ್ತನವನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ. ನಮ್ಮ STM32 ಆವರ್ತನವು 72 MHz ಆಗಿರುತ್ತದೆ, LED ಡ್ರೈವರ್, ಅದರ ಡೇಟಾಶೀಟ್ ಪ್ರಕಾರ, 25 MHz ವರೆಗಿನ ಆವರ್ತನದೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ನಾವು ನಾಲ್ಕರಿಂದ ಭಾಗಿಸಬೇಕಾಗಿದೆ (BR[2:0] = 001).

#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 ಬಿಟ್‌ಗಳ ಪಠ್ಯ ವಿವರಣೆಯನ್ನು ಹತ್ತಿರದಿಂದ ನೋಡೋಣ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಗಡಿಯಾರ ಹಂತ ಮತ್ತು ಧ್ರುವೀಯತೆ
SPI_CR1 ರಿಜಿಸ್ಟರ್‌ನ CPOL ಮತ್ತು CPHA ಬಿಟ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು, ನೀವು ನಾಲ್ಕು ಸಮಯದ ಸಂಬಂಧಗಳನ್ನು ಪ್ರೋಗ್ರಾಮಿಕ್ ಆಗಿ ಆಯ್ಕೆ ಮಾಡಬಹುದು. CPOL (ಗಡಿಯಾರ ಧ್ರುವೀಯತೆ) ಬಿಟ್ ಯಾವುದೇ ಡೇಟಾವನ್ನು ರವಾನಿಸದಿದ್ದಾಗ ಗಡಿಯಾರದ ಸಂಕೇತದ ಸ್ಥಿತಿಯನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. ಈ ಬಿಟ್ ಮಾಸ್ಟರ್ ಮತ್ತು ಸ್ಲೇವ್ ಮೋಡ್‌ಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. CPOL ಅನ್ನು ಮರುಹೊಂದಿಸಿದರೆ, ರೆಸ್ಟ್ ಮೋಡ್‌ನಲ್ಲಿ SCK ಪಿನ್ ಕಡಿಮೆ ಇರುತ್ತದೆ. CPOL ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿದರೆ, ವಿಶ್ರಾಂತಿ ಮೋಡ್‌ನಲ್ಲಿ SCK ಪಿನ್ ಅಧಿಕವಾಗಿರುತ್ತದೆ.
CPHA (ಗಡಿಯಾರ ಹಂತ) ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿದಾಗ, ಹೆಚ್ಚಿನ ಬಿಟ್ ಟ್ರ್ಯಾಪ್ ಸ್ಟ್ರೋಬ್ SCK ಸಿಗ್ನಲ್‌ನ ಎರಡನೇ ಅಂಚಾಗಿರುತ್ತದೆ (CPOL ಸ್ಪಷ್ಟವಾಗಿದ್ದರೆ ಬೀಳುವಿಕೆ, CPOL ಹೊಂದಿಸಿದ್ದರೆ ಏರುತ್ತದೆ). ಗಡಿಯಾರದ ಸಂಕೇತದಲ್ಲಿನ ಎರಡನೇ ಬದಲಾವಣೆಯಿಂದ ಡೇಟಾವನ್ನು ಸೆರೆಹಿಡಿಯಲಾಗುತ್ತದೆ. CPHA ಬಿಟ್ ಸ್ಪಷ್ಟವಾಗಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಬಿಟ್ ಟ್ರ್ಯಾಪ್ ಸ್ಟ್ರೋಬ್ SCK ಸಿಗ್ನಲ್‌ನ ರೈಸಿಂಗ್ ಎಡ್ಜ್ ಆಗಿರುತ್ತದೆ (CPOL ಅನ್ನು ಹೊಂದಿಸಿದರೆ ಬೀಳುವ ಅಂಚು, CPOL ಅನ್ನು ತೆರವುಗೊಳಿಸಿದರೆ ಏರುವ ಅಂಚು). ಗಡಿಯಾರದ ಸಂಕೇತದಲ್ಲಿನ ಮೊದಲ ಬದಲಾವಣೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಸೆರೆಹಿಡಿಯಲಾಗುತ್ತದೆ.

ಈ ಜ್ಞಾನವನ್ನು ಹೀರಿಕೊಂಡ ನಂತರ, ಎರಡೂ ಬಿಟ್‌ಗಳು ಸೊನ್ನೆಗಳಾಗಿ ಉಳಿಯಬೇಕು ಎಂಬ ತೀರ್ಮಾನಕ್ಕೆ ನಾವು ಬರುತ್ತೇವೆ, ಏಕೆಂದರೆ ಬಳಕೆಯಲ್ಲಿಲ್ಲದಿದ್ದಾಗ SCK ಸಿಗ್ನಲ್ ಕಡಿಮೆಯಿರಬೇಕೆಂದು ನಾವು ಬಯಸುತ್ತೇವೆ ಮತ್ತು ನಾಡಿನ ಏರುತ್ತಿರುವ ಅಂಚಿನಲ್ಲಿ ಡೇಟಾ ರವಾನೆಯಾಗಬೇಕು (Fig. ರೈಸಿಂಗ್ ಎಡ್ಜ್ DM634 ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ).

ಅಂದಹಾಗೆ, ಇಲ್ಲಿ ನಾವು ಮೊದಲು ST ಡೇಟಾಶೀಟ್‌ಗಳಲ್ಲಿ ಶಬ್ದಕೋಶದ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಎದುರಿಸಿದ್ದೇವೆ: ಅವುಗಳಲ್ಲಿ "ಬಿಟ್ ಅನ್ನು ಸೊನ್ನೆಗೆ ಮರುಹೊಂದಿಸಿ" ಎಂಬ ಪದಗುಚ್ಛವನ್ನು ಬರೆಯಲಾಗಿದೆ ಸ್ವಲ್ಪ ಮರುಹೊಂದಿಸಲುಮತ್ತು ಅಲ್ಲ ಸ್ವಲ್ಪ ತೆರವುಗೊಳಿಸಲು, ಉದಾಹರಣೆಗೆ, ಅಟ್ಮೆಗಾ ಹಾಗೆ.

3. ಡೇಟಾ ಬ್ಲಾಕ್ 8-ಬಿಟ್ ಅಥವಾ 16-ಬಿಟ್ ಫಾರ್ಮ್ಯಾಟ್ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸಲು DFF ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿ

DM16 ನಂತಹ 634-ಬಿಟ್ PWM ಡೇಟಾವನ್ನು ರವಾನಿಸಲು ತೊಂದರೆಯಾಗದಂತೆ ನಾನು ನಿರ್ದಿಷ್ಟವಾಗಿ 12-ಬಿಟ್ DM633 ಅನ್ನು ತೆಗೆದುಕೊಂಡಿದ್ದೇನೆ. DFF ಅನ್ನು ಒಂದಕ್ಕೆ ಹೊಂದಿಸಲು ಇದು ಅರ್ಥಪೂರ್ಣವಾಗಿದೆ:

#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 ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗುತ್ತಿದೆ" ಓದುವುದನ್ನು ಮುಂದುವರಿಸಿ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಡೇಟಾ ವರ್ಗಾವಣೆ ಆದೇಶ
Tx ಬಫರ್‌ಗೆ ಬೈಟ್ ಬರೆಯಲ್ಪಟ್ಟಾಗ ಪ್ರಸರಣ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.
ಡೇಟಾ ಬೈಟ್ ಅನ್ನು ಶಿಫ್ಟ್ ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ ಸಮಾನಾಂತರ ಮೋಡ್ (ಆಂತರಿಕ ಬಸ್‌ನಿಂದ) ಮೊದಲ ಬಿಟ್‌ನ ಪ್ರಸರಣದ ಸಮಯದಲ್ಲಿ, ನಂತರ ಅದನ್ನು ರವಾನಿಸಲಾಗುತ್ತದೆ ಅನುಕ್ರಮ MOSI ಪಿನ್ ಮೋಡ್, CPI_CR1 ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ LSBFIRST ಬಿಟ್‌ನ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಅವಲಂಬಿಸಿ ಮೊದಲ ಅಥವಾ ಕೊನೆಯ ಬಿಟ್ ಫಾರ್ವರ್ಡ್. ಡೇಟಾ ಪ್ರಸರಣದ ನಂತರ TXE ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ Tx ಬಫರ್‌ನಿಂದ ಶಿಫ್ಟ್ ರಿಜಿಸ್ಟರ್‌ಗೆ, ಮತ್ತು CPI_CR1 ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ TXEIE ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿದ್ದರೆ ಅಡಚಣೆಯನ್ನು ಸಹ ಸೃಷ್ಟಿಸುತ್ತದೆ.

STM ನಿಯಂತ್ರಕಗಳಲ್ಲಿ SPI ಅನುಷ್ಠಾನದ ಒಂದು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಗಮನ ಸೆಳೆಯಲು ನಾನು ಅನುವಾದದಲ್ಲಿ ಕೆಲವು ಪದಗಳನ್ನು ಹೈಲೈಟ್ ಮಾಡಿದ್ದೇನೆ. Atmega ನಲ್ಲಿ TXE ಧ್ವಜ (Tx ಖಾಲಿ, Tx ಖಾಲಿಯಾಗಿದೆ ಮತ್ತು ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಲು ಸಿದ್ಧವಾಗಿದೆ) ಸಂಪೂರ್ಣ ಬೈಟ್ ಅನ್ನು ಕಳುಹಿಸಿದ ನಂತರ ಮಾತ್ರ ಹೊಂದಿಸಲಾಗಿದೆ .ಟ್. ಮತ್ತು ಇಲ್ಲಿ ಬೈಟ್ ಅನ್ನು ಆಂತರಿಕ ಶಿಫ್ಟ್ ರಿಜಿಸ್ಟರ್‌ಗೆ ಸೇರಿಸಿದ ನಂತರ ಈ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ. ಅದೇ ಸಮಯದಲ್ಲಿ (ಸಮಾನಾಂತರವಾಗಿ) ಎಲ್ಲಾ ಬಿಟ್‌ಗಳೊಂದಿಗೆ ಅದನ್ನು ಅಲ್ಲಿಗೆ ತಳ್ಳಲಾಗುತ್ತದೆ ಮತ್ತು ನಂತರ ಡೇಟಾವನ್ನು ಅನುಕ್ರಮವಾಗಿ ವರ್ಗಾಯಿಸಲಾಗುತ್ತದೆ, ಬೈಟ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಕಳುಹಿಸುವ ಮೊದಲು TXE ಅನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ. ಇದು ಮುಖ್ಯವಾಗಿದೆ ಏಕೆಂದರೆ ನಮ್ಮ ಎಲ್ಇಡಿ ಡ್ರೈವರ್ನ ಸಂದರ್ಭದಲ್ಲಿ, ಕಳುಹಿಸಿದ ನಂತರ ನಾವು LAT ಪಿನ್ ಅನ್ನು ಎಳೆಯಬೇಕು всех ಡೇಟಾ, ಅಂದರೆ. TXE ಧ್ವಜ ಮಾತ್ರ ನಮಗೆ ಸಾಕಾಗುವುದಿಲ್ಲ.

ಇದರರ್ಥ ನಮಗೆ ಇನ್ನೊಂದು ಧ್ವಜ ಬೇಕು. 25.3.7 ಅನ್ನು ನೋಡೋಣ - “ಸ್ಥಿತಿ ಧ್ವಜಗಳು”:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
<…>
ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಕಾರ್ಯನಿರತ ಧ್ವಜ
BSY ಧ್ವಜವನ್ನು ಹಾರ್ಡ್‌ವೇರ್ ಮೂಲಕ ಹೊಂದಿಸಲಾಗಿದೆ ಮತ್ತು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ (ಅದಕ್ಕೆ ಬರೆಯುವುದರಿಂದ ಯಾವುದೇ ಪರಿಣಾಮವಿಲ್ಲ). BSY ಧ್ವಜವು SPI ಸಂವಹನ ಪದರದ ಸ್ಥಿತಿಯನ್ನು ಸೂಚಿಸುತ್ತದೆ.
ಇದು ಮರುಹೊಂದಿಸುತ್ತದೆ:
ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಾಗ (ವರ್ಗಾವಣೆ ನಿರಂತರವಾಗಿದ್ದರೆ ಮಾಸ್ಟರ್ ಮೋಡ್‌ನಲ್ಲಿ ಹೊರತುಪಡಿಸಿ)
SPI ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದಾಗ
ಮಾಸ್ಟರ್ ಮೋಡ್ ದೋಷ ಸಂಭವಿಸಿದಾಗ (MODF=1)
ವರ್ಗಾವಣೆ ನಿರಂತರವಾಗಿಲ್ಲದಿದ್ದರೆ, ಪ್ರತಿ ಡೇಟಾ ವರ್ಗಾವಣೆಯ ನಡುವೆ ಬಿಎಸ್ವೈ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ

ಸರಿ, ಇದು ಸೂಕ್ತವಾಗಿ ಬರುತ್ತದೆ. Tx ಬಫರ್ ಎಲ್ಲಿದೆ ಎಂದು ಕಂಡುಹಿಡಿಯೋಣ. ಇದನ್ನು ಮಾಡಲು, "SPI ಡೇಟಾ ರಿಜಿಸ್ಟರ್" ಅನ್ನು ಓದಿ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಬಿಟ್‌ಗಳು 15:0 DR[15:0] ಡೇಟಾ ರಿಜಿಸ್ಟರ್
ಸ್ವೀಕರಿಸಿದ ಡೇಟಾ ಅಥವಾ ರವಾನಿಸಬೇಕಾದ ಡೇಟಾ.
ಡೇಟಾ ರಿಜಿಸ್ಟರ್ ಅನ್ನು ಎರಡು ಬಫರ್‌ಗಳಾಗಿ ವಿಂಗಡಿಸಲಾಗಿದೆ - ಒಂದು ಬರವಣಿಗೆಗೆ (ಟ್ರಾನ್ಸ್‌ಮಿಟ್ ಬಫರ್) ಮತ್ತು ಇನ್ನೊಂದು ಓದಲು (ಬಫರ್ ಸ್ವೀಕರಿಸಲು). ಡೇಟಾ ರಿಜಿಸ್ಟರ್‌ಗೆ ಬರೆಯುವುದು Tx ಬಫರ್‌ಗೆ ಬರೆಯುತ್ತದೆ ಮತ್ತು ಡೇಟಾ ರಿಜಿಸ್ಟರ್‌ನಿಂದ ಓದುವುದು Rx ಬಫರ್‌ನಲ್ಲಿರುವ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.

ಸರಿ, ಮತ್ತು ಸ್ಥಿತಿ ರಿಜಿಸ್ಟರ್, ಅಲ್ಲಿ TXE ಮತ್ತು BSY ಫ್ಲ್ಯಾಗ್‌ಗಳು ಕಂಡುಬರುತ್ತವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ನಾವು ಬರೆಯುತ್ತೇವೆ:

#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
}

ಸರಿ, ಎಲ್ಇಡಿ ಡ್ರೈವರ್ ಔಟ್‌ಪುಟ್‌ಗಳ ಸಂಖ್ಯೆಯ ಪ್ರಕಾರ ನಾವು 16 ಬಾರಿ ಎರಡು ಬೈಟ್‌ಗಳನ್ನು ರವಾನಿಸಬೇಕಾಗಿರುವುದರಿಂದ, ಈ ರೀತಿಯದ್ದು:

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 ನಲ್ಲಿ, ಪಿನ್‌ಗಳ ಸ್ಥಿತಿಗೆ ಜವಾಬ್ದಾರರಾಗಿರುವ ರೆಜಿಸ್ಟರ್‌ಗಳು ಸಾಕಷ್ಟು ಅಸಾಮಾನ್ಯವಾಗಿವೆ. ಅವುಗಳಲ್ಲಿ ಅಟ್ಮೆಗಾಕ್ಕಿಂತ ಹೆಚ್ಚಿನವುಗಳಿವೆ ಎಂಬುದು ಸ್ಪಷ್ಟವಾಗಿದೆ, ಆದರೆ ಅವು ಇತರ STM ಚಿಪ್‌ಗಳಿಗಿಂತ ಭಿನ್ನವಾಗಿವೆ. ವಿಭಾಗ 9.1 GPIO ನ ಸಾಮಾನ್ಯ ವಿವರಣೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಪ್ರತಿಯೊಂದು ಸಾಮಾನ್ಯ ಉದ್ದೇಶದ I/O ಪೋರ್ಟ್‌ಗಳು (GPIO) ಎರಡು 32-ಬಿಟ್ ಕಾನ್ಫಿಗರೇಶನ್ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಹೊಂದಿದೆ (GPIOx_CRL ಮತ್ತು GPIOx_CRH), ಎರಡು 32-ಬಿಟ್ ಡೇಟಾ ರೆಜಿಸ್ಟರ್‌ಗಳು (GPIOx_IDR ಮತ್ತು GPIOx_ODR), 32-ಬಿಟ್ ಸೆಟ್/ರೀಸೆಟ್ ರಿಜಿಸ್ಟರ್ (GPIOx_BSRR), 16-ಬಿಟ್ ರೀಸೆಟ್ ರಿಜಿಸ್ಟರ್ (GPIOx_BRR- ಮತ್ತು ax_BR32) ಬಿಟ್ ನಿರ್ಬಂಧಿಸುವ ರಿಜಿಸ್ಟರ್ (GPIOx_LCKR).

ಮೊದಲ ಎರಡು ರೆಜಿಸ್ಟರ್‌ಗಳು ಅಸಾಮಾನ್ಯ ಮತ್ತು ಸಾಕಷ್ಟು ಅನಾನುಕೂಲವಾಗಿದೆ, ಏಕೆಂದರೆ 16 ಪೋರ್ಟ್ ಪಿನ್‌ಗಳು "ಪ್ರತಿ ಸಹೋದರನಿಗೆ ನಾಲ್ಕು ಬಿಟ್‌ಗಳು" ರೂಪದಲ್ಲಿ ಹರಡಿಕೊಂಡಿವೆ. ಆ. ಶೂನ್ಯದಿಂದ ಏಳುವರೆಗಿನ ಪಿನ್‌ಗಳು CRL ನಲ್ಲಿವೆ ಮತ್ತು ಉಳಿದವು CRH ನಲ್ಲಿವೆ. ಅದೇ ಸಮಯದಲ್ಲಿ, ಉಳಿದ ರೆಜಿಸ್ಟರ್‌ಗಳು ಪೋರ್ಟ್‌ನ ಎಲ್ಲಾ ಪಿನ್‌ಗಳ ಬಿಟ್‌ಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಒಳಗೊಂಡಿರುತ್ತವೆ - ಸಾಮಾನ್ಯವಾಗಿ ಅರ್ಧದಷ್ಟು "ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ".

ಸರಳತೆಗಾಗಿ, ಪಟ್ಟಿಯ ಅಂತ್ಯದಿಂದ ಪ್ರಾರಂಭಿಸೋಣ.

ನಮಗೆ ನಿರ್ಬಂಧಿಸುವ ರಿಜಿಸ್ಟರ್ ಅಗತ್ಯವಿಲ್ಲ.

ಸೆಟ್ ಮತ್ತು ಮರುಹೊಂದಿಸುವ ರೆಜಿಸ್ಟರ್‌ಗಳು ಸಾಕಷ್ಟು ತಮಾಷೆಯಾಗಿವೆ, ಅವುಗಳು ಭಾಗಶಃ ಪರಸ್ಪರ ನಕಲು ಮಾಡುತ್ತವೆ: ನೀವು ಎಲ್ಲವನ್ನೂ ಬಿಎಸ್‌ಆರ್‌ಆರ್‌ನಲ್ಲಿ ಮಾತ್ರ ಬರೆಯಬಹುದು, ಅಲ್ಲಿ ಹೆಚ್ಚಿನ 16 ಬಿಟ್‌ಗಳು ಪಿನ್ ಅನ್ನು ಶೂನ್ಯಕ್ಕೆ ಮರುಹೊಂದಿಸುತ್ತವೆ ಮತ್ತು ಕೆಳಗಿನವುಗಳನ್ನು 1 ಕ್ಕೆ ಹೊಂದಿಸಲಾಗುತ್ತದೆ ಅಥವಾ ನೀವು ಸಹ ಮಾಡಬಹುದು BRR ಅನ್ನು ಬಳಸಿ, ಕೆಳಗಿನ 16 ಬಿಟ್‌ಗಳು ಪಿನ್ ಅನ್ನು ಮಾತ್ರ ಮರುಹೊಂದಿಸಿ. ನಾನು ಎರಡನೇ ಆಯ್ಕೆಯನ್ನು ಇಷ್ಟಪಡುತ್ತೇನೆ. ಈ ರೆಜಿಸ್ಟರ್‌ಗಳು ಮುಖ್ಯವಾಗಿವೆ ಏಕೆಂದರೆ ಅವು ಪಿನ್‌ಗಳಿಗೆ ಪರಮಾಣು ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುತ್ತವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಪರಮಾಣು ಸೆಟ್ ಅಥವಾ ಮರುಹೊಂದಿಸಿ
ಬಿಟ್ ಮಟ್ಟದಲ್ಲಿ GPIOx_ODR ಅನ್ನು ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾಡುವಾಗ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವ ಅಗತ್ಯವಿಲ್ಲ: ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಬಿಟ್‌ಗಳನ್ನು ಒಂದೇ ಪರಮಾಣು ಬರವಣಿಗೆ ಕಾರ್ಯಾಚರಣೆ APB2 ನೊಂದಿಗೆ ಬದಲಾಯಿಸಬಹುದು. ಬದಲಾಯಿಸಬೇಕಾದ ಬಿಟ್‌ನ ಸೆಟ್/ರೀಸೆಟ್ ರಿಜಿಸ್ಟರ್ (GPIOx_BSRR ಅಥವಾ, ಮರುಹೊಂದಿಸಲು ಮಾತ್ರ, GPIOx_BRR) ಗೆ "1" ಬರೆಯುವ ಮೂಲಕ ಇದನ್ನು ಸಾಧಿಸಲಾಗುತ್ತದೆ. ಇತರ ಬಿಟ್‌ಗಳು ಬದಲಾಗದೆ ಉಳಿಯುತ್ತವೆ.

ಡೇಟಾ ರೆಜಿಸ್ಟರ್‌ಗಳು ಸಾಕಷ್ಟು ಸ್ವಯಂ ವಿವರಣಾತ್ಮಕ ಹೆಸರುಗಳನ್ನು ಹೊಂದಿವೆ - IDR = ಇನ್ಪುಟ್ ಡೈರೆಕ್ಷನ್ ರಿಜಿಸ್ಟರ್, ಇನ್ಪುಟ್ ರಿಜಿಸ್ಟರ್; ODR = ಔಟ್ಪುಟ್ ಡೈರೆಕ್ಷನ್ ರಿಜಿಸ್ಟರ್, ಔಟ್ಪುಟ್ ರಿಜಿಸ್ಟರ್. ಪ್ರಸ್ತುತ ಯೋಜನೆಯಲ್ಲಿ ನಮಗೆ ಅವರ ಅಗತ್ಯವಿಲ್ಲ.

ಮತ್ತು ಅಂತಿಮವಾಗಿ, ನಿಯಂತ್ರಣ ರೆಜಿಸ್ಟರ್ಗಳು. ನಾವು ಎರಡನೇ SPI ಪಿನ್‌ಗಳಲ್ಲಿ ಆಸಕ್ತಿ ಹೊಂದಿರುವುದರಿಂದ, ಅವುಗಳೆಂದರೆ PB13, PB14 ಮತ್ತು PB15, ನಾವು ತಕ್ಷಣ CRH ಅನ್ನು ನೋಡುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಮತ್ತು ನಾವು 20 ರಿಂದ 31 ರವರೆಗಿನ ಬಿಟ್‌ಗಳಲ್ಲಿ ಏನನ್ನಾದರೂ ಬರೆಯಬೇಕಾಗಿದೆ ಎಂದು ನಾವು ನೋಡುತ್ತೇವೆ.

ಪಿನ್‌ಗಳಿಂದ ನಮಗೆ ಬೇಕಾದುದನ್ನು ನಾವು ಈಗಾಗಲೇ ಲೆಕ್ಕಾಚಾರ ಮಾಡಿದ್ದೇವೆ, ಆದ್ದರಿಂದ ಇಲ್ಲಿ ನಾನು ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಇಲ್ಲದೆ ಮಾಡುತ್ತೇನೆ, ಮೋಡ್ ದಿಕ್ಕನ್ನು (ಎರಡೂ ಬಿಟ್‌ಗಳನ್ನು 0 ಗೆ ಹೊಂದಿಸಿದ್ದರೆ ಇನ್‌ಪುಟ್) ಮತ್ತು ಪಿನ್ ವೇಗವನ್ನು (ನಮಗೆ 50MHz ಅಗತ್ಯವಿದೆ, ಅಂದರೆ. ಎರಡೂ ಪಿನ್ "1"), ಮತ್ತು CNF ಮೋಡ್ ಅನ್ನು ಹೊಂದಿಸುತ್ತದೆ: ಸಾಮಾನ್ಯ "ಪುಶ್-ಪುಲ್" - 00, "ಪರ್ಯಾಯ" - 10. ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ, ನಾವು ಮೇಲೆ ನೋಡಿದಂತೆ, ಎಲ್ಲಾ ಪಿನ್‌ಗಳು ಕೆಳಗಿನಿಂದ ಮೂರನೇ ಬಿಟ್ ಅನ್ನು ಹೊಂದಿರುತ್ತವೆ (CNF0), ಇದು ಅವುಗಳನ್ನು ಮೋಡ್‌ಗೆ ಹೊಂದಿಸುತ್ತದೆ ತೇಲುವ ಇನ್ಪುಟ್.

ನಾನು ಈ ಚಿಪ್‌ನೊಂದಿಗೆ ಬೇರೇನಾದರೂ ಮಾಡಲು ಯೋಜಿಸಿರುವುದರಿಂದ, ಸರಳತೆಗಾಗಿ ನಾನು ಕೆಳಗಿನ ಮತ್ತು ಮೇಲಿನ ನಿಯಂತ್ರಣ ರೆಜಿಸ್ಟರ್‌ಗಳಿಗೆ ಎಲ್ಲಾ ಸಂಭಾವ್ಯ 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

ನಮ್ಮ ಪಿನ್‌ಗಳು ಬಿ ಪೋರ್ಟ್‌ನಲ್ಲಿವೆ (ಮೂಲ ವಿಳಾಸ - 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;

ಮತ್ತು, ಅದರ ಪ್ರಕಾರ, ನೀವು LAT ಗಾಗಿ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ಬರೆಯಬಹುದು, ಇದು BRR ಮತ್ತು BSRR ರೆಜಿಸ್ಟರ್‌ಗಳಿಂದ ಸೆಳೆಯಲ್ಪಡುತ್ತದೆ:

/*** 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 ನ ಜನರು ನಮಗೆ ಮಾಡಿದ್ದಾರೆ, ಇದಕ್ಕಾಗಿ ನಾವು ಅವರಿಗೆ ತುಂಬಾ ಧನ್ಯವಾದಗಳು (ಮತ್ತೊಮ್ಮೆ ನಾನು ಲಿಂಕ್ ಅನ್ನು ನೀಡುತ್ತೇನೆ ಡಿ ಹಾಲ್ಟ್‌ನ ವೆಬ್‌ಸೈಟ್, ಇದು ಎಷ್ಟು ಗೊಂದಲಮಯವಾಗಿದೆ ಎಂಬುದನ್ನು ಸ್ಪಷ್ಟಪಡಿಸಲು). ಬಾಹ್ಯ ಗಡಿಯಾರವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಮಗೆ ಜವಾಬ್ದಾರರಾಗಿರುವ ರೆಜಿಸ್ಟರ್‌ಗಳು ಮಾತ್ರ ಅಗತ್ಯವಿದೆ (ಪೆರಿಫೆರಲ್ ಕ್ಲಾಕ್ ಎನೇಬಲ್ ರಿಜಿಸ್ಟರ್‌ಗಳು). ಮೊದಲಿಗೆ, RCC ಯ ಮೂಲ ವಿಳಾಸವನ್ನು ಕಂಡುಹಿಡಿಯೋಣ, ಅದು "ಮೆಮೊರಿ ಮ್ಯಾಪ್" ನ ಪ್ರಾರಂಭದಲ್ಲಿದೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

#define _RCC_(mem_offset) (*(volatile uint32_t *)(0x40021000 + (mem_offset)))

ತದನಂತರ ನೀವು ಪ್ಲೇಟ್‌ನಲ್ಲಿ ಏನನ್ನಾದರೂ ಹುಡುಕಲು ಪ್ರಯತ್ನಿಸುವ ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ, ಅಥವಾ, ಹೆಚ್ಚು ಉತ್ತಮವಾಗಿ, ವಿಭಾಗಗಳಿಂದ ಸಕ್ರಿಯಗೊಳಿಸುವ ರೆಜಿಸ್ಟರ್‌ಗಳ ವಿವರಣೆಗಳ ಮೂಲಕ ಹೋಗಿ ನೋಂದಣಿಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ. ನಾವು RCC_APB1ENR ಮತ್ತು RCC_APB2ENR ಅನ್ನು ಎಲ್ಲಿ ಕಾಣಬಹುದು:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಮತ್ತು ಅವುಗಳು, ಅದರ ಪ್ರಕಾರ, 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. ನಾವು 5 ವೋಲ್ಟ್‌ಗಳಿಂದ ಚಾಲಕವನ್ನು ಶಕ್ತಿಯುತಗೊಳಿಸುತ್ತೇವೆ, ಮೈದಾನವನ್ನು ಸಂಪರ್ಕಿಸಲು ಮರೆಯಬೇಡಿ.

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

STM8 PWM

STM8 ನಲ್ಲಿ PWM

ನಾನು ಈ ಲೇಖನವನ್ನು ಯೋಜಿಸುತ್ತಿರುವಾಗ, ಡೇಟಾಶೀಟ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಪರಿಚಯವಿಲ್ಲದ ಚಿಪ್‌ನ ಕೆಲವು ಕಾರ್ಯಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸಲು ನಾನು ಉದಾಹರಣೆಯಾಗಿ ನಿರ್ಧರಿಸಿದೆ, ಇದರಿಂದ ನಾನು ಬೂಟುಗಳಿಲ್ಲದ ಶೂ ಮೇಕರ್‌ನೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳುವುದಿಲ್ಲ. ಈ ಪಾತ್ರಕ್ಕೆ STM8 ಸೂಕ್ತವಾಗಿದೆ: ಮೊದಲನೆಯದಾಗಿ, ನಾನು STM8S103 ನೊಂದಿಗೆ ಒಂದೆರಡು ಚೈನೀಸ್ ಬೋರ್ಡ್‌ಗಳನ್ನು ಹೊಂದಿದ್ದೇನೆ ಮತ್ತು ಎರಡನೆಯದಾಗಿ, ಇದು ಹೆಚ್ಚು ಜನಪ್ರಿಯವಾಗಿಲ್ಲ ಮತ್ತು ಆದ್ದರಿಂದ ಇಂಟರ್ನೆಟ್‌ನಲ್ಲಿ ಓದುವ ಮತ್ತು ಪರಿಹಾರವನ್ನು ಕಂಡುಕೊಳ್ಳುವ ಪ್ರಲೋಭನೆಯು ಈ ಪರಿಹಾರಗಳ ಕೊರತೆಯ ಮೇಲೆ ನಿಂತಿದೆ.

ಚಿಪ್ ಕೂಡ ಹೊಂದಿದೆ ಮಾಹಿತಿಯ ಕಾಗದ и ಉಲ್ಲೇಖ ಕೈಪಿಡಿ RM0016, ಮೊದಲನೆಯದರಲ್ಲಿ ಪಿನ್ಔಟ್ ಮತ್ತು ರಿಜಿಸ್ಟರ್ ವಿಳಾಸಗಳಿವೆ, ಎರಡನೆಯದರಲ್ಲಿ - ಉಳಿದಂತೆ. STM8 ಅನ್ನು C ನಲ್ಲಿ ಭಯಾನಕ IDE ಯಲ್ಲಿ ಪ್ರೋಗ್ರಾಮ್ ಮಾಡಲಾಗಿದೆ ST ವಿಷುಯಲ್ ಡೆವಲಪ್.

ಗಡಿಯಾರ ಮತ್ತು I/O

ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ, STM8 2 MHz ಆವರ್ತನದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಇದನ್ನು ತಕ್ಷಣವೇ ಸರಿಪಡಿಸಬೇಕು.

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
HSI (ಹೈ ಸ್ಪೀಡ್ ಇಂಟರ್ನಲ್) ಗಡಿಯಾರ
ಪ್ರೊಗ್ರಾಮೆಬಲ್ ಡಿವೈಡರ್ (16 ರಿಂದ 1) ನೊಂದಿಗೆ ಆಂತರಿಕ 8 MHz RC ಆಸಿಲೇಟರ್‌ನಿಂದ HSI ಗಡಿಯಾರ ಸಂಕೇತವನ್ನು ಪಡೆಯಲಾಗಿದೆ. ಇದನ್ನು ಗಡಿಯಾರ ವಿಭಾಜಕ ರಿಜಿಸ್ಟರ್ (CLK_CKDIVR) ನಲ್ಲಿ ಹೊಂದಿಸಲಾಗಿದೆ.
ಗಮನಿಸಿ: ಪ್ರಾರಂಭದಲ್ಲಿ, 8 ರ ವಿಭಾಜಕವನ್ನು ಹೊಂದಿರುವ HSI RC ಆಸಿಲೇಟರ್ ಅನ್ನು ಗಡಿಯಾರ ಸಂಕೇತದ ಪ್ರಮುಖ ಮೂಲವಾಗಿ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ.

ನಾವು ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ ರಿಜಿಸ್ಟರ್ ವಿಳಾಸವನ್ನು, ರೆಫ್‌ಮ್ಯಾನ್‌ನಲ್ಲಿ ವಿವರಣೆಯನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ ಮತ್ತು ರಿಜಿಸ್ಟರ್ ಅನ್ನು ತೆರವುಗೊಳಿಸಬೇಕಾಗಿದೆ ಎಂದು ನೋಡಿ:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

ನಾವು PWM ಅನ್ನು ರನ್ ಮಾಡಲು ಮತ್ತು ಎಲ್ಇಡಿಗಳನ್ನು ಸಂಪರ್ಕಿಸಲು ಹೊರಟಿರುವುದರಿಂದ, ಪಿನ್ಔಟ್ ಅನ್ನು ನೋಡೋಣ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಚಿಪ್ ಚಿಕ್ಕದಾಗಿದೆ, ಅದೇ ಪಿನ್ಗಳಲ್ಲಿ ಅನೇಕ ಕಾರ್ಯಗಳನ್ನು ಅಮಾನತುಗೊಳಿಸಲಾಗಿದೆ. ಸ್ಕ್ವೇರ್ ಬ್ರಾಕೆಟ್‌ಗಳಲ್ಲಿರುವುದು "ಪರ್ಯಾಯ ಕಾರ್ಯಚಟುವಟಿಕೆ", ಇದನ್ನು "ಆಯ್ಕೆ ಬೈಟ್‌ಗಳು" ಮೂಲಕ ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ (ಆಯ್ಕೆ ಬೈಟ್‌ಗಳು) – ಅಟ್ಮೆಗಾ ಫ್ಯೂಸ್‌ಗಳಂತಿದೆ. ನೀವು ಅವರ ಮೌಲ್ಯಗಳನ್ನು ಪ್ರೋಗ್ರಾಮಿಕ್ ಆಗಿ ಬದಲಾಯಿಸಬಹುದು, ಆದರೆ ಇದು ಅನಿವಾರ್ಯವಲ್ಲ, ಏಕೆಂದರೆ ರೀಬೂಟ್ ಮಾಡಿದ ನಂತರವೇ ಹೊಸ ಕಾರ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ. ST ವಿಷುಯಲ್ ಪ್ರೋಗ್ರಾಮರ್ ಅನ್ನು ಬಳಸಲು ಸುಲಭವಾಗಿದೆ (ವಿಷುಯಲ್ ಡೆವಲಪ್‌ನೊಂದಿಗೆ ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ), ಇದು ಈ ಬೈಟ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು. ಮೊದಲ ಟೈಮರ್‌ನ CH1 ಮತ್ತು CH2 ಪಿನ್‌ಗಳನ್ನು ಚದರ ಬ್ರಾಕೆಟ್‌ಗಳಲ್ಲಿ ಮರೆಮಾಡಲಾಗಿದೆ ಎಂದು ಪಿನ್‌ಔಟ್ ತೋರಿಸುತ್ತದೆ; STVP ಯಲ್ಲಿ AFR1 ಮತ್ತು AFR0 ಬಿಟ್‌ಗಳನ್ನು ಹೊಂದಿಸುವುದು ಅವಶ್ಯಕ, ಮತ್ತು ಎರಡನೆಯದು ಎರಡನೇ ಟೈಮರ್‌ನ CH1 ಔಟ್‌ಪುಟ್ ಅನ್ನು PD4 ನಿಂದ PC5 ಗೆ ವರ್ಗಾಯಿಸುತ್ತದೆ.

ಹೀಗಾಗಿ, 6 ಪಿನ್ಗಳು ಎಲ್ಇಡಿಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತವೆ: PC6, PC7 ಮತ್ತು PC3 ಮೊದಲ ಟೈಮರ್ಗಾಗಿ, PC5, PD3 ಮತ್ತು PA3 ಎರಡನೆಯದು.

STM8 ನಲ್ಲಿ I/O ಪಿನ್‌ಗಳನ್ನು ಹೊಂದಿಸುವುದು STM32 ಗಿಂತ ಸರಳ ಮತ್ತು ಹೆಚ್ಚು ತಾರ್ಕಿಕವಾಗಿದೆ:

  • Atmega DDR ಡೇಟಾ ನಿರ್ದೇಶನ ರಿಜಿಸ್ಟರ್‌ನಿಂದ ಪರಿಚಿತವಾಗಿದೆ (ಡೇಟಾ ನಿರ್ದೇಶನ ರಿಜಿಸ್ಟರ್): 1 = ಔಟ್ಪುಟ್;
  • ಮೊದಲ ನಿಯಂತ್ರಣ ರಿಜಿಸ್ಟರ್ CR1, ಔಟ್ಪುಟ್ ಮಾಡಿದಾಗ, ಪುಶ್-ಪುಲ್ ಮೋಡ್ (1) ಅಥವಾ ತೆರೆದ ಡ್ರೈನ್ (0) ಅನ್ನು ಹೊಂದಿಸುತ್ತದೆ; ನಾನು ಎಲ್ಇಡಿಗಳನ್ನು ಚಿಪ್ಗೆ ಕ್ಯಾಥೋಡ್ಗಳೊಂದಿಗೆ ಸಂಪರ್ಕಿಸುವುದರಿಂದ, ನಾನು ಇಲ್ಲಿ ಸೊನ್ನೆಗಳನ್ನು ಬಿಡುತ್ತೇನೆ;
  • ಎರಡನೇ ನಿಯಂತ್ರಣ ರಿಜಿಸ್ಟರ್ CR2, ಔಟ್‌ಪುಟ್ ಮಾಡಿದಾಗ, ಗಡಿಯಾರದ ವೇಗವನ್ನು ಹೊಂದಿಸುತ್ತದೆ: 1 = 10 MHz

#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 ಸೆಟ್ಟಿಂಗ್

ಮೊದಲಿಗೆ, ನಾವು ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸೋಣ:

  • ಪಿಡಬ್ಲ್ಯೂಎಂ ಆವರ್ತನ - ಟೈಮರ್ ಟಿಕ್ ಮಾಡುವ ಆವರ್ತನ;
  • ಸ್ವಯಂ-ಮರುಲೋಡ್, AR - ಟೈಮರ್ ಎಣಿಸುವವರೆಗೆ ಸ್ವಯಂ ಲೋಡ್ ಮಾಡಬಹುದಾದ ಮೌಲ್ಯ (ನಾಡಿ ಅವಧಿ);
  • ಈವೆಂಟ್ ಅನ್ನು ನವೀಕರಿಸಿ, UEV - ಟೈಮರ್ ಅನ್ನು AR ಗೆ ಎಣಿಸಿದಾಗ ಸಂಭವಿಸುವ ಈವೆಂಟ್;
  • PWM ಡ್ಯೂಟಿ ಸೈಕಲ್ - PWM ಡ್ಯೂಟಿ ಸೈಕಲ್, ಇದನ್ನು ಸಾಮಾನ್ಯವಾಗಿ "ಡ್ಯೂಟಿ ಫ್ಯಾಕ್ಟರ್" ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ;
  • ಮೌಲ್ಯವನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ/ಹೋಲಿಸಿ - ಸೆರೆಹಿಡಿಯುವಿಕೆ/ಹೋಲಿಕೆಗಾಗಿ ಮೌಲ್ಯ, ಟೈಮರ್ ಎಣಿಕೆ ಮಾಡಲಾಗಿದೆ ಏನಾದರೂ ಮಾಡುತ್ತಾರೆ (PWM ನ ಸಂದರ್ಭದಲ್ಲಿ, ಇದು ಔಟ್ಪುಟ್ ಸಿಗ್ನಲ್ ಅನ್ನು ತಿರುಗಿಸುತ್ತದೆ);
  • ಪೂರ್ವ ಲೋಡ್ ಮೌಲ್ಯ - ಪೂರ್ವ ಲೋಡ್ ಮಾಡಲಾದ ಮೌಲ್ಯ. ಮೌಲ್ಯವನ್ನು ಹೋಲಿಕೆ ಮಾಡಿ ಟೈಮರ್ ಟಿಕ್ ಮಾಡುವಾಗ ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ, ಇಲ್ಲದಿದ್ದರೆ PWM ಸೈಕಲ್ ಮುರಿಯುತ್ತದೆ. ಆದ್ದರಿಂದ, ಹೊಸ ಪ್ರಸರಣ ಮೌಲ್ಯಗಳನ್ನು ಬಫರ್‌ನಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಟೈಮರ್ ಅದರ ಕೌಂಟ್‌ಡೌನ್‌ನ ಅಂತ್ಯವನ್ನು ತಲುಪಿದಾಗ ಮತ್ತು ಮರುಹೊಂದಿಸಿದಾಗ ಹೊರತೆಗೆಯಲಾಗುತ್ತದೆ;
  • ಎಡ್ಜ್ ಜೋಡಿಸಲಾಗಿದೆ и ಮಧ್ಯದಲ್ಲಿ ಜೋಡಿಸಲಾದ ವಿಧಾನಗಳು - ಅಟ್ಮೆಲ್‌ನಂತೆಯೇ ಗಡಿಯಲ್ಲಿ ಮತ್ತು ಮಧ್ಯದಲ್ಲಿ ಜೋಡಣೆ ವೇಗದ ಪಿಡಬ್ಲ್ಯೂಎಂ и ಹಂತ-ಸರಿಯಾದ PWM.
  • OCiREF, ಔಟ್‌ಪುಟ್ ಹೋಲಿಕೆ ಉಲ್ಲೇಖ ಸಿಗ್ನಲ್ - ಉಲ್ಲೇಖ ಔಟ್‌ಪುಟ್ ಸಿಗ್ನಲ್, ವಾಸ್ತವವಾಗಿ, PWM ಮೋಡ್‌ನಲ್ಲಿ ಅನುಗುಣವಾದ ಪಿನ್‌ನಲ್ಲಿ ಏನು ಗೋಚರಿಸುತ್ತದೆ.

ಪಿನ್ಔಟ್ನಿಂದ ಈಗಾಗಲೇ ಸ್ಪಷ್ಟವಾದಂತೆ, ಎರಡು ಟೈಮರ್ಗಳು PWM ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಹೊಂದಿವೆ - ಮೊದಲ ಮತ್ತು ಎರಡನೆಯದು. ಎರಡೂ 16-ಬಿಟ್, ಮೊದಲನೆಯದು ಬಹಳಷ್ಟು ಹೆಚ್ಚುವರಿ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿದೆ (ನಿರ್ದಿಷ್ಟವಾಗಿ, ಇದು ಮೇಲೆ ಮತ್ತು ಕೆಳಗೆ ಎರಡನ್ನೂ ಎಣಿಸಬಹುದು). ನಮಗೆ ಎರಡೂ ಸಮಾನವಾಗಿ ಕೆಲಸ ಮಾಡಬೇಕಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ನಾನು ನಿಸ್ಸಂಶಯವಾಗಿ ಕಳಪೆ ಎರಡನೆಯದರೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಲು ನಿರ್ಧರಿಸಿದೆ, ಹಾಗಾಗಿ ಆಕಸ್ಮಿಕವಾಗಿ ಇಲ್ಲದಿರುವದನ್ನು ಬಳಸಬಾರದು. ಕೆಲವು ಸಮಸ್ಯೆ ಏನೆಂದರೆ, ಉಲ್ಲೇಖದ ಕೈಪಿಡಿಯಲ್ಲಿನ ಎಲ್ಲಾ ಟೈಮರ್‌ಗಳ PWM ಕಾರ್ಯನಿರ್ವಹಣೆಯ ವಿವರಣೆಯು ಮೊದಲ ಟೈಮರ್ (17.5.7 PWM ಮೋಡ್) ಕುರಿತು ಅಧ್ಯಾಯದಲ್ಲಿದೆ, ಆದ್ದರಿಂದ ನೀವು ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಡಾಕ್ಯುಮೆಂಟ್‌ನಾದ್ಯಂತ ಹಿಂದಕ್ಕೆ ಮತ್ತು ಮುಂದಕ್ಕೆ ಹೋಗಬೇಕಾಗುತ್ತದೆ.

Atmega ನಲ್ಲಿ PWM ಗಿಂತ STM8 ನಲ್ಲಿ PWM ಪ್ರಮುಖ ಪ್ರಯೋಜನವನ್ನು ಹೊಂದಿದೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಬೌಂಡರಿ ಜೋಡಿಸಲಾದ PWM
ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಖಾತೆ ಕಾನ್ಫಿಗರೇಶನ್
TIM_CR1 ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿರುವ DIR ಬಿಟ್ ಅನ್ನು ತೆರವುಗೊಳಿಸಿದರೆ ಬಾಟಮ್-ಅಪ್ ಎಣಿಕೆ ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ
ಉದಾಹರಣೆಗೆ
ಉದಾಹರಣೆಯು ಮೊದಲ PWM ಮೋಡ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. PWM ಉಲ್ಲೇಖ ಸಿಗ್ನಲ್ OCiREF ಅನ್ನು TIM1_CNT < TIM1_CCRi ವರೆಗೆ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುತ್ತದೆ. ಇಲ್ಲದಿದ್ದರೆ ಅದು ಕಡಿಮೆ ಮಟ್ಟವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. TIM1_CCRI ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿನ ಹೋಲಿಕೆ ಮೌಲ್ಯವು ಆಟೋಲೋಡ್ ಮೌಲ್ಯಕ್ಕಿಂತ (TIM1_ARR ರಿಜಿಸ್ಟರ್) ಹೆಚ್ಚಿದ್ದರೆ, OCiREF ಸಂಕೇತವನ್ನು 1 ರಲ್ಲಿ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಹೋಲಿಕೆ ಮೌಲ್ಯವು 0 ಆಗಿದ್ದರೆ, OCiREF ಅನ್ನು ಶೂನ್ಯದಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ....

ಸಮಯದಲ್ಲಿ STM8 ಟೈಮರ್ ಈವೆಂಟ್ ಅನ್ನು ನವೀಕರಿಸಿ ಮೊದಲು ಪರಿಶೀಲಿಸುತ್ತದೆ ಮೌಲ್ಯವನ್ನು ಹೋಲಿಕೆ ಮಾಡಿ, ಮತ್ತು ನಂತರ ಮಾತ್ರ ಉಲ್ಲೇಖ ಸಂಕೇತವನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ. Atmega ನ ಟೈಮರ್ ಮೊದಲು ಸ್ಕ್ರೂ ಅಪ್ ಆಗುತ್ತದೆ ಮತ್ತು ನಂತರ ಹೋಲಿಸುತ್ತದೆ, ಪರಿಣಾಮವಾಗಿ compare value == 0 ಔಟ್ಪುಟ್ ಒಂದು ಸೂಜಿಯಾಗಿದೆ, ಅದನ್ನು ಹೇಗಾದರೂ ವ್ಯವಹರಿಸಬೇಕು (ಉದಾಹರಣೆಗೆ, ತರ್ಕವನ್ನು ಪ್ರೋಗ್ರಾಮಿಕ್ ಆಗಿ ತಲೆಕೆಳಗು ಮಾಡುವ ಮೂಲಕ).

ಆದ್ದರಿಂದ ನಾವು ಏನು ಮಾಡಲು ಬಯಸುತ್ತೇವೆ: 8-ಬಿಟ್ PWM (AR == 255), ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಎಣಿಕೆ, ಗಡಿಯ ಉದ್ದಕ್ಕೂ ಜೋಡಣೆ. ಬೆಳಕಿನ ಬಲ್ಬ್‌ಗಳು ಕ್ಯಾಥೋಡ್‌ಗಳ ಮೂಲಕ ಚಿಪ್‌ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವುದರಿಂದ, PWM 0 (LED ಆನ್) ಅನ್ನು ಔಟ್‌ಪುಟ್ ಮಾಡಬೇಕು ಮೌಲ್ಯವನ್ನು ಹೋಲಿಕೆ ಮಾಡಿ ಮತ್ತು 1 ನಂತರ.

ಕೆಲವರ ಬಗ್ಗೆ ನಾವು ಈಗಾಗಲೇ ಓದಿದ್ದೇವೆ PWM ಮೋಡ್, ಆದ್ದರಿಂದ ನಾವು ಈ ನುಡಿಗಟ್ಟು (18.6.8 - TIMx_CCMR1) ಗಾಗಿ ಉಲ್ಲೇಖದ ಕೈಪಿಡಿಯಲ್ಲಿ ಹುಡುಕುವ ಮೂಲಕ ಎರಡನೇ ಟೈಮರ್‌ನ ಅಗತ್ಯವಿರುವ ರಿಜಿಸ್ಟರ್ ಅನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
110: ಮೊದಲ PWM ಮೋಡ್ - ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಎಣಿಸುವಾಗ, ಮೊದಲ ಚಾನಲ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ TIMx_CNT < TIMx_CCR1. ಇಲ್ಲದಿದ್ದರೆ, ಮೊದಲ ಚಾನಲ್ ನಿಷ್ಕ್ರಿಯವಾಗಿರುತ್ತದೆ. [ಡಾಕ್ಯುಮೆಂಟ್‌ನಲ್ಲಿ ಟೈಮರ್ 1 ರಿಂದ ತಪ್ಪಾದ ಕಾಪಿ-ಪೇಸ್ಟ್ ಇದೆ] 111: ಎರಡನೇ PWM ಮೋಡ್ - ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಎಣಿಸುವಾಗ, ಮೊದಲ ಚಾನಲ್ ನಿಷ್ಕ್ರಿಯವಾಗಿರುತ್ತದೆ TIMx_CNT < TIMx_CCR1. ಇಲ್ಲದಿದ್ದರೆ, ಮೊದಲ ಚಾನಲ್ ಸಕ್ರಿಯವಾಗಿದೆ.

ಎಲ್ಇಡಿಗಳು ಕ್ಯಾಥೋಡ್ಗಳಿಂದ MK ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವುದರಿಂದ, ಎರಡನೇ ಮೋಡ್ ನಮಗೆ ಸರಿಹೊಂದುತ್ತದೆ (ಮೊದಲನೆಯದು ಕೂಡ, ಆದರೆ ನಮಗೆ ಇನ್ನೂ ತಿಳಿದಿಲ್ಲ).

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಬಿಟ್ 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 ಎರಡು ಎಂಟು-ಬಿಟ್ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ, ಎಲ್ಲವೂ ಸರಳವಾಗಿದೆ:

#define TIM2_ARRH  *(volatile uint8_t *)0x00530F
#define TIM2_ARRL  *(volatile uint8_t *)0x005310

TIM2_ARRH = 0;
TIM2_ARRL = 255;

ಎರಡನೇ ಟೈಮರ್ ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಮಾತ್ರ ಎಣಿಸಬಹುದು, ಗಡಿಯ ಉದ್ದಕ್ಕೂ ಜೋಡಣೆ, ಏನನ್ನೂ ಬದಲಾಯಿಸಬೇಕಾಗಿಲ್ಲ. ನಾವು ಆವರ್ತನ ವಿಭಾಜಕವನ್ನು ಹೊಂದಿಸೋಣ, ಉದಾಹರಣೆಗೆ, 256. ಎರಡನೇ ಟೈಮರ್‌ಗಾಗಿ, ವಿಭಾಜಕವನ್ನು TIM2_PSCR ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ ಹೊಂದಿಸಲಾಗಿದೆ ಮತ್ತು ಇದು ಎರಡು ಶಕ್ತಿಯಾಗಿದೆ:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

ತೀರ್ಮಾನಗಳು ಮತ್ತು ಎರಡನೇ ಟೈಮರ್ ಅನ್ನು ಆನ್ ಮಾಡುವುದು ಮಾತ್ರ ಉಳಿದಿದೆ. ಮೊದಲ ಸಮಸ್ಯೆಯನ್ನು ರೆಜಿಸ್ಟರ್‌ಗಳಿಂದ ಪರಿಹರಿಸಲಾಗುತ್ತದೆ ಸೆರೆಹಿಡಿಯಿರಿ/ಹೋಲಿಸಿ ಸಕ್ರಿಯಗೊಳಿಸಿ: ಎರಡು, ಮೂರು ಚಾನಲ್‌ಗಳು ಅಸಮಪಾರ್ಶ್ವವಾಗಿ ಹರಡಿಕೊಂಡಿವೆ. ಇಲ್ಲಿ ನಾವು ಸಿಗ್ನಲ್ನ ಧ್ರುವೀಯತೆಯನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿದೆ ಎಂದು ಸಹ ಕಲಿಯಬಹುದು, ಅಂದರೆ. ತಾತ್ವಿಕವಾಗಿ, PWM ಮೋಡ್ 1 ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಯಿತು. ನಾವು ಬರೆಯುತ್ತೇವೆ:

#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 ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ ಟೈಮರ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

ಅನಲಾಗ್ ರೈಟ್ () ನ ಸರಳ ಅನಲಾಗ್ ಅನ್ನು ಬರೆಯೋಣ, ಇದು ಹೋಲಿಕೆಗಾಗಿ ಟೈಮರ್‌ಗೆ ನಿಜವಾದ ಮೌಲ್ಯಗಳನ್ನು ವರ್ಗಾಯಿಸುತ್ತದೆ. ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ನಿರೀಕ್ಷಿತವಾಗಿ ಹೆಸರಿಸಲಾಗಿದೆ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ/ಹೋಲಿಸಿ, ಪ್ರತಿ ಚಾನಲ್‌ಗೆ ಅವುಗಳಲ್ಲಿ ಎರಡು ಇವೆ: TIM8_CCRxL ನಲ್ಲಿ ಕಡಿಮೆ-ಆರ್ಡರ್ 2 ಬಿಟ್‌ಗಳು ಮತ್ತು TIM2_CCRxH ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಆರ್ಡರ್‌ಗಳು. ನಾವು 8-ಬಿಟ್ 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;
}

ನಾವು ಸ್ವಲ್ಪ ದೋಷಪೂರಿತ PWM ಅನ್ನು ಹೊಂದಿದ್ದೇವೆ, 100% ಫಿಲ್ ಅನ್ನು ಉತ್ಪಾದಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ ಎಂದು ಗಮನಿಸುವ ಓದುಗರು ಗಮನಿಸುತ್ತಾರೆ (ಗರಿಷ್ಠ ಮೌಲ್ಯ 255 ರಲ್ಲಿ, ಒಂದು ಟೈಮರ್ ಸೈಕಲ್‌ಗೆ ಸಿಗ್ನಲ್ ತಲೆಕೆಳಗಾದಿದೆ). ಎಲ್ಇಡಿಗಳಿಗೆ ಇದು ಅಪ್ರಸ್ತುತವಾಗುತ್ತದೆ, ಮತ್ತು ಗಮನ ಓದುಗರು ಅದನ್ನು ಹೇಗೆ ಸರಿಪಡಿಸಬೇಕು ಎಂದು ಈಗಾಗಲೇ ಊಹಿಸಬಹುದು.

ಎರಡನೇ ಟೈಮರ್‌ನಲ್ಲಿ PWM ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಮೊದಲನೆಯದಕ್ಕೆ ಹೋಗೋಣ.

ಮೊದಲ ಟೈಮರ್ ಅದೇ ರೆಜಿಸ್ಟರ್‌ಗಳಲ್ಲಿ ಒಂದೇ ರೀತಿಯ ಬಿಟ್‌ಗಳನ್ನು ಹೊಂದಿದೆ (ಎರಡನೇ ಟೈಮರ್‌ನಲ್ಲಿ "ಮೀಸಲು" ಉಳಿದಿರುವ ಬಿಟ್‌ಗಳನ್ನು ಎಲ್ಲಾ ರೀತಿಯ ಸುಧಾರಿತ ವಿಷಯಗಳಿಗೆ ಮೊದಲನೆಯದರಲ್ಲಿ ಸಕ್ರಿಯವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ). ಆದ್ದರಿಂದ, ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ ಅದೇ ರೆಜಿಸ್ಟರ್‌ಗಳ ವಿಳಾಸಗಳನ್ನು ಹುಡುಕಲು ಮತ್ತು ಕೋಡ್ ಅನ್ನು ನಕಲಿಸಲು ಸಾಕು. ಸರಿ, ಆವರ್ತನ ವಿಭಾಜಕದ ಮೌಲ್ಯವನ್ನು ಬದಲಾಯಿಸಿ, ಏಕೆಂದರೆ... ಮೊದಲ ಟೈಮರ್ ಎರಡರ ಶಕ್ತಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಬಯಸುವುದಿಲ್ಲ, ಆದರೆ ಎರಡು ರೆಜಿಸ್ಟರ್‌ಗಳಲ್ಲಿ ನಿಖರವಾದ 16-ಬಿಟ್ ಮೌಲ್ಯವನ್ನು ಪಡೆಯುತ್ತದೆ ಪ್ರಿಸ್ಕೇಲರ್ ಹೈ и ಕಡಿಮೆ. ನಾವು ಎಲ್ಲವನ್ನೂ ಮಾಡುತ್ತೇವೆ ಮತ್ತು ... ಮೊದಲ ಟೈಮರ್ ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ. ಏನು ವಿಷಯ?

ಟೈಮರ್ 1 ರ ನಿಯಂತ್ರಣ ರೆಜಿಸ್ಟರ್‌ಗಳ ಬಗ್ಗೆ ಸಂಪೂರ್ಣ ವಿಭಾಗದ ಮೂಲಕ ನೋಡುವ ಮೂಲಕ ಮಾತ್ರ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸಬಹುದು, ಅಲ್ಲಿ ನಾವು ಎರಡನೇ ಟೈಮರ್ ಹೊಂದಿರದ ಒಂದನ್ನು ಹುಡುಕುತ್ತೇವೆ. ಇರುತ್ತದೆ 17.7.30 ಬ್ರೇಕ್ ರಿಜಿಸ್ಟರ್ (TIM1_BKR), ಈ ಬಿಟ್ ಎಲ್ಲಿದೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಮುಖ್ಯ ಔಟ್‌ಪುಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

ಈಗ ಖಚಿತವಾಗಿ ಅಷ್ಟೆ, ಕೋಡ್ ಅಲ್ಲಿ.

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

STM8 ಮಲ್ಟಿಪ್ಲೆಕ್ಸ್

STM8 ನಲ್ಲಿ ಮಲ್ಟಿಪ್ಲೆಕ್ಸಿಂಗ್

ಮೂರನೇ ಮಿನಿ-ಪ್ರಾಜೆಕ್ಟ್ ಎಂಟು RGB LED ಗಳನ್ನು PWM ಮೋಡ್‌ನಲ್ಲಿ ಎರಡನೇ ಟೈಮರ್‌ಗೆ ಸಂಪರ್ಕಿಸುವುದು ಮತ್ತು ಅವುಗಳನ್ನು ವಿವಿಧ ಬಣ್ಣಗಳನ್ನು ತೋರಿಸುವಂತೆ ಮಾಡುವುದು. ಇದು ಎಲ್ಇಡಿ ಮಲ್ಟಿಪ್ಲೆಕ್ಸಿಂಗ್ ಪರಿಕಲ್ಪನೆಯನ್ನು ಆಧರಿಸಿದೆ, ಅಂದರೆ ನೀವು ಎಲ್ಇಡಿಗಳನ್ನು ಬಹಳ ಬೇಗನೆ ಆನ್ ಮತ್ತು ಆಫ್ ಮಾಡಿದರೆ, ಅವು ನಿರಂತರವಾಗಿ ಆನ್ ಆಗಿವೆ ಎಂದು ನಮಗೆ ತೋರುತ್ತದೆ (ದೃಷ್ಟಿಯ ನಿರಂತರತೆ, ದೃಶ್ಯ ಗ್ರಹಿಕೆಯ ಜಡತ್ವ). ನಾನು ಒಮ್ಮೆ ಮಾಡಿದೆ Arduino ನಲ್ಲಿ ಈ ರೀತಿಯದ್ದು.

ಕೆಲಸದ ಅಲ್ಗಾರಿದಮ್ ಈ ರೀತಿ ಕಾಣುತ್ತದೆ:

  • ಮೊದಲ RGB LED ಯ ಆನೋಡ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ;
  • ಅದನ್ನು ಬೆಳಗಿಸಿ, ಕ್ಯಾಥೋಡ್‌ಗಳಿಗೆ ಅಗತ್ಯವಾದ ಸಂಕೇತಗಳನ್ನು ಕಳುಹಿಸುತ್ತದೆ;
  • PWM ಚಕ್ರದ ಅಂತ್ಯದವರೆಗೆ ಕಾಯಲಾಗಿದೆ;
  • ಎರಡನೇ RGB LED ಯ ಆನೋಡ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ;
  • ಅದನ್ನು ಬೆಳಗಿಸಿ...

ಸರಿ, ಇತ್ಯಾದಿ. ಸಹಜವಾಗಿ, ಸುಂದರವಾದ ಕಾರ್ಯಾಚರಣೆಗಾಗಿ ಆನೋಡ್ ಅನ್ನು ಸಂಪರ್ಕಿಸುವುದು ಅಗತ್ಯವಾಗಿರುತ್ತದೆ ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ ಎಲ್ಇಡಿ "ಬೆಂಕಿ" ಇದೆ. ಸರಿ, ಅಥವಾ ಬಹುತೇಕ. ಯಾವುದೇ ಸಂದರ್ಭದಲ್ಲಿ, ನಾವು ಎರಡನೇ ಟೈಮರ್‌ನ ಮೂರು ಚಾನಲ್‌ಗಳಲ್ಲಿ ಮೌಲ್ಯಗಳನ್ನು ಔಟ್‌ಪುಟ್ ಮಾಡುವ ಕೋಡ್ ಅನ್ನು ಬರೆಯಬೇಕಾಗಿದೆ, UEV ಅನ್ನು ತಲುಪಿದಾಗ ಅವುಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ ಪ್ರಸ್ತುತ ಸಕ್ರಿಯವಾಗಿರುವ RGB LED ಅನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ.

ಎಲ್ಇಡಿ ಸ್ವಿಚಿಂಗ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿರುವುದರಿಂದ, ನಾವು "ವೀಡಿಯೊ ಮೆಮೊರಿ" ಅನ್ನು ರಚಿಸಬೇಕಾಗಿದೆ ಇದರಿಂದ ಅಡಚಣೆ ಹ್ಯಾಂಡ್ಲರ್ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಇದು ಸರಳ ರಚನೆಯಾಗಿದೆ:

uint8_t colors[8][3];

ನಿರ್ದಿಷ್ಟ ಎಲ್ಇಡಿ ಬಣ್ಣವನ್ನು ಬದಲಾಯಿಸಲು, ಈ ರಚನೆಯಲ್ಲಿ ಅಗತ್ಯವಿರುವ ಮೌಲ್ಯಗಳನ್ನು ಬರೆಯಲು ಸಾಕು. ಮತ್ತು ವೇರಿಯೇಬಲ್ ಸಕ್ರಿಯ ಎಲ್ಇಡಿ ಸಂಖ್ಯೆಗೆ ಕಾರಣವಾಗಿದೆ

uint8_t cnt;

ಡೆಮಕ್ಸ್

ಸರಿಯಾದ ಮಲ್ಟಿಪ್ಲೆಕ್ಸಿಂಗ್‌ಗಾಗಿ, ನಮಗೆ ವಿಚಿತ್ರವಾಗಿ ಸಾಕಷ್ಟು, CD74HC238 ಡಿಮಲ್ಟಿಪ್ಲೆಕ್ಸರ್ ಅಗತ್ಯವಿದೆ. ಡೆಮಲ್ಟಿಪ್ಲೆಕ್ಸರ್ - ಯಂತ್ರಾಂಶದಲ್ಲಿ ಆಪರೇಟರ್ ಅನ್ನು ಅಳವಡಿಸುವ ಚಿಪ್ <<. ಮೂರು ಇನ್‌ಪುಟ್ ಪಿನ್‌ಗಳ ಮೂಲಕ (ಬಿಟ್‌ಗಳು 0, 1 ಮತ್ತು 2) ನಾವು ಅದಕ್ಕೆ ಮೂರು-ಬಿಟ್ ಸಂಖ್ಯೆ X ಅನ್ನು ನೀಡುತ್ತೇವೆ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ ಅದು ಔಟ್‌ಪುಟ್ ಸಂಖ್ಯೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ (1<<X) ಚಿಪ್‌ನ ಉಳಿದ ಇನ್‌ಪುಟ್‌ಗಳನ್ನು ಸಂಪೂರ್ಣ ವಿನ್ಯಾಸವನ್ನು ಅಳೆಯಲು ಬಳಸಲಾಗುತ್ತದೆ. ಮೈಕ್ರೊಕಂಟ್ರೋಲರ್‌ನ ಆಕ್ರಮಿತ ಪಿನ್‌ಗಳ ಸಂಖ್ಯೆಯನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಮಾತ್ರವಲ್ಲದೆ ಸುರಕ್ಷತೆಗಾಗಿಯೂ ನಮಗೆ ಈ ಚಿಪ್ ಅಗತ್ಯವಿದೆ - ಆದ್ದರಿಂದ ಆಕಸ್ಮಿಕವಾಗಿ ಸಾಧ್ಯವಾದಷ್ಟು ಹೆಚ್ಚು ಎಲ್ಇಡಿಗಳನ್ನು ಆನ್ ಮಾಡಬಾರದು ಮತ್ತು ಎಂಕೆ ಅನ್ನು ಸುಡುವುದಿಲ್ಲ. ಚಿಪ್ ಒಂದು ಪೆನ್ನಿಗೆ ಖರ್ಚಾಗುತ್ತದೆ ಮತ್ತು ಯಾವಾಗಲೂ ನಿಮ್ಮ ಮನೆಯ ಔಷಧಿ ಕ್ಯಾಬಿನೆಟ್ನಲ್ಲಿ ಇಡಬೇಕು.

ನಮ್ಮ CD74HC238 ಅಪೇಕ್ಷಿತ LED ಯ ಆನೋಡ್‌ಗೆ ವೋಲ್ಟೇಜ್ ಅನ್ನು ಪೂರೈಸುವ ಜವಾಬ್ದಾರಿಯನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಪೂರ್ಣ ಪ್ರಮಾಣದ ಮಲ್ಟಿಪ್ಲೆಕ್ಸ್‌ನಲ್ಲಿ, ಇದು P-MOSFET ಮೂಲಕ ಕಾಲಮ್‌ಗೆ ವೋಲ್ಟೇಜ್ ಅನ್ನು ಪೂರೈಸುತ್ತದೆ, ಆದರೆ ಈ ಡೆಮೊದಲ್ಲಿ ಅದು ನೇರವಾಗಿ ಸಾಧ್ಯ, ಏಕೆಂದರೆ ಇದು 20 mA ಅನ್ನು ಸೆಳೆಯುತ್ತದೆ ಅತಿ ಹೆಚ್ಚು ಅಂಕಗಳು ಡೇಟಾಶೀಟ್‌ನಲ್ಲಿ. ಇಂದ ಡೇಟಾಶೀಟ್ CD74HC238 ನಮಗೆ ಪಿನ್ಔಟ್ಗಳು ಮತ್ತು ಈ ಚೀಟ್ ಶೀಟ್ ಅಗತ್ಯವಿದೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
H = ಹೆಚ್ಚಿನ ವೋಲ್ಟೇಜ್ ಮಟ್ಟ, L = ಕಡಿಮೆ ವೋಲ್ಟೇಜ್ ಮಟ್ಟ, X - ಕಾಳಜಿ ವಹಿಸಬೇಡಿ

ನಾವು E2 ಮತ್ತು E1 ಅನ್ನು ನೆಲಕ್ಕೆ, E3, A0, A1 ಮತ್ತು A3 ಅನ್ನು STM5 ನ PD3, PC4, PC5 ಮತ್ತು PC8 ಪಿನ್‌ಗಳಿಗೆ ಸಂಪರ್ಕಿಸುತ್ತೇವೆ. ಮೇಲಿನ ಕೋಷ್ಟಕವು ಕಡಿಮೆ ಮತ್ತು ಹೆಚ್ಚಿನ ಮಟ್ಟವನ್ನು ಹೊಂದಿರುವುದರಿಂದ, ನಾವು ಈ ಪಿನ್‌ಗಳನ್ನು ಪುಶ್-ಪುಲ್ ಪಿನ್‌ಗಳಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ.

PWM

ಎರಡನೇ ಟೈಮರ್‌ನಲ್ಲಿನ PWM ಅನ್ನು ಹಿಂದಿನ ಕಥೆಯಂತೆಯೇ ಎರಡು ವ್ಯತ್ಯಾಸಗಳೊಂದಿಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ:

ಮೊದಲಿಗೆ, ನಾವು ಅಡಚಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ ಈವೆಂಟ್ ಅನ್ನು ನವೀಕರಿಸಿ (UEV) ಇದು ಸಕ್ರಿಯ LED ಅನ್ನು ಟಾಗಲ್ ಮಾಡುವ ಕಾರ್ಯವನ್ನು ಕರೆಯುತ್ತದೆ. ಬಿಟ್ ಅನ್ನು ಬದಲಾಯಿಸುವ ಮೂಲಕ ಇದನ್ನು ಮಾಡಲಾಗುತ್ತದೆ ಅಡಚಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ನವೀಕರಿಸಿ ಹೇಳುವ ಹೆಸರಿನೊಂದಿಗೆ ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
ಅಡಚಣೆ ಸಕ್ರಿಯಗೊಳಿಸಿ ನೋಂದಣಿ

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

ಎರಡನೆಯ ವ್ಯತ್ಯಾಸವು ಮಲ್ಟಿಪ್ಲೆಕ್ಸಿಂಗ್ ವಿದ್ಯಮಾನಕ್ಕೆ ಸಂಬಂಧಿಸಿದೆ, ಉದಾಹರಣೆಗೆ ಭೂತ - ಡಯೋಡ್‌ಗಳ ಪರಾವಲಂಬಿ ಹೊಳಪು. ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ, ಟೈಮರ್, UEV ನಲ್ಲಿ ಅಡಚಣೆಯನ್ನು ಉಂಟುಮಾಡಿದ ನಂತರ, ಟಿಕ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತದೆ ಮತ್ತು ಟೈಮರ್ ಪಿನ್‌ಗಳಿಗೆ ಏನನ್ನಾದರೂ ಬರೆಯಲು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು ಇಂಟರಪ್ಟ್ ಹ್ಯಾಂಡ್ಲರ್‌ಗೆ ಎಲ್ಇಡಿಯನ್ನು ಬದಲಾಯಿಸಲು ಸಮಯವಿಲ್ಲ ಎಂಬ ಅಂಶದಿಂದಾಗಿ ಇದು ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. ಇದನ್ನು ಎದುರಿಸಲು, ನೀವು ತರ್ಕವನ್ನು ತಲೆಕೆಳಗು ಮಾಡಬೇಕಾಗುತ್ತದೆ (0 = ಗರಿಷ್ಠ ಹೊಳಪು, 255 = ಏನೂ ಬೆಳಗುವುದಿಲ್ಲ) ಮತ್ತು ವಿಪರೀತ ಕರ್ತವ್ಯ ಚಕ್ರ ಮೌಲ್ಯಗಳನ್ನು ತಪ್ಪಿಸಿ. ಆ. UEV ನಂತರ ಎಲ್ಇಡಿಗಳು ಒಂದು PWM ಚಕ್ರಕ್ಕೆ ಸಂಪೂರ್ಣವಾಗಿ ಹೊರಹೋಗುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.

ಧ್ರುವೀಯತೆಯನ್ನು ಬದಲಾಯಿಸುವುದು:

//set polarity 
    TIM2_CCER1 |= (CC1P | CC2P);
    TIM2_CCER2 |= CC3P;

r, g ಮತ್ತು b ಅನ್ನು 255 ಗೆ ಹೊಂದಿಸುವುದನ್ನು ತಪ್ಪಿಸಿ ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸುವಾಗ ಅವುಗಳನ್ನು ತಿರುಗಿಸಲು ಮರೆಯದಿರಿ.

ಅಡ್ಡಿಪಡಿಸುತ್ತದೆ

ಅಡಚಣೆಯ ಮೂಲತತ್ವವೆಂದರೆ ಕೆಲವು ಸಂದರ್ಭಗಳಲ್ಲಿ ಚಿಪ್ ಮುಖ್ಯ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ ಮತ್ತು ಕೆಲವು ಬಾಹ್ಯ ಕಾರ್ಯವನ್ನು ಕರೆಯುತ್ತದೆ. ಟೈಮರ್ ಸೇರಿದಂತೆ ಬಾಹ್ಯ ಅಥವಾ ಆಂತರಿಕ ಪ್ರಭಾವಗಳಿಂದ ಅಡಚಣೆಗಳು ಸಂಭವಿಸುತ್ತವೆ.

ST ವಿಷುಯಲ್ ಡೆವಲಪ್‌ನಲ್ಲಿ ನಾವು ಮೊದಲು ಯೋಜನೆಯನ್ನು ರಚಿಸಿದಾಗ, ಜೊತೆಗೆ main.c ನಾವು ನಿಗೂಢ ಫೈಲ್ ಹೊಂದಿರುವ ವಿಂಡೋವನ್ನು ಸ್ವೀಕರಿಸಿದ್ದೇವೆ stm8_interrupt_vector.c, ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಯೋಜನೆಯಲ್ಲಿ ಸೇರಿಸಲಾಗಿದೆ. ಈ ಫೈಲ್‌ನಲ್ಲಿ, ಪ್ರತಿ ಅಡಚಣೆಗೆ ಒಂದು ಕಾರ್ಯವನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ NonHandledInterrupt. ನಾವು ಬಯಸಿದ ಅಡಚಣೆಗೆ ನಮ್ಮ ಕಾರ್ಯವನ್ನು ಬಂಧಿಸಬೇಕಾಗಿದೆ.

ಡೇಟಾಶೀಟ್ ಇಂಟರಪ್ಟ್ ವೆಕ್ಟರ್‌ಗಳ ಟೇಬಲ್ ಅನ್ನು ಹೊಂದಿದೆ, ಅಲ್ಲಿ ನಮಗೆ ಅಗತ್ಯವಿರುವದನ್ನು ನಾವು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ:

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು
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 - ಅಡಚಣೆಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ. "ವೀಡಿಯೊ ಮೆಮೊರಿ" ಗೆ ಹೊಸ ಮೌಲ್ಯಗಳನ್ನು ಬರೆಯುವಾಗ ಅವುಗಳನ್ನು ಆಫ್ ಮಾಡಬೇಕು, ಇದರಿಂದಾಗಿ ತಪ್ಪಾದ ಕ್ಷಣದಲ್ಲಿ ಉಂಟಾಗುವ ಅಡಚಣೆಯು ರಚನೆಯನ್ನು ಹಾಳು ಮಾಡುವುದಿಲ್ಲ.

ಎಲ್ಲಾ ಕೋಡ್ - GitHub ನಲ್ಲಿ.

ಡೇಟಾಶೀಟ್‌ಗಳನ್ನು ಓದಿ 2: STM32 ನಲ್ಲಿ SPI; STM8 ನಲ್ಲಿ PWM, ಟೈಮರ್‌ಗಳು ಮತ್ತು ಅಡಚಣೆಗಳು

ಕನಿಷ್ಠ ಯಾರಾದರೂ ಈ ಲೇಖನವನ್ನು ಉಪಯುಕ್ತವೆಂದು ಕಂಡುಕೊಂಡರೆ, ನಾನು ಅದನ್ನು ವ್ಯರ್ಥವಾಗಿ ಬರೆಯಲಿಲ್ಲ. ಕಾಮೆಂಟ್‌ಗಳು ಮತ್ತು ಟೀಕೆಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನನಗೆ ಸಂತೋಷವಾಗುತ್ತದೆ, ನಾನು ಎಲ್ಲದಕ್ಕೂ ಉತ್ತರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತೇನೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ