Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

В қисми якум Ман кӯшиш кардам, ки ба муҳандисони маҳфилҳои электроника, ки аз шимҳои Arduino ба воя расидаанд, бигӯям, ки чӣ гуна ва чаро онҳо бояд варақаҳои маълумот ва дигар ҳуҷҷатҳоро барои микроконтроллерҳо хонанд. Матн калон шуд, бинобар ин ман ваъда додам, ки мисолхои амалиро дар як маколаи алохида нишон дихам. Хуб, вай худро занбурўғи ширӣ номид...

Имрӯз ман ба шумо нишон медиҳам, ки чӣ гуна варақаҳои маълумотро барои ҳалли хеле содда, вале барои бисёр лоиҳаҳо, вазифаҳо дар STM32 (Blue Pill) ва контроллерҳои STM8 заруранд. Ҳама лоиҳаҳои намоишӣ ба LED-ҳои дӯстдоштаи ман бахшида шудаанд; мо онҳоро ба миқдори зиёд равшан мекунем, ки барои ин мо бояд ҳама навъҳои периферии ҷолибро истифода барем.

Матн боз азим шуд, аз ин рӯ ман барои роҳат мундариҷаро таҳия мекунам:

STM32 Blue Pill: 16 LED бо ронандаи DM634
STM8: Насб кардани шаш пин PWM
STM8: 8 LED RGB дар се пин, халал мерасонад

Радди масъулият: Ман муҳандис нестам, ман вонамуд намекунам, ки дар соҳаи электроника дониши амиқ дорам, мақола барои дӯстдорони мисли ман пешбинӣ шудааст. Дарвоқеъ, ман худро ду сол пеш аудиторияи мақсаднок медонистам. Агар касе ба ман мегуфт, ки варақаҳои маълумот дар чипи ношинос хондан даҳшатнок нест, ман вақти зиёдро дар ҷустуҷӯи баъзе порчаҳои код дар Интернет сарф намекардам ва бо кайчи ва лентаи часпак асобағол ихтироъ мекардам.

Диққати ин мақола на ба варақаҳои маълумот аст, на лоиҳаҳо, аз ин рӯ код метавонад на он қадар тозаву озода бошад ва аксар вақт танг бошад. Лоиҳаҳои худ хеле соддаанд, гарчанде ки барои шиносоии аввал бо чипи нав мувофиқанд.

Ман умедворам, ки мақолаи ман ба касе дар марҳилаи шабеҳи таъмид дар маҳфил кӯмак хоҳад кард.

STM32

16 LED бо DM634 ва SPI

Лоиҳаи хурд бо истифода аз Blue Pill (STM32F103C8T6) ва драйвери LED DM634. Бо истифода аз варақаҳои маълумот, мо драйвер, портҳои STM IO-ро муайян мекунем ва SPI-ро танзим мекунем.

DM634

Чипи Тайванӣ бо 16 баромади 16-битии PWM, метавонад ба занҷир пайваст карда шавад. Модели пастсифати 12-бит аз лоиҳаи ватанӣ маълум аст Бастаи сабук. Дар як вақт, байни DM63x ва маъруф TLC5940 интихоб кардам, ман бо якчанд сабабҳо DM-ро интихоб кардам: 1) TLC дар Aliexpress бешубҳа қалбакӣ аст, аммо ин нест; 2) ДМ дорои PWM-и автономӣ бо генератори басомади худ мебошад; 3) онро дар Маскав арзон харидан мумкин буд, на интизори фиристодани Алӣ. Ва, албатта, на аз китобхонаи тайёр, балки худатон идора кардани чипро омухтан шавковар буд. Ҳоло чипҳо асосан дар бастаи SSOP24 пешниҳод карда мешаванд; онҳоро ба адаптер кафшер кардан осон аст.

Азбаски истеҳсолкунанда Тайван аст, рӯйхат чип бо забони англисӣ Чин навишта шудааст, ки маънои онро дорад, ки он шавқовар хоҳад буд. Аввал мо ба пинут назар мекунем (Пайвастшавӣ ба PIN) барои фаҳмидани он ки кадом пойро ба чӣ пайваст кардан лозим аст ва тавсифи пинҳо (Тавсифи пин). 16 пин:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Сарчашмаҳои танӯраи DC (дренажи кушод)

Ғарқ шудан / Баромади дренажии кушод - дренаж; манбаи ҷараёни ҷорӣ; баромад дар ҳолати фаъол ба замин пайваст карда мешавад - LED-ҳо бо катодҳо ба ронанда пайваст карда мешаванд. Аз ҷиҳати электрикӣ, ин, албатта, "дренажи кушод" нест (дренажи кушод), аммо дар варақаҳои маълумот ин нишона барои пинҳо дар реҷаи дренажӣ аксар вақт пайдо мешавад.

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Муқовиматҳои беруна байни REXT ва GND барои муқаррар кардани арзиши ҷории баромад

Дар байни пинҳои REXT ва замин як муқовимати истинод насб карда шудааст, ки муқовимати дохилии баромадҳоро назорат мекунад, ба график дар саҳифаи 9-и ҷадвали маълумот нигаред. Дар DM634, ин муқовиматро инчунин тавассути нармафзор идора кардан мумкин аст ва равшании умумиро муқаррар мекунад (равшании ҷаҳонӣ); Ман дар ин мақола ба тафсилот намеравам, ман танҳо як муқовимати 2.2 - 3 кОмро дар ин ҷо мегузорам.

Барои фаҳмидани тарзи идоракунии чип, биёед тавсифи интерфейси дастгоҳро бубинем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Бале, ин аст, забони англисии чинӣ бо тамоми ҷалолаш. Тарҷумаи ин мушкил аст, шумо метавонед онро дарк кунед, агар хоҳед, аммо роҳи дигар вуҷуд дорад - бубинед, ки пайвастшавӣ ба TLC5940-и функсионалӣ дар ҷадвали маълумот чӣ гуна тасвир шудааст:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
... Барои ворид кардани маълумот ба дастгоҳ танҳо се пин лозим аст. Канори болоравии сигнали SCLK маълумотро аз pin SIN ба регистри дохилӣ интиқол медиҳад. Пас аз бор кардани ҳама маълумот, сигнали кӯтоҳи баланди XLAT маълумоти пайдарпай интиқолшударо ба регистрҳои дохилӣ мепайвандад. Регистрҳои дохилӣ дарвозаҳо мебошанд, ки тавассути сатҳи сигнали XLAT ба кор андохта мешаванд. Ҳама маълумот аввал битҳои муҳимтарин интиқол дода мешаванд.

