தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்

В முதல் பகுதி Arduino பேன்ட்களில் இருந்து வளர்ந்த பொழுதுபோக்கு எலக்ட்ரானிக்ஸ் பொறியாளர்கள் எப்படி, ஏன் டேட்டாஷீட்கள் மற்றும் மைக்ரோகண்ட்ரோலர்களுக்கான பிற ஆவணங்களை படிக்க வேண்டும் என்று சொல்ல முயற்சித்தேன். உரை பெரியதாக மாறியது, எனவே ஒரு தனி கட்டுரையில் நடைமுறை எடுத்துக்காட்டுகளைக் காண்பிப்பதாக உறுதியளித்தேன். சரி, அவர் தன்னை பால் காளான் என்று அழைத்தார் ...

STM32 (ப்ளூ பில்) மற்றும் STM8 கன்ட்ரோலர்களில் உள்ள பணிகள், மிகவும் எளிமையான, ஆனால் பல திட்டங்களுக்குத் தேவையான டேட்டாஷீட்களை எவ்வாறு பயன்படுத்துவது என்பதை இன்று நான் உங்களுக்குக் காண்பிப்பேன். அனைத்து டெமோ திட்டங்களும் எனக்கு பிடித்த LED களுக்கு அர்ப்பணிக்கப்பட்டவை, அவற்றை பெரிய அளவில் ஒளிரச் செய்வோம், இதற்காக நாம் அனைத்து வகையான சுவாரஸ்யமான சாதனங்களையும் பயன்படுத்த வேண்டும்.

உரை மீண்டும் பெரியதாக மாறியது, எனவே வசதிக்காக நான் உள்ளடக்கத்தை உருவாக்குகிறேன்:

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 மூழ்கும் ஆதாரங்கள் (திறந்த வடிகால்)

தொட்டியின் / திறந்த-வடிகால் வெளியீடு - வடிகால்; உள்வரும் மின்னோட்டத்தின் ஆதாரம்; வெளியீடு, செயலில் உள்ள நிலையில், தரையில் இணைக்கப்பட்டுள்ளது - LED கள் கேத்தோட்கள் மூலம் இயக்கி இணைக்கப்பட்டுள்ளது. மின்சாரம், இது நிச்சயமாக, "திறந்த வடிகால்" அல்ல (திறந்த வாய்க்கால்), ஆனால் டேட்டாஷீட்களில் வடிகால் பயன்முறையில் உள்ள பின்களுக்கான இந்தப் பெயர் அடிக்கடி காணப்படுகிறது.

தரவுத்தாள்களைப் படித்தல் 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 சமிக்ஞை மட்டத்தால் தூண்டப்பட்ட வாயில்கள். எல்லா தரவும் மிக முக்கியமான பிட் முதலில் அனுப்பப்படுகிறது.

தாழ்ப்பாளை - தாழ்ப்பாளை / தாழ்ப்பாளை / பூட்டு.
உயரும் விளிம்பு - துடிப்பின் முன்னணி விளிம்பு
முதலில் எம்.எஸ்.பி - மிகவும் குறிப்பிடத்தக்க (இடதுபுறம்) பிட் முன்னோக்கி.
கடிகார தரவு - தரவை தொடர்ச்சியாக அனுப்பவும் (பிட் பிட்).

வார்த்தை தாழ்ப்பாளை சில்லுகளுக்கான ஆவணங்களில் அடிக்கடி காணப்படுகிறது மற்றும் பல்வேறு வழிகளில் மொழிபெயர்க்கப்பட்டுள்ளது, எனவே புரிந்து கொள்வதற்காக நான் என்னை அனுமதிக்கிறேன்