Дастгоҳ – қулф/қуф/қуф.
Бархези боло – канори пешбари набз
Аввалан MSB - муҳимтарин (аз чап) каме пеш.
ба маълумоти соат – интиқоли маълумот ба таври пайдарпай (бит ба бит).

Калима часпид аксар вақт дар ҳуҷҷатҳои чипҳо пайдо мешавад ва бо тарзҳои гуногун тарҷума карда мешавад, аз ин рӯ ба хотири фаҳмиш ман худам иҷозат медиҳам

барномаи хурди таълимӣРонандаи LED аслан реестри смена мебошад. "Shift" (баст) дар ном - ҳаракати битии маълумот дар дохили дастгоҳ: ҳар як бит нав, ки дар дохили он пахш карда мешавад, тамоми занҷирро ба пеш тела медиҳад. Азбаски ҳеҷ кас намехоҳад, ки дар давоми смена чашмак задани бесарусомонии LEDҳоро мушоҳида кунад, ин раванд дар регистрҳои буферӣ сурат мегирад, ки аз регистрҳои корӣ бо дампер ҷудо карда шудаанд (часпид) як навъ утоқи интизорӣ аст, ки дар он битҳо бо пайдарпаии дилхоҳ ҷойгир шудаанд. Вақте ки ҳама чиз тайёр аст, парда кушода мешавад ва битҳо ба кор рафта, партияи қаблиро иваз мекунанд. Калом часпид дар ҳуҷҷатҳои микросхемаҳо, новобаста аз он ки он дар кадом комбинатсия истифода мешавад, қариб ҳамеша чунин дамперро дар назар дорад.

Ҳамин тавр, интиқоли маълумот ба DM634 чунин сурат мегирад: вуруди DAI-ро ба арзиши аз ҳама муҳимтарини битҳои дурдаст таъин кунед, DCK-ро боло ва поён кашед; вуруди DAI-ро ба арзиши бит оянда таъин кунед, DCK-ро кашед; ва ғайра то он даме ки ҳамаи битҳо интиқол дода шаванд (соат ворид шуд), пас аз он мо LAT-ро мекашем. Инро дастӣ кардан мумкин аст (каме таркиш), аммо беҳтар аст, ки интерфейси SPI-и махсус барои ин тарҳрезӣшударо истифода баред, зеро он дар STM32-и мо дар ду нусха пешниҳод шудааст.

Ҳабҳои кабуд STM32F103

Муқаддима: Контроллерҳои STM32 нисбат ба Atmega328 хеле мураккабтаранд, назар ба он ки онҳо даҳшатнок ба назар мерасанд. Гузашта аз ин, бо сабабҳои сарфаи энергия, қариб ҳама дастгоҳҳои периферӣ дар оғоз хомӯш карда мешаванд ва басомади соат аз манбаи дохилӣ 8 МГс аст. Хушбахтона, барномасозони STM кодеро навиштанд, ки чипро ба "ҳисобшуда" 72 МГс мерасонад ва муаллифони ҳама IDE-ҳои ман медонам, онро ба тартиби оғозёбӣ дохил карданд, аз ин рӯ ба мо соат лозим нест (аммо шумо метавонед, агар шумо дар ҳақиқат мехоҳед). Аммо шумо бояд дастгоҳҳои перифериро фаъол кунед.

Ҳуҷҷатҳо: Blue Pill бо чипи машҳури STM32F103C8T6 муҷаҳҳаз шудааст, барои он ду ҳуҷҷати муфид мавҷуд аст:

Дар варақаи маълумот мо метавонем ба инҳо таваҷҷӯҳ кунем:

  • Pinouts - pinouts чип - агар мо тасмим гирем, ки тахтаҳоро худамон созем;
  • Харитаи хотира - харитаи хотира барои чипи мушаххас. Дар Дастури истинод харитаи тамоми сатр мавҷуд аст ва дар он регистрҳо зикр шудаанд, ки регистрҳои мо надоранд.
  • Ҷадвали таърифҳои пин – номбар кардани вазифаҳои асосӣ ва алтернативии пинҳо; барои "ҳабҳои кабуд" шумо метавонед дар Интернет расмҳои мувофиқтарро бо рӯйхати пинҳо ва вазифаҳои онҳо пайдо кунед. Аз ин рӯ, мо фавран Google Pinout-и Blue Pill-ро ҷустуҷӯ мекунем ва ин тасвирро дар даст нигоҳ медорем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Эзоҳ: дар акс аз Интернет хатогӣ вуҷуд дошт, ки дар шарҳҳо қайд карда шуд, ташаккур барои ин. Тасвир иваз карда шуд, аммо ин дарс аст - беҳтар аст, ки маълумотро на аз варақаҳои маълумот тафтиш кунед.

Мо варақаи маълумотро хориҷ мекунем, Дастури истинодро мекушоем ва аз ҳоло мо танҳо онро истифода мебарем.
Тартиб: мо бо вуруд / баромади стандартӣ сарукор дорем, SPI-ро танзим мекунем, таҷҳизоти заруриро фаъол мекунем.

Натиҷаи вуруд

Дар Atmega328, I/O хеле содда иҷро карда мешавад, аз ин рӯ фаровонии имконоти STM32 метавонад печида бошад. Ҳоло ба мо танҳо хулоса лозим аст, аммо ҳатто инҳо чаҳор вариант доранд:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
дренажи кушод, резиши алтернативӣ, резиши алтернативӣ

"Кашидан-тела" (тела додан) баромади муқаррарии Arduino аст, пин метавонад қимати баланд ё пастро гирад. Аммо бо "дренажи кушод" вуҷуд доранд мушкилот, гарчанде ки дар асл ҳама чиз дар ин ҷо оддӣ аст:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Конфигуратсияи баромад / вақте ки порт ба баромад таъин шудааст: / буфери баромад фаъол аст: / – ҳолати кушодаи резиши: “0” дар реестри баромад N-MOS-ро фаъол мекунад, “1” дар реестри баромад портро дар ҳолати Hi-Z тарк мекунад ( P-MOS фаъол нест ) / – реҷаи фишор: “0” дар реестри баромад N-MOS-ро фаъол мекунад, “1” дар реестри баромади P-MOS-ро фаъол мекунад.

Ҳама фарқияти байни дренажи кушод (дренажи кушод) аз "пуш-каш" (тела додан) ин аст, ки дар пинҳои аввал ҳолати БАЛАНД қабул карда наметавонад: ҳангоми навиштани яке ба реестри баромад, он ба ҳолати муқовимати баланд мегузарад (импеданси баланд, Hi-Z). Ҳангоми навиштани сифр, пин дар ҳарду режим ҳам аз ҷиҳати мантиқӣ ва ҳам аз ҷиҳати электрикӣ як хел рафтор мекунад.

Дар ҳолати муқаррарии баромад, пин танҳо мундариҷаи реестри баромадро пахш мекунад. Дар "алтернатива" он аз ҷониби таҷҳизоти периферии мувофиқ идора карда мешавад (ниг. 9.1.4):

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Агар бит порт ҳамчун пин-функсияи алтернативӣ танзим карда шавад, реестри пин ғайрифаъол мешавад ва пин ба пини канорӣ пайваст мешавад.

Функсияҳои алтернативии ҳар як пин дар Таърифҳо Варақаи маълумот дар тасвири зеркашидашуда ҷойгир аст. Ба саволе, ки чӣ бояд кард, агар пин дорои якчанд функсияҳои алтернативӣ бошад, ҷавоб бо эзоҳ дар варақаи маълумот дода мешавад:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Агар якчанд дастгоҳҳои периферӣ як пин-ро истифода баранд, барои пешгирӣ кардани ихтилоф байни функсияҳои алтернативӣ, бояд дар як вақт танҳо як дастгоҳи периферӣ истифода шавад ва бо истифода аз бити фаъолсозии соати периферӣ иваз карда шавад (дар реестри мувофиқи RCC).

Ниҳоят, пинҳо дар ҳолати баромад низ суръати соат доранд. Ин як хусусияти дигари сарфаи энергия аст; дар ҳолати мо, мо онро танҳо ба ҳадди аксар муқаррар карда, фаромӯш мекунем.

Ҳамин тавр: мо SPI-ро истифода мебарем, ки ин маънои онро дорад, ки ду пин (бо маълумот ва сигнали соат) бояд "функсияи алтернативии push-pull" бошад ва дигаре (LAT) бояд "пули муқаррарӣ" бошад. Аммо пеш аз таъин кардани онҳо, биёед бо SPI кор кунем.

SPI

Боз як барномаи хурди таълимӣ

SPI ё Serial Peripheral Interface (интерфейси периферии силсилавӣ) интерфейси оддӣ ва хеле муассир барои пайваст кардани МК бо дигар MK-ҳо ва умуман ҷаҳони беруна мебошад. Принсипи кори он аллакай дар боло тавсиф шудааст, ки дар бораи драйвери LED-и чинӣ (дар дастури истинод ба фасли 25 нигаред). SPI метавонад дар реҷаи устод («усто») ва ғулом («ғулом») кор кунад. SPI дорои чаҳор канали асосӣ мебошад, ки на ҳама метавонанд истифода шаванд:

  • MOSI, Master Output / Input Slave: ин пин маълумотро дар реҷаи асосӣ интиқол медиҳад ва маълумотро дар ҳолати ғулом қабул мекунад;
  • MISO, Вуруди Мастер / Натиҷаи ғулом: баръакс, он дар устод қабул мекунад ва дар ғулом интиқол медиҳад;
  • SCK, соати силсилавӣ: басомади интиқоли маълумотро дар усто муқаррар мекунад ё сигнали соатро дар ғулом қабул мекунад. Аслан зарбаҳои зарбазананда;
  • SS, Slave Select: бо ёрии ин канал ғулом медонад, ки аз ӯ чизе талаб карда мешавад. Дар STM32 он NSS номида мешавад, ки дар он N = манфӣ, яъне. назоратчй гулом мешавад, агар дар ин канал замин бошад. Он бо режими Output Open Drain хуб омехта мешавад, аммо ин як ҳикояи дигар аст.

Мисли ҳама чизи дигар, SPI дар STM32 аз функсияҳо бой аст, ки фаҳмидани онро то андозае мушкил мекунад. Масалан, он метавонад на танҳо бо SPI, балки бо интерфейси I2S кор кунад ва дар ҳуҷҷатҳо тавсифи онҳо омехта шудааст, зарур аст, ки зиёдатӣ сари вақт бурида шавад. Вазифаи мо бениҳоят содда аст: мо танҳо бояд маълумотро бо истифода аз MOSI ва SCK фиристем. Мо ба бахши 25.3.4 (муоширати нимдуплекс, алоқаи нимдуплекс) меравем, ки дар он ҷо пайдо мекунем 1 соат ва 1 сими маълумоти яктарафа (1 сигнали соат ва 1 ҷараёни якҷонибаи маълумот):

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Дар ин режим, барнома SPI-ро дар ҳолати танҳо интиқол ё танҳо қабул истифода мебарад. / Ҳолати танҳо интиқол ба ҳолати дуплекс шабоҳат дорад: маълумот дар пинҳои интиқол интиқол дода мешавад (MOSI дар ҳолати асосӣ ё MISO дар ҳолати ғулом) ва пинҳои қабулкунанда (MISO ё MOSI) метавонад ҳамчун пини муқаррарии вуруд/ баромад истифода шавад . Дар ин ҳолат, барнома танҳо бояд буфери Rx-ро сарфи назар кунад (агар он хонда шавад, дар он ҷо маълумоти интиқол дода намешавад).

Аҷоиб, пин MISO ройгон аст, биёед сигнали LAT-ро ба он пайваст кунем. Биёед ба Slave Select назар кунем, ки онро дар STM32 ба таври барномавӣ идора кардан мумкин аст, ки хеле қулай аст. Мо параграфи ҳамон номро дар фасли 25.3.1 SPI хонем Тавсифи умумӣ:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Назорати нармафзори NSS (SSM = 1) / Маълумоти интихоби ғулом дар бит SSI реестри SPI_CR1 мавҷуд аст. PIN берунии NSS барои дигар эҳтиёҷоти барнома ройгон боқӣ мемонад.