ஒரு சிறிய கல்வி திட்டம்LED இயக்கி அடிப்படையில் ஒரு ஷிப்ட் பதிவு. "ஷிப்ட்" (மாற்றம்) பெயரில் - சாதனத்தின் உள்ளே தரவு பிட்வைஸ் இயக்கம்: ஒவ்வொரு புதிய பிட் உள்ளே தள்ளப்பட்ட முழு சங்கிலியை முன்னோக்கி தள்ளுகிறது. ஷிஃப்ட்டின் போது எல்.ஈ.டி.களின் குழப்பமான ஒளிருவதை யாரும் கவனிக்க விரும்பாததால், இந்த செயல்முறையானது வேலை செய்யும் பதிவேடுகளிலிருந்து ஒரு டம்பர் மூலம் பிரிக்கப்பட்ட இடையகப் பதிவேடுகளில் நடைபெறுகிறது (தாழ்ப்பாளை) என்பது ஒரு வகையான காத்திருப்பு அறையாகும், அங்கு பிட்கள் விரும்பிய வரிசையில் அமைக்கப்பட்டிருக்கும். எல்லாம் தயாரானதும், ஷட்டர் திறக்கிறது மற்றும் பிட்கள் வேலைக்குச் செல்கின்றன, முந்தைய தொகுதிக்கு பதிலாக. சொல் தாழ்ப்பாளை மைக்ரோ சர்க்யூட்களுக்கான ஆவணங்களில், அது எந்த கலவையில் பயன்படுத்தப்பட்டாலும், அத்தகைய டம்ப்பரை எப்போதும் குறிக்கிறது.

எனவே, DM634 க்கு தரவு பரிமாற்றம் இதுபோல் மேற்கொள்ளப்படுகிறது: DAI உள்ளீட்டை தொலைதூர எல்இடியின் மிக முக்கியமான பிட்டின் மதிப்புக்கு அமைக்கவும், DCK ஐ மேலும் கீழும் இழுக்கவும்; DAI உள்ளீட்டை அடுத்த பிட்டின் மதிப்புக்கு அமைக்கவும், DCK ஐ இழுக்கவும்; மற்றும் அனைத்து பிட்களும் அனுப்பப்படும் வரை (கடிகாரம்), அதன் பிறகு நாம் LAT ஐ இழுக்கிறோம். இதை கைமுறையாக செய்யலாம் (பிட்-பேங்), ஆனால் இதற்காக பிரத்யேகமாக வடிவமைக்கப்பட்ட SPI இடைமுகத்தைப் பயன்படுத்துவது நல்லது, ஏனெனில் இது எங்கள் STM32 இல் இரண்டு பிரதிகளில் வழங்கப்படுகிறது.

நீல மாத்திரை STM32F103

அறிமுகம்: STM32 கட்டுப்படுத்திகள் Atmega328 ஐ விட மிகவும் சிக்கலானவை. மேலும், ஆற்றல் சேமிப்பு காரணங்களுக்காக, கிட்டத்தட்ட அனைத்து சாதனங்களும் தொடக்கத்தில் அணைக்கப்படுகின்றன, மேலும் கடிகார அதிர்வெண் உள் மூலத்திலிருந்து 8 மெகா ஹெர்ட்ஸ் ஆகும். அதிர்ஷ்டவசமாக, STM புரோகிராமர்கள் சிப்பை "கணக்கிடப்பட்ட" 72 மெகா ஹெர்ட்ஸ் வரை கொண்டு வரும் குறியீட்டை எழுதினர், மேலும் எனக்குத் தெரிந்த அனைத்து IDEகளின் ஆசிரியர்களும் அதை துவக்க நடைமுறையில் சேர்த்துள்ளனர், எனவே நாங்கள் கடிகாரம் செய்ய வேண்டியதில்லை (ஆனால் நீங்கள் உண்மையிலேயே விரும்பினால் உங்களால் முடியும்) ஆனால் நீங்கள் சாதனங்களை இயக்க வேண்டும்.

ஆவணப்படுத்தல்: ப்ளூ பில் பிரபலமான STM32F103C8T6 சிப் பொருத்தப்பட்டுள்ளது, அதற்கு இரண்டு பயனுள்ள ஆவணங்கள் உள்ளன:

தரவுத்தாளில் நாம் ஆர்வமாக இருக்கலாம்:

  • பின்அவுட்கள் - சிப் பின்அவுட்கள் - பலகைகளை நாமே உருவாக்க முடிவு செய்தால்;
  • நினைவக வரைபடம் - ஒரு குறிப்பிட்ட சிப்பிற்கான நினைவக வரைபடம். குறிப்பு கையேட்டில் முழு வரிக்கான வரைபடம் உள்ளது, மேலும் அது நம்மிடம் இல்லாத பதிவேடுகளைக் குறிப்பிடுகிறது.
  • பின் வரையறைகள் அட்டவணை - ஊசிகளின் முக்கிய மற்றும் மாற்று செயல்பாடுகளை பட்டியலிடுகிறது; "நீல மாத்திரை" க்கு, ஊசிகளின் பட்டியல் மற்றும் அவற்றின் செயல்பாடுகளுடன் இணையத்தில் மிகவும் வசதியான படங்களை நீங்கள் காணலாம். எனவே, நாங்கள் உடனடியாக ப்ளூ பில் பின்அவுட்டை கூகிள் செய்து இந்தப் படத்தை கையில் வைத்திருக்கிறோம்:

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
குறிப்பு: இணையத்தில் இருந்து படத்தில் ஒரு பிழை இருந்தது, அது கருத்துகளில் குறிப்பிடப்பட்டுள்ளது, அதற்கு நன்றி. படம் மாற்றப்பட்டது, ஆனால் இது ஒரு பாடம் - தரவுத்தாள்களிலிருந்து அல்லாத தகவலைச் சரிபார்ப்பது நல்லது.

நாங்கள் டேட்டாஷீட்டை அகற்றி, குறிப்பு கையேட்டைத் திறக்கிறோம், இனி அதை மட்டுமே பயன்படுத்துகிறோம்.
செயல்முறை: நாங்கள் நிலையான உள்ளீடு/வெளியீட்டைக் கையாளுகிறோம், 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" போர்ட்டை Hi-Z பயன்முறையில் விட்டுச் செல்கிறது ( 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 அல்லது Serial Peripheral Interface (தொடர் புற இடைமுகம்) என்பது MKஐ மற்ற MKகள் மற்றும் பொதுவாக வெளி உலகத்துடன் இணைப்பதற்கான எளிய மற்றும் மிகவும் பயனுள்ள இடைமுகமாகும். அதன் செயல்பாட்டின் கொள்கை ஏற்கனவே மேலே விவரிக்கப்பட்டுள்ளது, அங்கு சீன எல்இடி இயக்கி பற்றி (குறிப்பு கையேட்டில், பிரிவு 25 ஐப் பார்க்கவும்). SPI மாஸ்டர் ("மாஸ்டர்") மற்றும் ஸ்லேவ் ("ஸ்லேவ்") முறையில் செயல்பட முடியும். SPI இல் நான்கு அடிப்படை சேனல்கள் உள்ளன, அவை அனைத்தையும் பயன்படுத்த முடியாது:

  • MOSI, மாஸ்டர் அவுட்புட் / ஸ்லேவ் உள்ளீடு: இந்த முள் முதன்மை பயன்முறையில் தரவை அனுப்புகிறது மற்றும் ஸ்லேவ் பயன்முறையில் தரவைப் பெறுகிறது;
  • MISO, மாஸ்டர் உள்ளீடு / ஸ்லேவ் வெளியீடு: மாறாக, அது எஜமானரிடம் பெறுகிறது மற்றும் அடிமைக்கு அனுப்புகிறது;
  • SCK, தொடர் கடிகாரம்: மாஸ்டரில் தரவு பரிமாற்றத்தின் அதிர்வெண்ணை அமைக்கிறது அல்லது அடிமையில் கடிகார சமிக்ஞையைப் பெறுகிறது. முக்கியமாக அடிக்கும் அடிகள்;
  • எஸ்.எஸ்., ஸ்லேவ் செலக்ட்: இந்த சேனலின் உதவியுடன், அடிமை தன்னிடம் இருந்து ஏதோ தேவை என்று தெரிந்து கொள்கிறான். STM32 இல் இது NSS என அழைக்கப்படுகிறது, இங்கு N = எதிர்மறை, அதாவது. இந்த சேனலில் நிலம் இருந்தால் கட்டுப்படுத்தி அடிமையாகிவிடும். இது திறந்த வடிகால் வெளியீட்டு பயன்முறையுடன் நன்றாக இணைகிறது, ஆனால் அது மற்றொரு கதை.