Вақти он расидааст, ки ба қайдҳо нависед. Ман тасмим гирифтам, ки SPI2-ро истифода барам, суроғаи асосии онро дар ҷадвали маълумот ҷустуҷӯ кунам - дар фасли 3.3 Харитаи хотира:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Хуб, биёед оғоз кунем:

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

Бахши 25.3.3-ро бо унвони худфаъолкунандаи "Танзими SPI дар режими Master" кушоед:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

1. Басомади соати пайдарпайро бо битҳои BR[2:0] дар реестри SPI_CR1 таъин кунед.

Реестрҳо дар фасли дастурамали ҳамон ном ҷамъоварӣ карда мешаванд. Гузариши суроға (Офсети суроға) барои CR1 – 0x00, ба таври нобаёнӣ ҳамаи битҳо тоза карда мешаванд (Барқарор кардани арзиши 0x0000):

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Битҳои BR тақсимкунандаи соати контроллерро муқаррар мекунанд ва ҳамин тавр басомади кор кардани SPI-ро муайян мекунанд. Басомади STM32-и мо 72 МГс хоҳад буд, ронандаи LED, тибқи варақаи маълумотии худ, бо басомади то 25 МГс кор мекунад, аз ин рӯ мо бояд ба чор тақсим кунем (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)

Азбаски мо дар ин ҷо варақаи маълумотро мехонем ва ба схемаҳо нигоҳ намекунем, биёед ба тавсифи матнии битҳои CPOL ва CPHA дар саҳифаи 704 бодиққат назар андозем (Тавсифи умумии SPI):

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Фазаи соат ва қутбӣ
Бо истифода аз битҳои CPOL ва CPHA реестри SPI_CR1, шумо метавонед ба таври барномавӣ чаҳор муносибати вақтро интихоб кунед. Бити CPOL (қутбияти соат) ҳолати сигнали соатро ҳангоми интиқоли маълумот назорат мекунад. Ин бит режимҳои усто ва ғуломро назорат мекунад. Агар CPOL аз нав барқарор карда шавад, PIN SCK дар ҳолати истироҳат паст аст. Агар бит CPOL муқаррар карда шуда бошад, pin SCK дар ҳолати истироҳат баланд аст.
Вақте ки бит CPHA (фазаи соат) муқаррар карда мешавад, строби доми баланд канори дуюми сигнали SCK мебошад (агар CPOL равшан бошад, коҳиш меёбад, агар CPOL муқаррар карда шавад, баланд мешавад). Маълумот бо тағирёбии дуюми сигнали соат гирифта мешавад. Агар бит CPHA равшан бошад, строби доми баланд канори болоравии сигнали SCK мебошад (дар канори афтидан, агар CPOL муқаррар карда шуда бошад, канори болошаванда, агар CPOL тоза карда шавад). Маълумот ҳангоми тағирёбии аввал дар сигнали соат гирифта мешавад.

Ин донишро азхуд карда, мо ба хулосае меоем, ки ҳарду бит бояд сифр боқӣ монанд, зеро Мо мехоҳем, ки сигнали SCK ҳангоми истифода нашудан паст боқӣ монад ва маълумот дар канори болоравии набз интиқол дода шавад (нигаред ба расми XNUMX). Rising Edge дар варақаи маълумотии DM634).

Воқеан, дар ин ҷо мо бори аввал ба як хусусияти вожагонӣ дар варақаҳои иттилоотии СТ дучор шудем: дар онҳо ибораи “аз нав танзим кардани бит ба сифр” навишта шудааст. каме аз нав барқарор карданва не каме тоза кардан, масалан, Атмега.

3. Барои муайян кардани он ки блоки маълумот формати 8-бит ё 16-бит аст, бит DFF-ро таъин кунед

Ман махсусан DM16-и 634-бита гирифтам, то ки бо интиқоли маълумоти 12-битии PWM, ба монанди DM633, ташвиш надиҳам. Муқаррар кардани DFF ба як:

#define DFF         0x0800

_SPI2_ (_SPI_CR1) |= DFF; // 16-bit mode

4. Барои муайян кардани формати блок бит LSBFIRST-ро дар реестри SPI_CR1 танзим кунед

LSBFIRST, тавре ки аз номаш бармеояд, интиқолро бо битҳои камтарин аввал танзим мекунад. Аммо DM634 мехоҳад маълумотро аз битҳои муҳимтарин қабул кунад. Аз ин рӯ, мо онро аз нав танзим мекунем.

5. Дар ҳолати сахтафзор, агар вуруд аз pin NSS талаб карда шавад, дар давоми тамоми пайдарпаии интиқоли байт сигнали баландро ба PIN NSS татбиқ кунед. Дар реҷаи нармафзори NSS, битҳои SSM ва SSI-ро дар реестри SPI_CR1 насб кунед. Агар PIN NSS ҳамчун баромад истифода шавад, танҳо бит SSOE таъин карда мешавад.

SSM ва SSI -ро насб кунед, то дар бораи ҳолати сахтафзори NSS фаромӯш кунед:

#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: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Тартиби интиқоли маълумот
Интиқол вақте оғоз мешавад, ки байт ба буфери Tx навишта мешавад.
Байти маълумот ба реестри смена дар соат бор карда мешавад параллел режим (аз автобуси дохилӣ) ҳангоми интиқоли битҳои аввал, ки пас аз он ба он интиқол дода мешавад пайдарпай Ҳолати пинҳои MOSI, битҳои аввал ё охирин ба пеш вобаста ба танзими бит LSBFIRST дар реестри CPI_CR1. Парчами TXE пас аз интиқоли маълумот муқаррар карда мешавад аз буфери Tx ба регистри гузариш, ва инчунин, агар бит TXEIE дар реестри CPI_CR1 муқаррар карда шуда бошад, қатъро тавлид мекунад.

Ман дар тарҷума чанд калимаро таъкид кардам, то таваҷҷӯҳ ба як хусусияти татбиқи SPI дар контроллерҳои STM ҷалб карда шавад. Дар Atmega парчами TXE (Tx холӣ, Tx холӣ аст ва барои қабули маълумот омода аст) танҳо пас аз фиристодани тамоми байт муқаррар карда мешавад зоҳирӣ. Ва дар ин ҷо ин парчам пас аз ворид кардани байт ба регистри дохилии смена гузошта мешавад. Азбаски он дар як вақт бо ҳама битҳо ба он ҷо тела дода мешавад (мувозӣ) ва сипас маълумот пайдарпай интиқол дода мешавад, TXE пеш аз пурра фиристодани байт муқаррар карда мешавад. Ин муҳим аст, зеро дар сурати ронандаи LED мо, мо бояд пас аз фиристодан пинҳои LAT-ро кашем всех маълумот, яъне. Танҳо парчами TXE барои мо кофӣ нахоҳад буд.

Ин маънои онро дорад, ки ба мо парчами дигар лозим аст. Биёед 25.3.7 - "Парчамҳои Статус" -ро бубинем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
<...>
Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Парчами банд
Парчами BSY аз ҷониби сахтафзор насб ва тоза карда мешавад (навиштан ба он таъсире надорад). Парчами BSY ҳолати қабати алоқаи SPI-ро нишон медиҳад.
Он аз нав барқарор мекунад:
вақте ки интиқол ба анҷом мерасад (ба истиснои ҳолати асосӣ, агар интиқол пайваста бошад)
вақте ки SPI ғайрифаъол аст
вақте ки хатогии режими асосӣ рух медиҳад (MODF = 1)
Агар интиқол пайваста набошад, парчами BSY дар байни ҳар як интиқоли маълумот тоза карда мешавад

Хуб, ин муфид хоҳад буд. Биёед бифаҳмем, ки буфери Tx дар куҷо ҷойгир аст. Барои ин, "Феҳристи маълумотҳои SPI" -ро хонед:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Лаҷом 15:0 DR [15:0] Феҳристи маълумот
Маълумоти гирифташуда ё маълумоте, ки бояд интиқол дода шаванд.
Реестри маълумот ба ду буфер тақсим мешавад - яке барои навиштан (буфери интиқол) ва дигаре барои хондан (буфери қабул). Навиштан ба реестри додаҳо ба буфери Tx менависад ва хондан аз реестри додаҳо арзиши дар буфери Rx мавҷудбударо бармегардонад.

Хуб, ва феҳристи вазъият, ки дар он парчамҳои TXE ва BSY пайдо мешаванд:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Мо менависем:

#define _SPI_DR  0x0C
#define _SPI_SR  0x08

#define BSY         0x0080
#define TXE         0x0002

void dm_shift16(uint16_t value)
{
    _SPI2_(_SPI_DR) = value; //send 2 bytes
    while (!(_SPI2_(_SPI_SR) & TXE)); //wait until they're sent
}

Хуб, азбаски мо бояд аз рӯи шумораи баромадҳои драйвери LED 16 маротиба ду байт интиқол диҳем, чизе монанди ин:

void sendLEDdata()
{
    LAT_low();
    uint8_t k = 16;
    do
    {   k--;
        dm_shift16(leds[k]);
    } while (k);

    while (_SPI2_(_SPI_SR) & BSY); // finish transmission

    LAT_pulse();
}

Аммо мо ҳоло намедонем, ки пинҳои LAT-ро чӣ гуна кашем, бинобар ин мо ба I/O бармегардем.

Таъин кардани пинҳо

Дар STM32F1, реестрҳое, ки барои ҳолати пинҳо масъуланд, хеле ғайриоддӣ мебошанд. Равшан аст, ки онҳо нисбат ба Atmega бештаранд, аммо онҳо инчунин аз дигар микросхемаҳои STM фарқ мекунанд. Фасли 9.1 Тавсифи умумии GPIO:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Ҳар як бандарҳои таъиноти умумӣ / баромад (GPIO) дорои ду регистри конфигуратсияи 32-битӣ (GPIOx_CRL ва GPIOx_CRH), ду регистри маълумоти 32-битӣ (GPIOx_IDR ва GPIOx_ODR), реестри танзим/аз нав танзимкунии 32-бит (GPIOx_BSRR), реестри азнавсозии 16-бит (GPIOx_BRR) ва 32-бит дорад. реестри блоки бит (GPIOx_LCKR).

Ду регистрҳои аввал ғайриоддӣ ва инчунин хеле нороҳатанд, зеро 16 пинҳои портӣ дар формати "чор бит барои як бародар" дар саросари онҳо пароканда шудаанд. Онхое. пинҳои аз сифр то ҳафт дар CRL ва дигарон дар CRH мебошанд. Дар айни замон, регистрҳои боқимонда битҳои ҳамаи пинҳои портро бомуваффақият дар бар мегиранд - аксар вақт нисфи боқимонда "захира" мешаванд.

Барои содда, биёед аз охири рӯйхат оғоз кунем.

Ба мо феҳристи басташавӣ лозим нест.

Реестрҳои танзим ва барқароркунӣ хеле хандоваранд, ки онҳо қисман якдигарро такрор мекунанд: шумо метавонед ҳама чизро танҳо дар BSRR нависед, ки дар он 16 бит баландтар пинро ба сифр барқарор мекунад ва битҳои пасттар ба 1 муқаррар карда мешаванд ё шумо инчунин метавонед BRR-ро истифода баред, ки 16 битҳои поёнии он танҳо пинро аз нав танзим мекунанд. Ман варианти дуюмро дӯст медорам. Ин регистрҳо муҳиманд, зеро онҳо дастрасии атомиро ба пинҳо таъмин мекунанд:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Танзими атомӣ ё барқароркунӣ
Ҳангоми барномасозии GPIOx_ODR дар сатҳи бит зарурати ғайрифаъол кардани танаффусҳо нест: як ё якчанд битҳоро бо як амалиёти навиштани атомии APB2 иваз кардан мумкин аст. Ин тавассути навиштани "1" ба реестри танзим/азнавсозӣ (GPIOx_BSRR ё танҳо барои аз нав танзимкунии GPIOx_BRR) аз бит, ки бояд тағир дода шавад, ба даст оварда мешавад. Дигар битҳо бетағйир мемонанд.

Реестрҳои додаҳо номҳои комилан фаҳмо доранд - IDR = вуруди Реестри самт, реестри воридот; ОДР = Натиҷаи Реестри самт, реестри баромад. Мо ба онҳо дар лоиҳаи ҷорӣ ниёз нахоҳем дошт.