எல்லாவற்றையும் போலவே, STM32 இல் உள்ள SPI செயல்பாடுகளில் நிறைந்துள்ளது, இது புரிந்துகொள்வதை சற்று கடினமாக்குகிறது. எடுத்துக்காட்டாக, இது SPI உடன் மட்டுமல்லாமல், I2S இடைமுகத்துடனும் வேலை செய்ய முடியும், மேலும் ஆவணத்தில் அவற்றின் விளக்கங்கள் கலக்கப்படுகின்றன, அதிகப்படியானவற்றை சரியான நேரத்தில் துண்டிக்க வேண்டியது அவசியம். எங்கள் பணி மிகவும் எளிமையானது: MOSI மற்றும் SCK ஐ மட்டுமே பயன்படுத்தி தரவை அனுப்ப வேண்டும். நாங்கள் பிரிவு 25.3.4 (அரை-இரட்டை தொடர்பு, அரை-இரட்டை தொடர்பு) க்குச் செல்கிறோம், அங்கு நாம் காணலாம். 1 கடிகாரம் மற்றும் 1 ஒரே திசை தரவு கம்பி (1 கடிகார சமிக்ஞை மற்றும் 1 ஒரே திசை தரவு ஸ்ட்ரீம்):

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
இந்த பயன்முறையில், ஆப்ஸ் SPI ஐ டிரான்ஸ்மிட்-மட்டும் அல்லது பெறுதல்-மட்டும் பயன்முறையில் பயன்படுத்துகிறது. / டிரான்ஸ்மிட்-ஒன்லி மோடு டூப்ளெக்ஸ் பயன்முறையைப் போன்றது: டிரான்ஸ்மிட் பின்னில் தரவு அனுப்பப்படுகிறது (மாஸ்டர் பயன்முறையில் மோசி அல்லது ஸ்லேவ் பயன்முறையில் MISO), மற்றும் ரிசீவ் பின்னை (முறையே MISO அல்லது MOSI) வழக்கமான I/O பின்னாகப் பயன்படுத்தலாம். . இந்த வழக்கில், பயன்பாடு Rx இடையகத்தை மட்டும் புறக்கணிக்க வேண்டும் (அதைப் படித்தால், பரிமாற்றப்பட்ட தரவு எதுவும் இருக்காது).

அருமை, MISO முள் இலவசம், LAT சிக்னலை அதனுடன் இணைப்போம். ஸ்லேவ் செலக்டைப் பார்ப்போம், இது STM32 இல் நிரல் ரீதியாகக் கட்டுப்படுத்தப்படலாம், இது மிகவும் வசதியானது. பிரிவு 25.3.1 SPI பொது விளக்கத்தில் அதே பெயரின் பத்தியைப் படித்தோம்:

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
மென்பொருள் கட்டுப்பாடு என்எஸ்எஸ் (எஸ்எஸ்எம் = 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 இல் உள்ள CPOL மற்றும் CPHA பிட்களின் உரை விளக்கத்தை (SPI பொது விளக்கம்) கூர்ந்து கவனிப்போம்:

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
கடிகார கட்டம் மற்றும் துருவமுனைப்பு
SPI_CR1 பதிவேட்டின் CPOL மற்றும் CPHA பிட்களைப் பயன்படுத்தி, நீங்கள் நான்கு நேர உறவுகளை நிரல் முறையில் தேர்ந்தெடுக்கலாம். CPOL (கடிகார துருவமுனைப்பு) பிட், தரவு எதுவும் கடத்தப்படாதபோது கடிகார சமிக்ஞையின் நிலையைக் கட்டுப்படுத்துகிறது. இந்த பிட் முதன்மை மற்றும் அடிமை முறைகளை கட்டுப்படுத்துகிறது. CPOL மீட்டமைக்கப்பட்டால், ஓய்வு பயன்முறையில் SCK பின் குறைவாக இருக்கும். CPOL பிட் அமைக்கப்பட்டால், ஓய்வு பயன்முறையில் SCK முள் அதிகமாக இருக்கும்.
CPHA (கடிகார கட்டம்) பிட் அமைக்கப்படும் போது, ​​உயர் பிட் ட்ராப் ஸ்ட்ரோப் என்பது SCK சிக்னலின் இரண்டாவது விளிம்பாகும் (CPOL தெளிவாக இருந்தால் விழும், CPOL அமைக்கப்பட்டால் உயரும்). கடிகார சமிக்ஞையின் இரண்டாவது மாற்றத்தால் தரவு கைப்பற்றப்படுகிறது. CPHA பிட் தெளிவாக இருந்தால், உயர் பிட் ட்ராப் ஸ்ட்ரோப் என்பது SCK சிக்னலின் உயரும் விளிம்பாகும் (CPOL அமைக்கப்பட்டால் வீழ்ச்சி விளிம்பு, CPOL அழிக்கப்பட்டால் உயரும் விளிம்பு). கடிகார சமிக்ஞையின் முதல் மாற்றத்தில் தரவு கைப்பற்றப்படுகிறது.

இந்த அறிவை உள்வாங்கிய பிறகு, இரண்டு பிட்களும் பூஜ்ஜியமாக இருக்க வேண்டும் என்ற முடிவுக்கு வருகிறோம் பயன்பாட்டில் இல்லாதபோது SCK சமிக்ஞை குறைவாக இருக்க வேண்டும், மேலும் துடிப்பின் உயரும் விளிம்பில் தரவு அனுப்பப்பட வேண்டும் (படம் XNUMX ஐப் பார்க்கவும்). ரைசிங் எட்ஜ் DM634 தரவுத்தாளில்).