Ва ниҳоят, регистрҳои назоратӣ. Азбаски мо ба пинҳои дуюми SPI, яъне PB13, PB14 ва PB15 таваҷҷӯҳ дорем, мо фавран ба CRH назар мекунем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Ва мо мебинем, ки мо бояд чизеро дар битҳо аз 20 то 31 нависед.

Мо аллакай дар боло фаҳмидем, ки мо аз пинҳо чӣ мехоҳем, бинобар ин ман бе скриншот кор мекунам, ман танҳо мегӯям, ки MODE самтро муайян мекунад (агар ҳарду бит ба 0 муқаррар карда шуда бошад) ва суръати пин (ба мо 50 МГс лозим аст, яъне. ҳарду пин ба "1") ва CNF режимро муқаррар мекунад: муқаррарии "push-pull" - 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-ро мушоҳида карда метавонем. Мо онро дар ҳуҷҷатҳо меҷӯем: ​​ин Reset ва Control Clock аст.

Тавре ки дар боло гуфта шуд, хушбахтона, мушкилтарин қисми мавзӯи соатсозӣ барои мо аз ҷониби одамони STM анҷом дода шуд, ки барои ин мо ба онҳо ташаккури зиёд баён мекунем (бори дигар ман истинод медиҳам Вебсайти Ди Халт, барои равшан кардани он, ки он то чӣ андоза печида аст). Ба мо танҳо регистрҳо лозиманд, ки барои фаъол кардани соатҳои периферӣ масъуланд (Соати периферии фаъол кардани регистрҳо). Аввалан, биёед суроғаи асосии RCC-ро пайдо кунем, он дар ибтидои "Харитаи хотира" ҷойгир аст:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

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

Ва он гоҳ ё истинодро клик кунед, ки дар он шумо кӯшиш мекунед, ки дар табақ чизе пайдо кунед, ё беҳтараш аз бахшҳои марбут ба тавсифи регистрҳои фаъолкунанда гузаред. регистрҳоро фаъол созед. Дар куҷо мо RCC_APB1ENR ва RCC_APB2ENR-ро пайдо хоҳем кард:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Ва онҳо, мутаносибан, битҳоро дар бар мегиранд, ки соатҳои 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;

Рамзи ниҳоӣ метавонад пайдо шавад дар ин ҷо.

Агар шумо имконият ва хоҳиши озмоиш дошта бошед, пас DM634-ро ба таври зерин пайваст кунед: DAI ба PB15, DCK ба PB13, LAT ба PB14. Мо ронандаро аз 5 вольт барқ ​​​​дорем, пайваст кардани заминҳоро фаромӯш накунед.

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

STM8 PWM

PWM дар STM8

Вақте ки ман ин мақоларо ба нақша гирифтам, ман ҳамчун намуна тасмим гирифтам, ки баъзе функсияҳои чипи ношиносро бо истифода аз варақаи маълумот азхуд кунам, то ки ман пойафзолдӯзро бе мӯза накунам. STM8 барои ин нақш идеалӣ буд: аввалан, ман якчанд тахтаҳои чинӣ бо STM8S103 доштам ва дуюм, он чандон маъмул нест ва аз ин рӯ васвасаи хондан ва ёфтани роҳи ҳалли Интернет аз набудани ин ҳалли мушкилот вобаста аст.

Чип низ дорад рӯйхат и дастури истинод RM0016, дар аввал суроғаҳои pinout ва сабти ном мавҷуданд, дар дуюм - ҳама чизи дигар. STM8 дар C дар IDE даҳшатнок барномарезӣ шудааст ST Visual Develop.

Соатгузорӣ ва вуруд / баромад

Бо нобаёнӣ, STM8 бо басомади 2 МГс кор мекунад, ин бояд фавран ислоҳ карда шавад.

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Соати HSI (суръати дохилӣ).
Сигнали соати HSI аз осциллятори дохилии RC 16 МГс бо тақсимкунандаи барномарезишаванда (1 то 8) гирифта мешавад. Он дар реестри тақсимкунандаи соат (CLK_CKDIVR) муқаррар карда шудааст.
Эзоҳ: дар оғоз як осциллятори HSI RC бо тақсимкунандаи 8 ҳамчун манбаи пешбари сигнали соат интихоб карда мешавад.

Мо суроғаи реестрро дар варақаи маълумот, тавсифро дар refman пайдо мекунем ва мебинем, ки реестр бояд тоза карда шавад:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Азбаски мо PWM-ро иҷро карданием ва LED-ҳоро пайваст мекунем, биёед ба пинут назар кунем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Чип хурд аст, бисёр вазифаҳо дар ҳамон пинҳо боздошта мешаванд. Он чизе, ки дар қавсҳои мураббаъ ҷойгир аст, "функсияи алтернативӣ" аст, он бо "байтҳои опсия" иваз карда мешавад (байтҳои опсия) - чизе ба монанди фишурдаҳои Atmega. Шумо метавонед арзишҳои онҳоро ба таври барномавӣ тағир диҳед, аммо ин шарт нест, зеро Функсияи нав танҳо пас аз бозоғозӣ фаъол мешавад. Истифодаи ST Visual Programmer (бо Visual Develop бор карда шудааст) осонтар аст, ки метавонад ин байтҳоро тағир диҳад. Нишондиҳанда нишон медиҳад, ки пинҳои CH1 ва CH2-и таймери аввал дар қавсҳои мураббаъ пинҳон шудаанд; битҳои AFR1 ва AFR0-ро дар STVP гузоштан лозим аст ва дуюмаш инчунин баромади CH1-и таймери дуюмро аз PD4 ба PC5 интиқол медиҳад.

Ҳамин тариқ, 6 пин LED-ҳоро назорат мекунад: PC6, PC7 ва PC3 барои таймери аввал, PC5, PD3 ва PA3 барои дуюм.

Насб кардани пинҳои I/O дар STM8 нисбат ба STM32 соддатар ва мантиқтар аст:

  • аз феҳристи самти маълумот Atmega DDR шинос (Феҳристи самти маълумот): 1 = баромад;
  • аввалин реестри идоракунандаи CR1, вақте ки баромад, реҷаи фишор (1) ё резиши кушодаро (0) муқаррар мекунад; азбаски ман LED-ҳоро ба чип бо катодҳо пайваст мекунам, ман дар ин ҷо сифрҳоро мегузорам;
  • реестри назорати дуюм CR2, вақте ки баромад, муқаррар суръати соат: 1 = 10 МГс

#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 мешиканад. Аз ин рӯ, арзишҳои нави интиқолшуда дар буфер ҷойгир карда мешаванд ва вақте ки таймер ба анҷоми ақибшумории худ мерасад ва аз нав барқарор мешавад;
  • Ба канори мувофиқ и Режимҳои ба марказ мутобиқшуда - ҳамоҳангсозӣ дар сарҳад ва дар марказ, ҳамон тавре ки Атмел PWM зуд и PWM-и марҳилаи дуруст.
  • OCiREF, Натиҷаи муқоисаи сигнали истинод - сигнали баромади истинод, дар асл, он чизе, ки дар пини мувофиқ дар ҳолати PWM пайдо мешавад.

Тавре ки аллакай аз pinout маълум аст, ду таймер дорои қобилияти PWM - якум ва дуюм. Ҳарду 16-бит мебошанд, якум дорои бисёр хусусиятҳои иловагӣ мебошад (аз ҷумла, он метавонад ҳам боло ва ҳам поён ҳисоб кунад). Ҳардуи мо бояд баробар кор кунем, бинобар ин ман қарор додам, ки аз дуюми баръало камбағалтар оғоз кунам, то тасодуфан чизеро, ки дар он ҷо мавҷуд нест, истифода набарам. Мушкилот дар он аст, ки тавсифи функсияҳои PWM-и ҳама таймерҳо дар дастури истинод дар боб дар бораи таймери аввал (17.5.7 Усули PWM) оварда шудааст, аз ин рӯ шумо бояд ҳама вақт дар тамоми ҳуҷҷат ба пешу пеш ҷаҳида бошед.

PWM дар STM8 нисбат ба PWM дар Atmega бартарии муҳим дорад:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
PWM-и сарҳадӣ
Конфигуратсияи ҳисоб аз поён то боло
Ҳисобкунии аз поён ба боло фаъол аст, агар бит DIR дар реестри TIM_CR1 тоза карда шавад
Мисол
Дар мисол ҳолати аввалини 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: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
110: Ҳолати якуми PWM - ҳангоми ҳисоб кардан аз поён ба боло, канали аввал фаъол аст, дар ҳоле ки TIMx_CNT < TIMx_CCR1. Дар акси ҳол, канали аввал ғайрифаъол аст. [минбаъд дар ҳуҷҷат нусхабардории хато аз таймер 1 мавҷуд аст] 111: Ҳолати дуюми PWM – ҳангоми ҳисоб кардан аз поён ба боло, канали аввал ғайрифаъол аст, дар ҳоле ки TIMx_CNT < TIMx_CCR1. Дар акси ҳол, канали аввал фаъол аст.

Азбаски LEDҳо ба МК тавассути катодҳо пайваст карда шудаанд, режими дуюм ба мо мувофиқ аст (якум низ, аммо мо инро ҳоло намедонем).

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Bit 3 OC1PE: Фаъолсозии PIN 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: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Биёед як аналоги оддии AnalogWrite() нависед, ки арзишҳои воқеиро барои муқоиса ба таймер интиқол медиҳад. Реестрҳо ба таври пешбинишуда номгузорӣ шудаанд Сабт/Муқоисаи регистрҳо, барои ҳар як канал дутои онҳо вуҷуд доранд: 8 битҳои пасттар дар TIM2_CCRxL ва битҳои баландтар дар TIM2_CCRxH. Азбаски мо PWM-и 8-битаро офаридаем, танҳо навиштани битҳои камтарин кофӣ аст:

#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, сигнал барои як давраи таймер инвертатсия карда мешавад). Барои LEDs ин аҳамият надорад ва хонандаи бодиққат аллакай метавонад тахмин кунад, ки чӣ гуна онро ислоҳ кунад.

PWM дар таймери дуюм кор мекунад, биёед ба аввал гузарем.

Таймери аввал битҳои якхеларо дар ҳамон регистрҳо дорад (танҳо он битҳое, ки дар таймери дуюм "захира" мондаанд, дар аввал барои ҳама навъҳои пешрафта фаъолона истифода мешаванд). Аз ин рӯ, дар варақаи маълумотҳо суроғаҳои ҳамон регистрҳоро ёфтан ва кодро нусхабардорӣ кардан кифоя аст. Хуб, арзиши тақсимкунандаи басомадро тағир диҳед, зеро ... Таймери аввал мехоҳад на қудрати ду, балки арзиши дақиқи 16-битро дар ду регистр гирад Prescaler High и паст. Мо ҳама чизро мекунем ва... таймери аввал кор намекунад. Чӣ гап?

Мушкилотро танҳо тавассути дидани тамоми қисмат дар бораи регистрҳои назоратии таймер 1 ҳал кардан мумкин аст, ки дар он ҷо мо онеро меҷӯем, ки таймери дуюм надорад. Он ҷо хоҳад буд 17.7.30 Реестри танаффус (TIM1_BKR), дар куҷо ин каме вуҷуд дорад:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Натиҷаи асосиро фаъол созед

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Ин ҳама бешубҳа ҳоло аст, код дар ҳамон ҷо.

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Мултиплекси STM8

Мултипликатсия дар STM8

Лоиҳаи сеюм ин пайваст кардани ҳашт LED RGB ба таймери дуюм дар ҳолати PWM ва нишон додани рангҳои гуногун мебошад. Он ба консепсияи мултиплекси LED асос ёфтааст, ки агар шумо LED-ро хеле зуд фурӯзон ва хомӯш кунед, ба назари мо чунин менамояд, ки онҳо доимо фурӯзон ҳастанд (устувории биниш, инерцияи дарки визуалӣ). Ман як бор кардам чизе монанди ин дар Arduino.

Алгоритми кор чунин менамояд:

  • аноди аввалини LED RGB пайваст;
  • онро даргиронда, ба катодхо сигналхои зарурй мефиристад;
  • то охири давраи PWM интизор шуд;
  • аноди дуюми LED RGB пайваст;
  • фурӯзон кард...

Хуб, ва ғайра. Албатта, барои кори зебо лозим аст, ки анод васл карда шавад ва LED дар як вақт "даргир" шавад. Хуб, ё қариб. Дар ҳар сурат, мо бояд кодеро нависем, ки арзишҳоро дар се канали таймери дуюм мебарорад, онҳоро ҳангоми расидан ба UEV тағир медиҳад ва ҳамзамон LED-и RGB фаъолро иваз мекунад.