மூலம், இங்கே நாம் முதலில் ST தரவுத்தாள்களில் சொல்லகராதி அம்சத்தை சந்தித்தோம்: அவற்றில் "பிட்டை பூஜ்ஜியத்திற்கு மீட்டமை" என்ற சொற்றொடர் எழுதப்பட்டுள்ளது. சிறிது மீட்டமைக்கமற்றும் இல்லை கொஞ்சம் அழிக்க, எடுத்துக்காட்டாக, Atmega போன்றது.

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)
பரிமாற்றம் தொடர்ச்சியாக இல்லாவிட்டால், ஒவ்வொரு தரவு பரிமாற்றத்திற்கும் இடையே BSY கொடி அழிக்கப்படும்

சரி, இது கைக்கு வரும். 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 போர்ட்கள் (ஜிபிஐஓ) இரண்டு 32-பிட் உள்ளமைவுப் பதிவேடுகள் (GPIOx_CRL மற்றும் GPIOx_CRH), இரண்டு 32-பிட் தரவுப் பதிவேடுகள் (GPIOx_IDR மற்றும் GPIOx_ODR), ஒரு 32-பிட் செட்/ரீசெட் பதிவு (GPIOx_BSRR), ஒரு 16-பிட் மீட்டமைப்புப் பதிவு (GPIOx_BRR- மற்றும் ax_BR32-) பிட் தடுக்கும் பதிவு (GPIOx_LCKR).

முதல் இரண்டு பதிவேடுகள் அசாதாரணமானவை மற்றும் மிகவும் சிரமமானவை, ஏனெனில் 16 போர்ட் பின்கள் "ஒரு சகோதரருக்கு நான்கு பிட்கள்" வடிவத்தில் சிதறிக்கிடக்கின்றன. அந்த. பூஜ்யம் முதல் ஏழு வரையிலான பின்கள் CRL இல் உள்ளன, மீதமுள்ளவை CRH இல் உள்ளன. அதே நேரத்தில், மீதமுள்ள பதிவேடுகள் துறைமுகத்தின் அனைத்து ஊசிகளின் பிட்களையும் வெற்றிகரமாகக் கொண்டிருக்கின்றன - பெரும்பாலும் மீதமுள்ள பாதி "ஒதுக்கீடு".

எளிமைக்காக, பட்டியலின் முடிவில் இருந்து ஆரம்பிக்கலாம்.

தடுக்கும் பதிவு எங்களுக்கு தேவையில்லை.