Азбаски гузариши LED худкор аст, мо бояд "хотираи видео" эҷод кунем, ки коркардкунандаи таваққуф аз он маълумот мегирад. Ин массиви оддӣ аст:

uint8_t colors[8][3];

Барои тағир додани ранги LED-и мушаххас, ба ин массив навиштани арзишҳои зарурӣ кофӣ хоҳад буд. Ва тағирёбанда барои шумораи LED-и фаъол масъул хоҳад буд

uint8_t cnt;

Демукс

Барои мултиплекси дуруст ба мо, ба таври аҷиб, як демультиплексери CD74HC238 лозим аст. Demultiplexer - чипи, ки операторро дар сахтафзор амалӣ мекунад <<. Тавассути се пинҳои вурудӣ (битҳои 0, 1 ва 2) мо ба он рақами се-битаи X-ро медиҳем ва дар посух он рақами баромадро фаъол мекунад (1<<X). Вурудҳои боқимондаи чип барои миқёси тамоми тарҳ истифода мешаванд. Ба мо ин чип на танҳо барои кам кардани шумораи пинҳои ишғолшудаи микроконтроллер лозим аст, балки инчунин барои бехатарӣ - то тасодуфан аз имкон бештар LED-ҳоро фурӯзон накунем ва МК-ро сӯзонем. Чип як динор арзиш дорад ва бояд ҳамеша дар кабинети тиббии хонагии шумо нигоҳ дошта шавад.

CD74HC238 мо барои таъмини шиддат ба аноди LED-и дилхоҳ масъул хоҳад буд. Дар мултиплекси мукаммал, он ба сутун тавассути P-MOSFET шиддат медиҳад, аммо дар ин намоишӣ ин мустақиман имконпазир аст, зеро мувофиқи он 20 мА барқ ​​мегирад рейтингҳои максималии мутлақ дар варақаи маълумот. Аз Варақаи маълумотии CD74HC238 ба мо pinouts ва ин варақаи фиреб лозим аст:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
H = сатҳи баланди шиддат, L = сатҳи пасти шиддат, X - парвое надорад

Мо E2 ва E1-ро ба замин, E3, A0, A1 ва A3-ро ба пинҳои PD5, PC3, PC4 ва PC5-и STM8 пайваст мекунем. Азбаски ҷадвали боло ҳам сатҳҳои паст ва ҳам баландро дар бар мегирад, мо ин пинҳоро ҳамчун пинҳои пахшкунанда танзим мекунем.

PWM

PWM дар таймери дуюм ҳамон тавре ки дар ҳикояи қаблӣ бо ду фарқият танзим карда шудааст:

Аввалан, мо бояд халалдоркуниро фаъол созем Ҳодисаи навсозӣ (UEV), ки функсияеро даъват мекунад, ки LED-и фаъолро иваз мекунад. Ин тавассути тағир додани бит анҷом дода мешавад Навсозии қатъи фаъол дар феҳрист бо номи худ

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
Қатъи сабти имкон

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Тафовути дуюм ба падидаи мултиплекс, ба монанди гусфандон – дурахши паразитии диодҳо. Дар ҳолати мо, он метавонад аз он сабаб пайдо шавад, ки таймер, ки дар UEV халалдор шуда буд, кандаро идома медиҳад ва коркардкунандаи танаффус вақти иваз кардани LED-ро пеш аз он ки таймер ба пинҳо чизе нависад. Барои мубориза бо ин, шумо бояд мантиқро тағир диҳед (0 = равшании ҳадди аксар, 255 = ҳеҷ чиз фурӯзон нест) ва аз арзишҳои шадиди давраи корӣ канорагирӣ кунед. Онхое. боварӣ ҳосил кунед, ки пас аз UEV LEDҳо барои як давраи PWM пурра хомӯш мешаванд.

Тағир додани қутбӣ:

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

Аз гузоштани r, g ва b ба 255 худдорӣ кунед ва ҳангоми истифодаи онҳо баргардонидани онҳоро фаромӯш накунед.

Қатъ мекунад

Мохияти танаффус аз он иборат аст, ки дар шароити муайян чип ичрои программаи асосиро бозмедорад ва ягон вазифаи беруниро даъват мекунад. Танаффусҳо аз сабаби таъсироти беруна ё дохилӣ, аз ҷумла таймер ба амал меоянд.

Вақте ки мо бори аввал лоиҳаро дар ST Visual Develop офаридаем, ба ғайр аз main.c мо равзанаи дорои файли пурасрор гирифтем stm8_interrupt_vector.c, ба таври худкор ба лоиха дохил карда мешавад. Дар ин файл ба ҳар як қатъ функсия таъин карда мешавад NonHandledInterrupt. Мо бояд функсияи худро ба қатъи дилхоҳ банд кунем.

Варақаи маълумот ҷадвали векторҳои қатъкунӣ дорад, ки дар он мо онҳоеро, ки ба мо лозиманд, пайдо мекунем:

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8
13 Навсозии TIM2
14 TIM2 гирифтан/муқоиса кунед

Мо бояд LED-ро дар UEV тағир диҳем, аз ин рӯ ба мо №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;
}

Ҳама чизи боқимонда имкон додани халалдоршавӣ аст. Ин бо истифода аз фармони assembler анҷом дода мешавад rim - шумо бояд онро дар ҷустуҷӯ кунед Дастури барномасозӣ:

//enable interrupts
_asm("rim");

Фармони дигари ассемблер ин аст sim – танаффусҳоро хомӯш мекунад. Ҳангоми навиштани арзишҳои нав ба "хотираи видео" онҳо бояд хомӯш карда шаванд, то қатъе, ки дар лаҳзаи нодуруст ба амал омадааст, массивро вайрон накунад.

Ҳама код - дар GitHub.

Хониши варақаҳои маълумотии 2: SPI дар STM32; PWM, таймерҳо ва халалҳо дар STM8

Агар ақаллан касе ин мақоларо муфид пайдо кунад, пас ман онро беҳуда нанавиштам. Ман аз гирифтани эродҳо ва эродҳо шод хоҳам шуд, ман кӯшиш мекунам, ки ба ҳама чиз ҷавоб диҳам.

Манбаъ: will.com

Илова Эзоҳ