செட் மற்றும் ரீசெட் ரெஜிஸ்டர்கள் மிகவும் வேடிக்கையானவை, அதில் அவை ஓரளவு நகலெடுக்கின்றன: நீங்கள் எல்லாவற்றையும் BSRR இல் மட்டுமே எழுத முடியும், அங்கு அதிக 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 வரையிலான பிட்களில் எதையாவது எழுத வேண்டும் என்பதைக் காண்கிறோம்.

பின்களில் இருந்து நமக்கு என்ன தேவை என்பதை நாங்கள் ஏற்கனவே கண்டுபிடித்துள்ளோம், எனவே இங்கே நான் ஸ்கிரீன்ஷாட் இல்லாமல் செய்வேன், MODE திசையை (இரண்டு பிட்களும் 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

எங்கள் ஊசிகள் போர்ட் 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;

மேலும், அதன்படி, நீங்கள் 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 என்ற சுருக்கத்தை நாம் ஏற்கனவே கவனிக்க முடியும். நாங்கள் அதை ஆவணத்தில் தேடுகிறோம்: இது ரீசெட் மற்றும் கடிகாரக் கட்டுப்பாடு.

மேலே கூறியது போல், அதிர்ஷ்டவசமாக, கடிகார தலைப்பின் மிகவும் கடினமான பகுதி எஸ்.டி.எம்-ல் உள்ளவர்களால் எங்களுக்காக செய்யப்பட்டது, அதற்காக நாங்கள் அவர்களுக்கு மிக்க நன்றி (மீண்டும் ஒரு இணைப்பைத் தருகிறேன் டி ஹால்ட்டின் இணையதளம், இது எவ்வளவு குழப்பமானது என்பதை தெளிவுபடுத்துவதற்காக). பெரிஃபெரல் க்ளாக்கிங்கை இயக்குவதற்குப் பொறுப்பான பதிவேடுகள் மட்டுமே நமக்குத் தேவை (பெரிஃபெரல் கடிகாரத்தை இயக்கு பதிவுகள்). முதலில், 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 Port 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;

இறுதி குறியீட்டைக் காணலாம் இங்கே.

சோதனை செய்ய உங்களுக்கு வாய்ப்பும் விருப்பமும் இருந்தால், DAM634 ஐ இப்படி இணைக்கவும்: DAI to PB15, DCK to PB13, LAT to PB14. நாங்கள் 5 வோல்ட் இருந்து இயக்கி சக்தி, மைதானத்தை இணைக்க மறக்க வேண்டாம்.

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்

STM8 PWM

STM8 இல் PWM

நான் இந்தக் கட்டுரையைத் திட்டமிடும் போது, ​​ஒரு டேட்டாஷீட்டை மட்டும் பயன்படுத்தி, அறிமுகமில்லாத சிப்பின் சில செயல்பாடுகளை மாஸ்டர் செய்ய முயற்சிக்க முடிவு செய்தேன், அதனால் நான் பூட்ஸ் இல்லாமல் ஷூ தயாரிப்பாளருடன் முடிவடையாது. STM8 இந்த பாத்திரத்திற்கு ஏற்றதாக இருந்தது: முதலாவதாக, STM8S103 உடன் இரண்டு சீன பலகைகள் என்னிடம் இருந்தன, இரண்டாவதாக, இது மிகவும் பிரபலமாக இல்லை, எனவே இணையத்தில் படித்து தீர்வு காண ஆசை இந்த தீர்வுகள் இல்லாததால் உள்ளது.

சிப்பிலும் உண்டு தரவுத்தாள் и குறிப்பு கையேடு RM0016, முதலில் பின்அவுட் மற்றும் பதிவு முகவரிகள் உள்ளன, இரண்டாவதாக - மற்ற அனைத்தும். STM8 ஒரு பயங்கரமான IDE இல் C இல் திட்டமிடப்பட்டுள்ளது எஸ்டி விஷுவல் டெவலப்.

கடிகாரம் மற்றும் I/O

இயல்பாக, STM8 2 மெகா ஹெர்ட்ஸ் அதிர்வெண்ணில் இயங்குகிறது, இது உடனடியாக சரிசெய்யப்பட வேண்டும்.

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
எச்எஸ்ஐ (அதிவேக உள்) கடிகாரம்
HSI கடிகார சமிக்ஞையானது, நிரல்படுத்தக்கூடிய வகுப்பி (16 முதல் 1 வரை) கொண்ட உள் 8 மெகா ஹெர்ட்ஸ் RC ஆஸிலேட்டரிலிருந்து பெறப்பட்டது. இது கடிகார வகுப்பி பதிவேட்டில் (CLK_CKDIVR) அமைக்கப்பட்டுள்ளது.
குறிப்பு: தொடக்கத்தில், 8 இன் வகுப்பியுடன் கூடிய HSI RC ஆஸிலேட்டர் கடிகார சமிக்ஞையின் முன்னணி ஆதாரமாகத் தேர்ந்தெடுக்கப்பட்டது.

தரவுத்தாளில் பதிவு முகவரியையும், refman இல் உள்ள விளக்கத்தையும் கண்டறிந்து, பதிவேடு அழிக்கப்பட வேண்டும் என்பதைப் பார்க்கிறோம்:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

நாங்கள் PWM ஐ இயக்கி LED களை இணைக்கப் போகிறோம் என்பதால், பின்அவுட்டைப் பார்ப்போம்:

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்

சிப் சிறியது, ஒரே ஊசிகளில் பல செயல்பாடுகள் இடைநிறுத்தப்பட்டுள்ளன. சதுர அடைப்புக்குறிக்குள் இருப்பது "மாற்று செயல்பாடு", இது "விருப்ப பைட்டுகள்" மூலம் மாற்றப்படுகிறது (விருப்ப பைட்டுகள்) – Atmega fuses போன்ற ஒன்று. நீங்கள் அவற்றின் மதிப்புகளை நிரல் ரீதியாக மாற்றலாம், ஆனால் அது தேவையில்லை, ஏனெனில் மறுதொடக்கம் செய்த பின்னரே புதிய செயல்பாடு செயல்படுத்தப்படும். ST விஷுவல் புரோகிராமரைப் பயன்படுத்துவது எளிதானது (விஷுவல் டெவலப் உடன் பதிவிறக்கம் செய்யப்பட்டது), இது இந்த பைட்டுகளை மாற்றும். முதல் டைமரின் CH1 மற்றும் CH2 பின்கள் சதுர அடைப்புக்குறிக்குள் மறைக்கப்பட்டிருப்பதை பின்அவுட் காட்டுகிறது; STVP இல் AFR1 மற்றும் AFR0 பிட்களை அமைப்பது அவசியம், மேலும் இரண்டாவது டைமரின் CH1 வெளியீட்டை PD4 இலிருந்து PC5 க்கு மாற்றும்.

இவ்வாறு, 6 பின்கள் LED களை கட்டுப்படுத்தும்: PC6, PC7 மற்றும் PC3 முதல் டைமருக்கு, PC5, PD3 மற்றும் PA3 இரண்டாவது.

I/O பின்களை STM8 இல் அமைப்பது 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 அமைப்பு

முதலில், விதிமுறைகளை வரையறுப்போம்:

  • PWM அதிர்வெண் - டைமர் டிக் செய்யும் அதிர்வெண்;
  • தானாக மறுஏற்றம், AR - தானாக ஏற்றக்கூடிய மதிப்பு, டைமர் கணக்கிடப்படும் (துடிப்பு காலம்);
  • புதுப்பிப்பு நிகழ்வு, UEV - டைமர் AR க்கு எண்ணப்படும் போது ஏற்படும் நிகழ்வு;
  • PWM கடமை சுழற்சி - PWM கடமை சுழற்சி, பெரும்பாலும் "கடமை காரணி" என்று அழைக்கப்படுகிறது;
  • மதிப்பைப் பிடிக்கவும்/ஒப்பிடவும் - பிடிப்பு/ஒப்பீடுக்கான மதிப்பு, இதில் டைமர் கணக்கிடப்பட்டுள்ளது ஏதாவது செய்வார் (PWM விஷயத்தில், இது வெளியீட்டு சமிக்ஞையை தலைகீழாக மாற்றுகிறது);
  • முன் ஏற்ற மதிப்பு - முன்பே ஏற்றப்பட்ட மதிப்பு. மதிப்பை ஒப்பிடுக டைமர் டிக் செய்யும் போது மாற்ற முடியாது, இல்லையெனில் PWM சுழற்சி உடைந்து விடும். எனவே, புதிய பரிமாற்ற மதிப்புகள் ஒரு இடையகத்தில் வைக்கப்பட்டு, டைமர் அதன் கவுண்ட்டவுனின் முடிவை அடைந்து மீட்டமைக்கப்படும்போது வெளியே இழுக்கப்படும்;
  • விளிம்பில் சீரமைக்கப்பட்டது и மையமாக சீரமைக்கப்பட்ட முறைகள் - எல்லை மற்றும் மையத்தில் சீரமைப்பு, Atmel ஐப் போலவே வேகமாக பி.டபிள்யூ.எம் и கட்டம்-சரியான 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 டைமர் போது புதுப்பிப்பு நிகழ்வு முதலில் சரிபார்க்கிறது மதிப்பை ஒப்பிடுக, பின்னர் மட்டுமே ஒரு குறிப்பு சமிக்ஞையை உருவாக்குகிறது. அட்மேகாவின் டைமர் முதலில் திருகுகள் மற்றும் பின்னர் ஒப்பிட்டு, விளைவாக 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 போது முதல் சேனல் செயலற்றதாக இருக்கும். இல்லையெனில், முதல் சேனல் செயலில் உள்ளது.

எல்.ஈ.டி கள் கேத்தோட்கள் மூலம் எம்.கே உடன் இணைக்கப்பட்டுள்ளதால், இரண்டாவது பயன்முறை நமக்குப் பொருந்தும் (முதலாவதும், ஆனால் எங்களுக்கு அது இன்னும் தெரியாது).

தரவுத்தாள்களைப் படித்தல் 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;

AnalogWrite () இன் எளிய அனலாக் ஒன்றை எழுதுவோம், இது உண்மையான மதிப்புகளை ஒப்பிடுவதற்கு டைமருக்கு மாற்றும். பதிவுகள் கணிக்கக்கூடிய வகையில் பெயரிடப்பட்டுள்ளன பதிவேடுகளைப் பிடிக்கவும்/ஒப்பிடவும், ஒவ்வொரு சேனலுக்கும் அவற்றில் இரண்டு உள்ளன: 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 இல், ஒரு டைமர் சுழற்சியில் சமிக்ஞை தலைகீழாக இருக்கும்). LED களுக்கு இது ஒரு பொருட்டல்ல, அதை எவ்வாறு சரிசெய்வது என்பதை கவனமுள்ள வாசகர் ஏற்கனவே யூகிக்க முடியும்.

இரண்டாவது டைமரில் 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];

ஒரு குறிப்பிட்ட LED இன் நிறத்தை மாற்ற, இந்த வரிசையில் தேவையான மதிப்புகளை எழுத போதுமானதாக இருக்கும். செயலில் உள்ள LED இன் எண்ணிக்கைக்கு மாறி பொறுப்பாகும்

uint8_t cnt;

டெமக்ஸ்

முறையான மல்டிபிளெக்சிங்கிற்கு, நமக்கு ஒரு CD74HC238 demultiplexer தேவை. Demultiplexer - வன்பொருளில் ஆபரேட்டரை செயல்படுத்தும் ஒரு சிப் <<. மூன்று உள்ளீட்டு ஊசிகள் மூலம் (பிட்கள் 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) இது செயலில் உள்ள எல்இடியை மாற்றும் செயல்பாட்டை அழைக்கும். பிட்டை மாற்றுவதன் மூலம் இது செய்யப்படுகிறது புதுப்பிப்பு குறுக்கீடு இயக்கு சொல்லும் பெயருடன் ஒரு பதிவேட்டில்

தரவுத்தாள்களைப் படித்தல் 2: STM32 இல் SPI; STM8 இல் PWM, டைமர்கள் மற்றும் குறுக்கீடுகள்
குறுக்கீடு இயக்க பதிவு

#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 விஷுவல் டெவலப்பில் ஒரு திட்டத்தை உருவாக்கியபோது, ​​கூடுதலாக 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

கருத்தைச் சேர்