E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

В ʻO ka hapa mua Ua ho'āʻo wau e haʻi aku i nā ʻenekini uila hobby i ulu aʻe mai Arduino pants pehea a me ke kumu e heluhelu ai lākou i ka datasheets a me nā palapala ʻē aʻe no nā microcontrollers. Ua lilo ka kikokikona i mea nui, no laila ua hoʻohiki wau e hōʻike i nā hiʻohiʻona kūpono i kahi ʻatikala kaʻawale. ʻAe, ua kapa ʻo ia iā ia iho he halo waiū...

I kēia lā, e hōʻike wau iā ʻoe pehea e hoʻohana ai i nā ʻikepili e hoʻoponopono maʻalahi, akā pono no nā papahana he nui, nā hana ma STM32 (Blue Pill) a me nā mea hoʻokele STM8. Hoʻolaʻa ʻia nā papahana demo āpau i kaʻu mau LED punahele, e hoʻomālamalama mākou iā lākou i ka nui, no laila mākou e hoʻohana ai i nā ʻano peripheral hoihoi.

Ua lilo hou ka kikokikona i mea nui, no laila no ka maʻalahi ke hana nei au i ka ʻike:

STM32 Blue Pill: 16 mau LED me ka mea hoʻokele DM634
STM8: Hoʻonohonoho i ʻeono mau pine PWM
STM8: 8 RGB LED ma ʻekolu pine, hoʻopau

Hoʻokuʻu: ʻAʻole wau he ʻenekinia, ʻaʻole wau e hoʻohālike i ka ʻike hohonu i ka uila, ua manaʻo ʻia ka ʻatikala no nā amateurs e like me aʻu. ʻO kaʻoiaʻiʻo, ua noʻonoʻo wau iaʻu iho i ʻelua makahiki i hala ma ke ʻano he poʻe i manaʻo ʻia. Inā i haʻi mai kekahi iaʻu, ʻaʻole makaʻu ka heluhelu ʻana i nā ʻikepili ma kahi puʻupuʻu kamaʻāina, ʻaʻole wau e hoʻolilo i ka manawa nui e ʻimi ai i kekahi mau ʻāpana code ma ka Pūnaewele a me ka hana ʻana i nā koʻokoʻo me nā ʻokiʻoki a me ka lipine pipili.

ʻO ka manaʻo nui o kēia ʻatikala ma nā ʻikepili, ʻaʻole nā ​​papahana, no laila ʻaʻole maʻemaʻe loa ke code a ʻokiʻoki pinepine. He maʻalahi loa nā papahana ponoʻī, ʻoiai he kūpono no ka ʻike mua me ka chip hou.

Manaʻo wau e kōkua kaʻu ʻatikala i kekahi ma kahi ʻano like o ka luʻu ʻana i ka leʻaleʻa.

STM32

16 mau LED me DM634 a me SPI

He papahana liʻiliʻi e hoʻohana ana i ka Blue Pill (STM32F103C8T6) a me ka mea hoʻokele LED DM634. Ke hoʻohana nei i nā ʻikepili, e ʻike mākou i ka mea hoʻokele, nā awa STM IO a hoʻonohonoho i ka SPI.

DM634

ʻO ka chip Taiwanese me 16 16-bit PWM outputs, hiki ke hoʻopili ʻia i nā kaulahao. ʻIke ʻia ke ʻano haʻahaʻa haʻahaʻa 12-bit mai kahi papahana home Puke kukui. I ka manawa hoʻokahi, ke koho nei ma waena o ka DM63x a me ka TLC5940 kaulana, ua koho wau iā DM no nā kumu he nui: 1) He hoʻopunipuni maoli ʻo TLC ma Aliexpress, akā ʻaʻole kēia; 2) Loaʻa iā DM kahi PWM kūʻokoʻa me kāna mīkini hana alapine; 3) hiki ke kūʻai maʻalahi ʻia ma Moscow, ma mua o ke kali ʻana i kahi ʻāpana mai Ali. A, ʻoiaʻiʻo, he mea hoihoi ia e aʻo pehea e hoʻomalu ai i ka chip iā ʻoe iho, ma mua o ka hoʻohana ʻana i kahi hale waihona puke i mākaukau. Hōʻike nui ʻia nā chips i ka pūʻolo SSOP24; maʻalahi lākou e kūʻai aku i kahi adapter.

No ka mea he Taiwanese ka mea hana, ʻikepili ua kākau ʻia ka chip ma ka ʻōlelo Pelekania Pākē, ʻo ia hoʻi e leʻaleʻa. E nānā mua mākou i ka pinout (Hoʻohui Pin) e hoʻomaopopo i ka wāwae hea e hoʻopili ai i ka mea, a me ka wehewehe ʻana o nā pine (Hōʻike Pin). 16 pine:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Nā Puna Waiwai DC

Eʻike / Hoʻopuka hoʻoheheʻe wehe - hoʻokahe; kumu o ke au e kahe ana; ua hoʻopili ʻia ka mea hoʻopuka i ka ʻāina i ke kūlana hana - ua pili nā LED i ka mea hoʻokele e nā cathodes. Ma ka uila, ʻoiaʻiʻo, ʻaʻole kēia he "wai hāmama" (ʻauwai hāmama), akā i loko o nā ʻikepili i loaʻa pinepine ʻia kēia inoa no nā pine i ke ʻano wai.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Nā pale kūwaho ma waena o REXT a me GND e hoʻonohonoho i ka waiwai o kēia manawa

Hoʻokomo ʻia kahi mea pale kuhikuhi ma waena o ka pine REXT a me ka lepo, nāna e hoʻomalu i ke kūpaʻa kūloko o nā huahana, e ʻike i ka pakuhi ma ka ʻaoʻao 9 o ka ʻikepili. I loko o ka DM634, hiki ke hoʻomalu ʻia kēia kūpaʻa e ka lako polokalamu, e hoʻonohonoho ana i ka mālamalama holoʻokoʻa (ʻōlinolino honua); ʻAʻole wau e hele i nā kikoʻī ma kēia ʻatikala, e kau wale wau i kahi pale 2.2 - 3 kOhm ma aneʻi.

No ka hoʻomaopopo ʻana i ke ʻano o ka hoʻomalu ʻana i ka chip, e nānā kākou i ka wehewehe ʻana o ke kikowaena hāmeʻa:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

ʻAe, eia ka Pākē Pelekane i kona nani. He pilikia ka unuhi ʻana i kēia, hiki iā ʻoe ke hoʻomaopopo inā makemake ʻoe, akā aia kekahi ala ʻē aʻe - e nānā i ke ʻano o ka pili ʻana i ka TLC5940 e like me ka functionally i wehewehe ʻia i ka datasheet.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
... ʻEkolu mau pine wale nō e pono e hoʻokomo i ka ʻikepili i loko o ka mea hana. Hoʻololi ka ʻaoʻao piʻi o ka hōʻailona SCLK i ka ʻikepili mai ka pine SIN i ka papa inoa o loko. Ma hope o ka hoʻouka ʻia ʻana o nā ʻikepili a pau, hoʻopaʻa ka hōʻailona XLAT kiʻekiʻe pōkole i ka ʻikepili i hoʻoili ʻia i loko o nā papa inoa o loko. ʻO nā mea hoʻopaʻa inoa kūloko he mau puka i hoʻoulu ʻia e ka pae hōʻailona XLAT. Hoʻouna mua ʻia nā ʻikepili āpau i ka mea nui loa.

Latch – laka/laki/paʻa.
Piʻi kiʻekiʻe - ka ʻaoʻao alakaʻi o ka pulse
MSB mua – ka mea nui loa (hema loa) iki i mua.
i ka ikepili uaki - hoʻouna i ka ʻikepili ma ke kaʻina (bit by bit).

ʻO ka hua'ōlelo wahī loaʻa pinepine ʻia i ka palapala no nā chips a unuhi ʻia ma nā ʻano like ʻole, no laila no ka hoʻomaopopo ʻana e ʻae wau iaʻu iho.

he papahana hoʻonaʻauao liʻiliʻiʻO ka mea hoʻokele LED he mea hoʻopaʻa inoa hoʻololi. "Hoʻololi" (naeaeaa) ma ka inoa - ka neʻe ʻana o ka ʻikepili i loko o ka hāmeʻa: ʻo kēlā me kēia bit hou i hoʻokuʻu ʻia i loko e pana i ke kaulahao holoʻokoʻa i mua. No ka mea ʻaʻohe mea makemake e ʻike i ka uila ʻana o nā LED i ka wā o ka neʻe ʻana, e hana ʻia ke kaʻina hana ma nā papa inoa buffer i hoʻokaʻawale ʻia mai nā papa inoa hana e kahi damper (wahī) he ʻano lumi kali kahi i hoʻonohonoho ʻia ai nā bits ma ke kaʻina makemake. Ke mākaukau nā mea a pau, wehe ka pani a hele nā ​​bits e hana, e hoʻololi i ka hui mua. ʻŌlelo wahī i loko o ka palapala no nā microcircuits kokoke i kēlā me kēia damper, ʻaʻohe mea i nā hui e hoʻohana ʻia.

No laila, lawe ʻia ka hoʻoili ʻikepili i ka DM634 e like me kēia: hoʻonohonoho i ka hoʻokomo DAI i ka waiwai o ka mea nui loa o ka LED mamao, huki DCK i luna a i lalo; hoʻonoho i ka hoʻokomo DAI i ka waiwai o ka bit aʻe, huki DCK; a pēlā aku a hiki i ka hoʻouna ʻia ʻana o nā bits a pau (uaki), a laila huki mākou iā LAT. Hiki ke hana me ka lima (bit-bang), akā ʻoi aku ka maikaʻi o ka hoʻohana ʻana i kahi interface SPI i hoʻonohonoho pono ʻia no kēia, ʻoiai ua hōʻike ʻia ma kā mākou STM32 i ʻelua kope.

Pill Blue STM32F103

Hoʻomaka: ʻOi aku ka paʻakikī o nā mea hoʻokele STM32 ma mua o Atmega328 ma mua o ka mea weliweli. Eia kekahi, no nā kumu o ka mālama ʻana i ka ikehu, kokoke pau nā peripheral i ka hoʻomaka ʻana, a ʻo ke alapine o ka uaki ʻo 8 MHz mai ke kumu kūloko. ʻO ka mea pōmaikaʻi, ua kākau nā mea polokalamu STM i nā code e lawe ana i ka chip i ka "heluhelu" 72 MHz, a ʻo nā mea kākau o nā IDE āpau aʻu i ʻike ai ua hoʻokomo i loko o ke kaʻina hana hoʻomaka, no laila ʻaʻole pono mākou i ka uaki (akā. hiki iā ʻoe inā makemake ʻoe). Akā, pono ʻoe e hoʻohuli i nā peripheral.

Palapala: Ua lako ʻia ʻo Blue Pill me ka chip STM32F103C8T6 kaulana, aia ʻelua mau palapala pono no ia:

Ma ka ʻikepili e makemake paha mākou i:

  • Pinouts - chip pinouts - inā mākou e hoʻoholo e hana i nā papa iā mākou iho;
  • Palapala Hoʻomanaʻo - palapala hoʻomanaʻo no kahi pahu kikoʻī. He palapala ʻāina ko ka Reference Manual no ka laina holoʻokoʻa, a ʻōlelo ʻia nā papa inoa i loaʻa ʻole iā mākou.
  • Papa kuhikuhi Pin - papa inoa i nā hana nui a me nā hana ʻē aʻe o nā pine; no ka "blue pill" hiki iā ʻoe ke ʻike i nā kiʻi maʻalahi ma ka Pūnaewele me kahi papa inoa o nā pine a me kā lākou mau hana. No laila, e hoʻopaʻa koke mākou i ka Google Blue Pill pinout a mālama i kēia kiʻi ma ka lima:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
NB: aia kahi hewa i ke kiʻi mai ka Pūnaewele, i ʻike ʻia ma nā ʻōlelo, mahalo no kēlā. Ua hoʻololi ʻia ke kiʻi, akā he haʻawina kēia - ʻoi aku ka maikaʻi o ka nānā ʻana i ka ʻike ʻaʻole mai ka ʻikepili.

Wehe mākou i ka datasheet, wehe i ka Reference Manual, a mai kēia manawa mākou e hoʻohana wale ai.
Kaʻina hana: hana mākou me ka hoʻokomo / puka maʻamau, hoʻonohonoho i ka SPI, hoʻohuli i nā peripheral pono.

Huakomo Hookomo

Ma ka Atmega328, hoʻokō ʻia ʻo I/O maʻalahi loa, ʻo ia ke kumu e huikau ai ka nui o nā koho STM32. I kēia manawa pono mākou i nā hopena, akā ʻehā mau koho:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
hoʻoheheʻe hāmama, huki-huki, pahu-huki ʻē aʻe, ʻauwai hāmama

"Huki-paʻi" (kuʻi-huki) ʻo ia ka puka maʻamau mai ka Arduino, hiki i ka pine ke lawe i ka waiwai ma HIGH a i ʻole LOW. Akā me ka "auwai hāmama" aia pilikia, ʻoiai he mea maʻalahi nā mea a pau ma aneʻi:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Hoʻonohonoho hoʻopuka / ke hāʻawi ʻia ke awa i ka hoʻopuka: / hoʻohana ʻia ka pahu hoʻopuka: / – ke ʻano hoʻokahe wehe: "0" i ka papa inoa hoʻopuka e hiki ai iā N-MOS, "1" ma ka papa inoa hoʻopuka e haʻalele i ke awa ma ke ʻano Hi-Z ( ʻAʻole i hoʻāla ʻia ʻo P-MOS ) / - ke ʻano pana-huki: "0" ma ka papa inoa hoʻopuka e hoʻāla iā N-MOS, "1" ma ka papa inoa puka e hoʻāla ai i ka P-MOS.

ʻO ka ʻokoʻa a pau ma waena o ka wai hāmama (ʻauwai hāmama) mai “push-pull” (kuʻi-huki) ʻo ia ma ka pine mua ʻaʻole hiki ke ʻae i ka mokuʻāina HIGH: i ka wā e kākau ai i kekahi i ka papa inoa hoʻopuka, hele ia i ke ʻano kūʻē kiʻekiʻe (kiʻekiʻe impedance, Hi-Z). Ke kākau ʻana i ka zero, ʻano like ke ʻano o ka pine ma nā ʻano ʻelua, ma ke ʻano loiloi a me ka uila.

Ma ke ʻano hoʻopuka maʻamau, hoʻolaha wale ka pine i nā mea o ka papa inoa hoʻopuka. Ma ka "ʻokoʻa" e hoʻomaluʻia e nā peripherals pili (e nānā i ka 9.1.4):

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Inā hoʻonohonoho ʻia kahi bit port ma ke ʻano he pine hana ʻē aʻe, ua pio ka papa inoa pine a pili ka pine i ka pine peripheral.

Ua wehewehe ʻia nā hana ʻokoʻa o kēlā me kēia pine ma Nā Wehewehe Pin Aia ka ʻikepili ma ke kiʻi i hoʻoiho ʻia. I ka nīnau o ka mea e hana ai inā he mau hana ʻē aʻe ka pine, hāʻawi ʻia ka pane e kahi footnote ma ka datasheet:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Inā hoʻohana nā peripheral he nui i ka pine hoʻokahi, e pale i ka paio ma waena o nā hana ʻē aʻe, pono e hoʻohana ʻia hoʻokahi peripheral i ka manawa, e hoʻohana ʻia me ka hoʻohana ʻana i ka uaki hiki i ka bit (ma ka papa inoa RCC kūpono).

ʻO ka hope loa, loaʻa i nā pine i ke ʻano hoʻopuka ka wikiwiki o ka uaki. ʻO kēia kekahi hiʻohiʻona hoʻopakele ikehu; i kā mākou hihia, hoʻonoho mākou iā ia i ka palena kiʻekiʻe a poina iā ia.

No laila: ke hoʻohana nei mākou i ka SPI, ʻo ia hoʻi, ʻelua mau pine (me ka ʻikepili a me ka hōʻailona uaki) ʻo ia ka "hana pana-huki ʻokoʻa", a ʻo kekahi (LAT) ʻo ia ka "pull-pull maʻamau". Akā ma mua o ka hāʻawi ʻana iā lākou, e kamaʻilio me SPI.

SPI

ʻO kekahi papahana hoʻonaʻauao liʻiliʻi

ʻO SPI a i ʻole Serial Peripheral Interface (serial peripheral interface) he mea maʻalahi a maikaʻi loa no ka hoʻopili ʻana i kahi MK me nā MKs ʻē aʻe a me ka honua waho ma ka laulā. Ua wehewehe mua ʻia ke kumu o kāna hana ma luna, kahi e pili ana i ka mea hoʻokele LED Kina (i ka puke kuhikuhi, ʻike i ka pauku 25). Hiki iā SPI ke hana ma ke ʻano master ("master") a me ke kauā ("slave") mode. Loaʻa iā SPI nā ala kumu ʻehā, ʻaʻole hiki ke hoʻohana ʻia nā mea a pau:

  • MOSI, Master Output / Slave Input: hoʻouna kēia pine i ka ʻikepili ma ke ʻano master, a loaʻa ka ʻikepili ma ke ʻano kauā;
  • MISO, Master Input / Slave Output: akā, loaʻa i ka haku, a hoʻouna i ke kauā;
  • SCK, Serial Clock: hoʻonohonoho i ke alapine o ka hoʻouna ʻana i ka ʻikepili i ka haku a i ʻole e loaʻa i kahi hōʻailona uaki ma ke kauā. ʻO ke kī nui ʻana i nā kuʻi;
  • SS, Slave Select: me ke kōkua o kēia kahawai, ʻike ke kauā e makemake ʻia ana kekahi mea iā ia. Ma STM32 ua kapa ʻia ʻo ia ʻo NSS, kahi N = maikaʻi ʻole, i.e. lilo ka mea hoʻoponopono i kauā inā he lepo i loko o kēia kahawai. Ua hui maikaʻi me ke ʻano Open Drain Output, akā he moʻolelo ʻē aʻe kēlā.

E like me nā mea ʻē aʻe, ʻo SPI ma STM32 ka waiwai i ka hana, kahi mea paʻakikī ke hoʻomaopopo. No ka laʻana, hiki iā ia ke hana ʻaʻole wale me SPI, akā me kahi interface I2S, a i loko o ka palapala i hui pū ʻia kā lākou wehewehe ʻana, pono e ʻoki i ka keu i ka manawa kūpono. Maʻalahi loa kā mākou hana: pono mākou e hoʻouna i ka ʻikepili me ka MOSI a me SCK wale nō. Hele mākou i ka pauku 25.3.4 (half-duplex communication, half-duplex communication), kahi a mākou e ʻike ai. 1 uaki a me 1 uea ikepili unidirectional (1 hōʻailona uaki a me 1 kahawai ʻikepili unidirectional):

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Ma kēia ʻano, hoʻohana ka noi iā SPI ma ke ʻano hoʻouna wale a loaʻa wale nō. ʻO ke ʻano hoʻouna wale nō e like me ke ʻano duplex: lawe ʻia ka ʻikepili ma ka pine transmit (MOSI ma ke ʻano master a i ʻole MISO ma ke ʻano kauā), a hiki ke hoʻohana ʻia ka pine loaʻa (MISO a i ʻole MOSI) ma ke ʻano he pine I/O maʻamau. . I kēia hihia, pono wale ka noi e haʻalele i ka Rx buffer (inā heluhelu ʻia, ʻaʻohe ʻikepili i hoʻoili ʻia ma laila).

Nui, manuahi ka pine MISO, e hoʻohui i ka hōʻailona LAT iā ia. E nānā iā Slave Select, ma ka STM32 hiki ke hoʻomalu ʻia me ka programmatically, he mea maʻalahi loa ia. Heluhelu mākou i ka paukū o ka inoa like ma ka pauku 25.3.1 SPI Hōʻike Nui:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
ʻO ka mana polokalamu NSS (SSM = 1) / Aia ka ʻike koho Slave ma ka bit SSI o ka papa inoa SPI_CR1. Noho manuahi ka pine NSS waho no nā pono noi ʻē aʻe.

ʻO ka manawa kēia e kākau ai i nā papa inoa. Ua hoʻoholo wau e hoʻohana i ka SPI2, e ʻimi i kāna helu kumu ma ka ʻikepili - ma ka ʻāpana 3.3 Memory Map:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

ʻAe, e hoʻomaka kākou:

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

E wehe i ka pauku 25.3.3 me ke poʻo inoa wehewehe ponoʻī "Ka hoʻonohonoho ʻana i ka SPI ma ke ʻano Master":

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

1. E hoʻonohonoho i ke alapine o ka uaki me nā bit BR[2:0] ma ka papa inoa SPI_CR1.

ʻOhi ʻia nā papa inoa ma ka ʻāpana manual reference o ka inoa like. Hoʻololi ʻōlelo (Hoʻopau helu wahi) no CR1 - 0x00, ma ka paʻamau, ua holoi ʻia nā ʻāpana āpau (Hoʻihoʻi i ka waiwai 0x0000):

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

Hoʻonohonoho nā ʻāpana BR i ka mea hoʻokaʻawale uaki, no laila e hoʻoholo ai i ke alapine e hana ai ka SPI. ʻO kā mākou STM32 alapine he 72 MHz, ʻo ka mea hoʻokele LED, e like me kāna ʻikepili, e hana me ka alapine a hiki i 25 MHz, no laila pono mākou e puʻunaue i ʻehā (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. E hoʻonoho i nā ʻāpana CPOL a me CPHA e wehewehe i ka pilina ma waena o ka hoʻoili ʻana i ka ʻikepili a me ka manawa o ka uaki serial (e nānā i ke kiʻikuhi ma ka ʻaoʻao 240)

No ka mea ke heluhelu nei mākou i ka ʻikepili ma aneʻi a ʻaʻole e nānā i nā schematics, e nānā pono i ka wehewehe kikokikona o nā CPOL a me CPHA bits ma ka ʻaoʻao 704 (SPI General Description):

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Māhele uaki a me ka polarity
Me ka hoʻohana ʻana i nā ʻāpana CPOL a me CPHA o ka papa inoa SPI_CR1, hiki iā ʻoe ke koho papahana i nā pilina manawa ʻehā. Mālama ka bit CPOL (clock polarity) i ke kūlana o ka hōʻailona uaki ke hoʻouna ʻole ʻia ka ʻikepili. Mālama kēia bit i nā ʻano haku a me ke kauā. Inā hoʻihoʻi hou ʻia ka CPOL, haʻahaʻa ka pine SCK ma ke ʻano hoʻomaha. Inā hoʻonoho ʻia ka bit CPOL, kiʻekiʻe ka pine SCK i ka wā hoʻomaha.
Ke hoʻonohonoho ʻia ka bit CPHA (phase clock), ʻo ka strobe bit trap kiʻekiʻe ka ʻaoʻao ʻelua o ka hōʻailona SCK (e hāʻule inā maopopo ka CPOL, e piʻi ana inā hoʻonohonoho ʻia ʻo CPOL). Lawe ʻia ka ʻikepili e ka hoʻololi ʻelua i ka hōʻailona uaki. Inā maopopo ka bit CPHA, ʻo ka strobe bit kiʻekiʻe ka ʻaoʻao piʻi o ka hōʻailona SCK (ke kihi hāʻule inā hoʻonohonoho ʻia ʻo CPOL, ka ʻaoʻao piʻi inā hoʻomaʻemaʻe ʻia ka CPOL). Lawe ʻia ka ʻikepili i ka hoʻololi mua ʻana i ka hōʻailona uaki.

I ka loaʻa ʻana o kēia ʻike, hiki mākou i ka hopena e noho mau nā ʻāpana ʻelua i nā zeros, no ka mea Makemake mākou e noho haʻahaʻa ka hōʻailona SCK ke hoʻohana ʻole ʻia, a e hoʻouna ʻia ka ʻikepili ma ka ʻaoʻao piʻi o ka pulse (e nānā i ka Fig. Kūlana Kūlana i ka ʻikepili DM634).

Ma ke ala, eia mākou i ʻike mua i kahi hiʻohiʻona o ka huaʻōlelo i nā datasheets ST: i loko o lākou ka huaʻōlelo "reset the bit to zero" i kākau ʻia. e hoʻihoʻi iki,ʻaʻole e hoʻomaʻemaʻe iki, like, no ka laʻana, Atmega.

3. E hoʻonoho i ka bit DFF e hoʻoholo inā he 8-bit a i ʻole 16-bit ka pahu ʻikepili

Ua lawe au i kahi 16-bit DM634 i ʻole e pilikia i ka hoʻouna ʻana i ka ʻikepili 12-bit PWM, e like me ka DM633. He mea kūpono ke hoʻonohonoho i ka DFF i hoʻokahi:

#define DFF         0x0800

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

4. E hoʻonohonoho i ka bit LSBFIRST ma ka papa inoa SPI_CR1 no ka hoʻoholo ʻana i ke ʻano poloka

ʻO LSBFIRST, e like me kona inoa e hōʻike nei, hoʻonohonoho i ka hoʻouna me ka mea liʻiliʻi loa ma mua. Akā makemake ʻo DM634 e loaʻa ka ʻikepili mai ka mea nui loa. No laila, waiho mākou iā ia e hoʻonohonoho hou.

5. Ma ke ʻano hāmeʻa, inā makemake ʻia ka hoʻokomo ʻana mai ka pine NSS, e hoʻopili i kahi hōʻailona kiʻekiʻe i ka pine NSS i ka wā o ke kaʻina hoʻoili byte holoʻokoʻa. Ma ke ʻano polokalamu polokalamu NSS, e hoʻonoho i nā ʻāpana SSM a me SSI ma ka papa inoa SPI_CR1. Inā hoʻohana ʻia ka pine NSS ma ke ʻano he mea hoʻopuka, pono e hoʻonohonoho i ka bit SSOE wale nō.

E hoʻouka iā SSM a me SSI e poina i ke ʻano hāmeʻa NSS:

#define SSI         0x0100
#define SSM         0x0200

_SPI2_ (_SPI_CR1) |= SSM | SSI; //enable software control of SS, SS high

6. Pono e ho'onohonoho 'ia nā bits MSTR a me SPE (e ho'onoho 'ia inā ki'eki'e ka hō'ailona NSS)

ʻOiaʻiʻo, me kēia mau bits mākou e koho i kā mākou SPI ma ke ʻano he haku a hoʻohuli iā ia:

#define MSTR        0x0004
#define SPE         0x0040

_SPI2_ (_SPI_CR1) |= MSTR; //SPI master
//когда все готово, включаем SPI
_SPI2_ (_SPI_CR1) |= SPE;

Hoʻonohonoho ʻia ʻo SPI, e kākau koke i nā hana e hoʻouna i nā bytes i ka mea hoʻokele. E hoʻomau i ka heluhelu 25.3.3 "Ka hoʻonohonoho ʻana i ka SPI ma ke ʻano master":

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Kauoha hoʻoili ʻikepili
Hoʻomaka ka hoʻouna ʻana ke kākau ʻia kahi byte i ka Tx buffer.
Hoʻokomo ʻia ka byte ʻikepili i ka papa inoa hoʻololi ma kaulike mode (mai ke kaʻa i loko) i ka wā o ka lawe ʻana i ka bit mua, a laila hoʻouna ʻia i kaʻina hana ʻO ke ʻano pin MOSI, ka mua a i ʻole ka bit hope ma muli o ka hoʻonohonoho ʻana o ka bit LSBFIRST ma ka papa inoa CPI_CR1. Hoʻonohonoho ʻia ka hae TXE ma hope o ka lawe ʻana i ka ʻikepili mai Tx buffer e hoʻololi i ka papa inoa, a hoʻopuka hoʻi i kahi keakea inā hoʻonohonoho ʻia ka bit TXEIE ma ka papa inoa CPI_CR1.

Ua hōʻike au i kekahi mau huaʻōlelo ma ka unuhi e huki i ka manaʻo i kekahi hiʻohiʻona o ka hoʻokō SPI i nā mea hoʻokele STM. Ma Atmega ka hae TXE (Tx Kaawale, ʻAʻohe o Tx a mākaukau no ka loaʻa ʻana o ka ʻikepili) ua hoʻonohonoho ʻia ma hope o ka hoʻouna ʻia ʻana o ka byte holoʻokoʻa i waho. A ma ʻaneʻi ua kau ʻia kēia hae ma hope o ka hoʻokomo ʻia ʻana o ka byte i loko o ka papa inoa hoʻololi kūloko. No ka mea ua hoʻokuʻu ʻia ma laila me nā bits a pau i ka manawa like (ma ke ʻano like), a laila hoʻouna ʻia ka ʻikepili i ka sequentially, ua hoʻonohonoho ʻia ʻo TXE ma mua o ka hoʻouna ʻia ʻana o ka byte. He mea nui kēia no ka mea i ka hihia o kā mākou alakaʻi alakaʻi LED, pono mākou e huki i ka pine LAT ma hope o ka hoʻouna ʻana o nā mea a pau ʻikepili, ʻo ia hoʻi. ʻAʻole lawa ka hae TXE wale nō iā mākou.

ʻO ia hoʻi, pono mākou i kekahi hae. E nānā kākou i ka 25.3.7 - "Hae Kūlana":

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
<…>
E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
hae PALAPALA
Hoʻonohonoho ʻia ka hae BSY a hoʻomaʻemaʻe ʻia e ka ʻenehana (ʻaʻohe hopena o ke kākau ʻana iā ia). Hōʻike ka hae BSY i ke kūlana o ka papa kamaʻilio SPI.
Hoʻihoʻi hou ia:
ke hoʻopau ʻia ka hoʻoili ʻana (koe wale nō ma ke ʻano master inā hoʻomau ka hoʻololi)
ke pio ka SPI
i ka wā i loaʻa ai ka hewa kumu (MODF=1)
Inā ʻaʻole hoʻomau ka hoʻoili ʻana, holoi ʻia ka hae BSY ma waena o kēlā me kēia hoʻoili ʻikepili

ʻAe, hiki mai kēia. E ʻike kākou i kahi o ka Tx buffer. No ka hana ʻana i kēia, heluhelu i ka "SPI Data Register":

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Bits 15:0 DR[15:0] Kakau ʻikepili
ʻIke i loaʻa a i ʻole ʻikepili e hoʻouna ʻia.
Ua māhele ʻia ka papa inoa ʻikepili i ʻelua mau pale - hoʻokahi no ke kākau ʻana (transmit buffer) a hoʻokahi no ka heluhelu ʻana (loaʻa i ka buffer). ʻO ke kākau ʻana i ka papa inoa ʻikepili e kākau i ka Tx buffer, a ʻo ka heluhelu ʻana mai ka papa inoa ʻikepili e hoʻihoʻi i ka waiwai i loko o ka buffer Rx.

ʻAe, a me ke kūlana kūlana, kahi i loaʻa ai nā hae TXE a me BSY:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

Kākau mākou:

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

ʻAe, no ka mea pono mākou e hoʻouna i 16 mau manawa ʻelua bytes, e like me ka helu o nā mea hoʻokele LED, e like me kēia:

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();
}

Akā ʻaʻole maopopo iā mākou pehea e huki ai i ka pine LAT, no laila e hoʻi mākou i I/O.

Hāʻawi i nā pine

Ma ka STM32F1, ʻokoʻa nā mea kākau inoa no ke kūlana o nā pine. ʻIke ʻia he ʻoi aku ka nui o lākou ma mua o Atmega, akā ʻokoʻa nō hoʻi lākou mai nā chip STM ʻē aʻe. Pauku 9.1 Ka wehewehe nui o GPIO:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
ʻO kēlā me kēia o nā awa I/O kumu nui (GPIO) Loaʻa iā ia ʻelua mau papa inoa hoʻonohonoho 32-bit (GPIOx_CRL a me GPIOx_CRH), ʻelua papa inoa ʻikepili 32-bit (GPIOx_IDR a me GPIOx_ODR), kahi 32-bit set / reset register (GPIOx_BSRR), kahi 16-bit reset register (GPIOx_BRR) a me 32- papa inoa hoʻopaʻa ʻia (GPIOx_LCKR).

ʻO nā papa inoa mua ʻelua he mea maʻamau, a he mea maʻalahi hoʻi, no ka mea, ua hoʻopuehu ʻia nā pin port 16 ma o lākou ma kahi ʻano "ʻehā bits per brother". ʻO kēlā mau. Aia nā pine ʻaʻohe a ʻehiku ma CRL, a ʻo ke koena ma CRH. I ka manawa like, loaʻa i nā papa inoa i koe nā ʻāpana o nā pine āpau o ke awa - e waiho pinepine ʻia ka hapalua "i mālama ʻia".

No ka maʻalahi, e hoʻomaka kākou mai ka hopena o ka papa inoa.

ʻAʻole pono mākou i kahi papa inoa paʻa.

He mea ʻakaʻaka ka hoʻonohonoho a me ka hoʻopaʻa ʻana i nā papa inoa no ka mea e hoʻokaʻawale lākou i kekahi i kekahi: hiki iā ʻoe ke kākau i nā mea āpau ma BSRR wale nō, kahi e hoʻihoʻi ai nā 16 bits kiʻekiʻe i ka pine i ka zero, a e hoʻonoho ʻia nā mea haʻahaʻa i ka 1, a i ʻole hiki iā ʻoe. E hoʻohana i ka BRR, ʻo ka haʻahaʻa 16 bits e hoʻonohonoho hou i ka pine. Makemake au i ka koho lua. He mea koʻikoʻi kēia mau papa inoa no ka mea hāʻawi lākou i ke komo atomic i nā pine:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Hoʻonohonoho ʻAtoma a hoʻonohonoho hou
ʻAʻohe pono e hoʻopau i nā keakea i ka wā e hoʻonohonoho ai i ka GPIOx_ODR ma ka pae bit: hiki ke hoʻololi ʻia hoʻokahi a ʻoi aku paha me kahi hana kākau atomika hoʻokahi APB2. Hoʻokō ʻia kēia ma ke kākau ʻana i kahi "1" i ka papa inoa hoʻonohonoho/reset (GPIOx_BSRR a i ʻole, no ka hoʻihoʻi wale ʻana, GPIOx_BRR) o ka bit e pono ke hoʻololi. E hoʻololi ʻole ʻia nā ʻāpana ʻē aʻe.

Loaʻa i nā papa inoa ʻikepili nā inoa wehewehe ponoʻī - IDR = hoʻokomo o Papa kuhikuhi kuhikuhi, kakau kakau; ODR = ia auoiaea Papa kuhikuhi kuhikuhi, papa inoa puka. ʻAʻole pono mākou iā lākou i ka papahana o kēia manawa.

A ʻo ka hope, nā papa inoa hoʻomalu. No ka mea makemake mākou i nā pine SPI ʻelua, ʻo ia hoʻi PB13, PB14 a me PB15, nānā koke mākou iā CRH:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

A ʻike mākou pono mākou e kākau i kahi mea ma nā bits mai 20 a 31.

Ua noʻonoʻo mua mākou i ka mea a mākou e makemake ai mai nā pine, no laila e hana wau me ka ʻole o ke kiʻi kiʻi, e ʻōlelo wale wau ua kuhikuhi ʻo MODE i ke kuhikuhi (input inā hoʻonohonoho ʻia nā bits ʻelua i 0) a me ka wikiwiki pin (pono mākou i 50MHz, ʻo ia. ʻelua pine i "1"), a hoʻonohonoho ʻo CNF i ke ʻano: "push-pull" maʻamau - 00, "alternative" - ​​10. ʻO ka mea maʻamau, e like me kā mākou e ʻike ai ma luna, loaʻa i nā pine āpau ke kolu o ka bit mai lalo (CNF0), hoonoho ia lakou i ke ano hoʻokomo lana.

No koʻu hoʻolālā ʻana e hana i kekahi mea ʻē aʻe me kēia puʻupuʻu, no ka maʻalahi, ua wehewehe au i nā koina MODE a me CNF no nā papa inoa haʻahaʻa a me luna.

Me kēia ʻano

#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

Aia kā mākou mau pine ma ke awa B (kahi helu kumu - 0x40010C00), code:

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

A, no laila, hiki iā ʻoe ke kākau i nā wehewehe no LAT, e hoʻopili ʻia e nā papa inoa BRR a me 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 ma ka inertia wale nō, pēlā mau, e noho mau)

I kēia manawa ua maikaʻi nā mea a pau, akā ʻaʻole hana. No ka mea ʻo STM32 kēia, mālama lākou i ka uila, ʻo ia ka mea e pono ai ʻoe e hoʻokaʻawale i nā peripherals i koi ʻia.

E ho'ā i ka uka

ʻO ka wati, ʻike ʻia hoʻi ʻo Clock, ke kuleana o ka wati. A ua hiki iā mākou ke ʻike i ka pōkole RCC. Nānā mākou iā ia i loko o ka palapala: ʻo ia ka Reset a me ka Mana Mana.

E like me ka mea i ʻōlelo ʻia ma luna, ʻoi aku ka maikaʻi, ʻo ka mea paʻakikī loa o ke kumuhana uʻi i hana ʻia no mākou e nā poʻe mai STM, no laila mākou e mahalo nui ai iā lākou (e hāʻawi hou wau i kahi loulou i ʻO ka pūnaewele puni honua o Di Halt, e maopopo ai ke ano huikau o ia mea). Pono mākou i nā papa inoa kuleana no ka ʻae ʻana i ka wati peripheral (Peripheral Clock Enable Registers). ʻO ka mua, e ʻimi kākou i ka helu kumu o ka RCC, aia ma ka hoʻomaka ʻana o ka "Memory Map":

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

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

A laila kaomi i ka loulou kahi e ho'āʻo ai ʻoe e ʻimi i kahi mea i loko o ka pā, a i ʻole, ʻoi aku ka maikaʻi, e hele i nā wehewehe o nā papa inoa hiki mai nā ʻāpana e pili ana. hiki ke hoʻopaʻa inoa. Ma hea mākou e ʻike ai iā RCC_APB1ENR a me RCC_APB2ENR:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

A no laila, loaʻa iā lākou nā bits e pili ana i ka uka o SPI2, IOPB (I/O Port B) a me nā hana ʻē aʻe (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;

Hiki ke loaʻa ka code hope maanei.

Inā loaʻa iā ʻoe ka manawa a makemake e hoʻāʻo, a laila hoʻopili i ka DM634 e like me kēia: DAI i PB15, DCK i PB13, LAT i PB14. Hoʻohana mākou i ka mea hoʻokele mai 5 volts, mai poina e hoʻopili i nā kumu.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

STM8 PWM

PWM ma STM8

I koʻu hoʻolālā wale ʻana i kēia ʻatikala, ua hoʻoholo wau, ma ke ʻano he laʻana, e hoʻāʻo e haku i kekahi mau hana o kahi puʻupuʻu ʻike ʻole me ka hoʻohana ʻana i kahi datasheet wale nō, i ʻole au e hoʻopau i kahi mea hana kāmaʻa me nā kāmaʻa ʻole. Ua kūpono ʻo STM8 no kēia kuleana: ʻo ka mea mua, ua loaʻa iaʻu kekahi mau papa Kina me STM8S103, a ʻo ka lua, ʻaʻole ia i kaulana loa, a no laila ke hoʻowalewale ʻia e heluhelu a loaʻa i kahi hopena ma ka Pūnaewele ma luna o ka nele o kēia mau hopena.

Loaʻa i ka chip ʻikepili и palapala kuhikuhi RM0016, i ka mua aia nā pinout a hoʻopaʻa inoa i nā helu, ma ka lua - nā mea āpau. Hoʻolālā ʻia ʻo STM8 ma C i kahi IDE weliweli Hoʻomohala ST Visual.

Ka wati a me I/O

Ma ka maʻamau, hana ʻo STM8 i ke alapine o 2 MHz, pono e hoʻoponopono koke ʻia kēia.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
HSI (High Speed ​​​​Internal).
Loaʻa ka hōʻailona uaki HSI mai kahi oscillator RC 16 MHz i loko me kahi mea hoʻokaʻawale papahana (1 a 8). Ua hoʻonoho ʻia ma ka papa inoa hoʻokaʻawale uaki (CLK_CKDIVR).
Hoʻomaopopo: i ka hoʻomaka ʻana, koho ʻia kahi oscillator HSI RC me kahi mea hoʻokaʻawale o 8 ma ke kumu alakaʻi o ka hōʻailona uaki.

ʻIke mākou i ka helu helu inoa ma ka datasheet, ka wehewehe ʻana ma refman a ʻike pono e hoʻomaʻemaʻe ʻia ka papa inoa:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

No ka mea e holo ana mākou i ka PWM a hoʻohui i nā LED, e nānā kākou i ka pinout:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

He liʻiliʻi ka chip, ua hoʻokuʻu ʻia nā hana he nui ma nā pine like. ʻO ka mea i loko o nā bracket square he "hana ʻokoʻa", ua hoʻololi ʻia e "bytes koho" (koho bytes) - kekahi mea e like me Atmega fuses. Hiki iā ʻoe ke hoʻololi i kā lākou mau waiwai programmatically, akā ʻaʻole pono ia, no ka mea Hoʻohana ʻia ka hana hou ma hope o ka reboot. ʻOi aku ka maʻalahi o ka hoʻohana ʻana iā ST Visual Programmer (hoʻoiho ʻia me Visual Develop), hiki ke hoʻololi i kēia mau bytes. Hōʻike ka pinout e hūnā ʻia nā pine CH1 a me CH2 o ka manawa mua ma nā bracket square; Pono e hoʻonoho i nā bits AFR1 a me AFR0 i STVP, a e hoʻololi ka lua i ka CH1 output o ka lua o ka manawa mai PD4 a i PC5.

No laila, 6 pine e hoʻomalu i nā LED: PC6, PC7 a me PC3 no ka manawa mua, PC5, PD3 a me PA3 no ka lua.

ʻOi aku ka maʻalahi o ka hoʻonohonoho ʻana i nā pine I/O ma STM8 ma mua o STM32:

  • kamaʻāina mai ka papa kuhikuhi kuhikuhi ʻikepili ʻo Atmega DDR (Kakau inoa kuhikuhi): 1 = puka;
  • ʻO ka papa inoa mana mua CR1, i ka wā e hoʻopuka ai, hoʻonohonoho i ke ʻano huki huki (1) a i ʻole ka wai hāmama (0); no ka mea e hoʻopili wau i nā LED i ka chip me nā cathodes, waiho wau i nā zeros ma aneʻi;
  • ka lua o ka hoʻopaʻa inoa CR2, i ka wā e hoʻopuka ai, hoʻonohonoho i ka wikiwiki o ka uaki: 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

Hoʻonohonoho PWM

ʻO ka mua, e wehewehe kākou i nā huaʻōlelo:

  • PWM Frequency - ke alapine e hoʻopā ai ka manawa;
  • Hoʻouka hou ʻana, AR - ka waiwai autoloadable a hiki i ka helu ʻana o ka manawa (manawa pulse);
  • Hana Hou, UEV - kahi hanana i hiki ke helu ʻia ka manawa i AR;
  • PWM Dute Cycle - PWM duty cycle, i kapa pinepine ʻia "duty factor";
  • Hopu / Hoʻohālikelike i ka waiwai - waiwai no ka hopu ʻana/hoʻohālikelike, kahi i helu ʻia ai ka manawa e hana i kekahi mea (i ka hihia o PWM, hoʻohuli ia i ka hōʻailona puka);
  • Waiwai Preload - waiwai i hoʻouka mua ʻia. Hoʻohālikelike i ka waiwai ʻAʻole hiki ke hoʻololi i ka wā e paʻi ana ka manawa, i ʻole e haki ka pōʻai PWM. No laila, kau ʻia nā waiwai i hoʻouna ʻia i loko o kahi buffer a huki ʻia i ka wā i hiki ai ka manawa i ka hopena o kāna helu helu a hoʻonohonoho hou ʻia;
  • Hoʻopololei ʻaoʻao и Nā ʻano hoʻohālikelike waena - ka hoʻonohonoho ʻana ma ka palena a ma ke kikowaena, e like me ko Atmel ʻO PWM wikiwiki и PWM-pololei PWM.
  • OCiREF, Hōʻailona Hoʻohālikelike Hoʻohālikelike - hōʻailona hoʻopuka kuhikuhi, ʻoiaʻiʻo, ka mea i ʻike ʻia ma ka pine pili i ke ʻano PWM.

E like me ka mea i ʻike mua ʻia mai ka pinout, ʻelua mau manawa i loaʻa nā mana PWM - ka mua a me ka lua. He 16-bit nā mea ʻelua, ʻo ka mea mua he nui nā hiʻohiʻona hou (ma ke ʻano, hiki iā ia ke helu i luna a i lalo). Pono mākou e hana like, no laila ua hoʻoholo wau e hoʻomaka me ka lua o ka mea ʻilihune, i ʻole e hoʻohana i kahi mea ʻaʻole i laila. ʻO kekahi pilikia, ʻo ka wehewehe ʻana i ka hana PWM o nā manawa āpau ma ka puke kuhikuhi ma ka mokuna e pili ana i ka manawa mua (17.5.7 PWM Mode), no laila pono ʻoe e lele i hope a i waho i ka palapala i nā manawa a pau.

He mea koʻikoʻi ko PWM ma STM8 ma mua o PWM ma Atmega:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
PWM i hooponoponoia
Hoʻonohonoho moʻokāki mai lalo a luna
Hoʻoikaika ka helu ʻana i lalo inā holoi ʻia ka bit DIR ma ka papa inoa TIM_CR1
Pākuhi:
Hoʻohana ka laʻana i ke ʻano PWM mua. Ua paʻa kiʻekiʻe ka hōʻailona kuhikuhi PWM OCiREF e like me ka lōʻihi o TIM1_CNT <TIM1_CCRi. A i ʻole, pono ka pae haʻahaʻa. Inā ʻoi aku ka nui o ka waiwai hoʻohālikelike i loko o ka papa inoa TIM1_CCRi ma mua o ka waiwai autoload (TIM1_ARR register), paʻa ka hōʻailona OCiREF ma 1. Inā 0 ka waiwai hoʻohālikelike, mālama ʻia ʻo OCiREF ma ka ʻole....

STM8 manawa manawa hanana hou nānā mua hoʻohālikelike waiwai, a laila hoʻopuka wale i kahi hōʻailona kuhikuhi. Hoʻopili mua ka manawa o Atmega a laila hoʻohālikelike, e hopena compare value == 0 ʻO ka mea hoʻopuka he nila, pono e hana ʻia me kekahi ʻano (no ka laʻana, ma ka hoʻohuli ʻana i ka logic).

No laila he aha kā mākou makemake e hana: 8-bit PWM (AR == 255), e helu ana mai lalo a luna, alignment ma ka palena. No ka mea ua pili nā ʻōpuʻu kukui i ka chip e nā cathodes, pono e hoʻopuka ka PWM i 0 (LED ma) a hiki i hoʻohālikelike waiwai a 1 mahope.

Ua heluhelu mua mākou e pili ana i kekahi ʻAno PWM, no laila e ʻike mākou i ka papa inoa o ka manawa ʻelua ma ka huli ʻana i ka puke kuhikuhi no kēia ʻōlelo (18.6.8 - TIMx_CCMR1):

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
110: ʻO ke ʻano PWM mua – i ka helu ʻana mai lalo a luna, ʻeleu ke ala mua aʻo TIMx_CNT <TIMx_CCR1. A i ʻole, ʻaʻole i hana ke ala mua. [i loko o ka palapala, aia kekahi kope-paʻi hewa mai ka manawa 1] 111: ʻO ke ʻano PWM ʻelua - ke helu ʻia mai lalo a luna, ʻaʻole hana ke ala mua ʻoiai ʻo TIMx_CNT < TIMx_CCR1. A i ʻole, ʻeleu ke ala mua.

Ma muli o ka pili ʻana o nā LED i ka MK e nā cathodes, ua kūpono ke ʻano ʻelua iā mākou (ʻo ka mea mua kekahi, akā ʻaʻole mākou i ʻike i kēlā).

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Bit 3 OC1PE: Hoʻā i ka hoʻouka mua ʻana i ka pine 1
0: Ua pio ka hoʻopaʻa inoa mua ma TIMx_CCR1. Hiki iā ʻoe ke kākau iā TIMx_CCR1 i kēlā me kēia manawa. Hana koke ka waiwai hou.
1: Hoʻomaka ka hoʻopaʻa inoa mua ma TIMx_CCR1. Loaʻa nā hana heluhelu/kākau i ka papa inoa preload. Hoʻokomo ʻia ka waiwai i kau mua ʻia ʻo TIMx_CCR1 i loko o ka papa inoa malu i kēlā me kēia hanana hou.
* Nānā: No ka hana pono ʻana o ke ʻano PWM, pono e ʻae ʻia nā papa inoa preload. ʻAʻole pono kēia i ke ʻano hōʻailona hoʻokahi (ua hoʻonohonoho ʻia ka bit OPM ma ka papa inoa TIMx_CR1).

ʻAe, e hoʻā kākou i nā mea a pau e pono ai no nā kaha ʻekolu o ka manawa ʻelua:

#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);

Aia ʻo AR i ʻelua mau papa inoa ʻewalu-bit, maʻalahi nā mea āpau:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Hiki i ka lua o ka manawa ke helu mai lalo a luna, alignment ma ka palena, ʻaʻohe mea e pono ke hoʻololi. E hoʻonoho i ka mea hoʻokaʻawale alapine, no ka laʻana, i 256. No ka lua o ka manawa, ua hoʻonohonoho ʻia ka mea hoʻokaʻawale ma ka papa inoa TIM2_PSCR a he mana ʻelua:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

ʻO nā mea a pau i koe e hoʻohuli i nā hopena a me ka lua o ka manawa pono'ī. Hoʻoholo ʻia ka pilikia mua e nā papa inoa Hopu/Hoʻohālikelike Hoʻololi: aia he elua, ekolu auwai i helelei ma o laua asymmetrically. Maʻaneʻi hiki iā mākou ke aʻo e hiki ke hoʻololi i ka polarity o ka hōʻailona,ʻo ia hoʻi. ma ke kumu, ua hiki ke hoʻohana i ka PWM Mode 1. Kākau mākou:

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

A ʻo ka hope, hoʻomaka mākou i ka manawa ma ka papa inoa TIMx_CR1:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

E kākau i kahi analogue maʻalahi o AnalogWrite (), e hoʻololi i nā waiwai maoli i ka manawa no ka hoʻohālikelike. Ua kapa ʻia nā inoa inoa Hopu / Hoʻohālikelike i nā papa inoa, ʻelua o ia mau mea no kēlā me kēia kaha: ʻo ka haʻahaʻa haʻahaʻa 8 bits ma TIM2_CCRxL a me nā mea kiʻekiʻe ma TIM2_CCRxH. No ka mea ua hana mākou i kahi 8-bit PWM, ua lawa ka kākau ʻana i nā mea liʻiliʻi loa:

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

E ʻike ka mea heluhelu e pili ana iā mākou he PWM hemahema iki, ʻaʻole hiki iā mākou ke hana i ka 100% hoʻopiha (ma ke kumukūʻai kiʻekiʻe o 255, ua hoʻohuli ʻia ka hōʻailona no hoʻokahi pōʻai manawa). No nā LED, ʻaʻole ia he mea nui, a hiki i ka mea heluhelu hoʻolohe ke koho pehea e hoʻoponopono ai.

PWM ma ka lua o ka manawa hana, e neʻe kākou i ka mua.

Loaʻa i ka manawa mua nā ʻāpana like i loko o nā papa inoa like (ʻo ia wale nō ka hoʻohana ikaika ʻana o kēlā mau bits i waiho ʻia "i mālama ʻia" i ka manawa ʻelua i ka mua no nā ʻano mea holomua a pau). No laila, lawa ka loaʻa ʻana o nā helu o nā papa inoa like i ka datasheet a kope i ke code. ʻAe, e hoʻololi i ka waiwai o ka mea hoʻokaʻawale pinepine, no ka mea... makemake ka mea manawa mua e loaʻa ʻaʻole ka mana o ʻelua, akā he waiwai 16-bit pololei i loko o nā papa inoa ʻelua Prescaler Kiʻekiʻe и Low. Hana mākou i nā mea āpau a ... ʻaʻole hana ka manawa mua. He aha ka pilikia?

Hiki ke hoʻoponopono ʻia ka pilikia ma ka nānā ʻana i ka pauku holoʻokoʻa e pili ana i nā papa inoa mana o ka manawa 1, kahi mākou e ʻimi ai i ka mea i loaʻa ʻole i ka manawa lua. E loaʻa 17.7.30 Hoʻopaʻa inoa hoʻomaha (TIM1_BKR), kahi i loaʻa ai kēia wahi:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
E ho'ā i ka puka nui

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

ʻO ia wale nō ka mea i kēia manawa, ke code ma laila.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

STM8 Multiplex

Hoʻopili pinepine ma STM8

ʻO ke kolu o ka mini-project e hoʻopili i ʻewalu RGB LEDs i ka lua o ka manawa ma ke ʻano PWM a hōʻike iā lākou i nā kala like ʻole. Hoʻokumu ʻia ia i ka manaʻo o ka LED multiplexing, ʻo ia hoʻi inā ʻoe e hoʻohuli a hoʻopau i nā LED me ka wikiwiki loa, e ʻike ʻia iā mākou ke hele mau nei lākou (ka hoomau ana o ka ike, inertia o ka ʻike maka). Ua hana wau i kekahi manawa kekahi mea e like me kēia ma Arduino.

ʻO ka algorithm hana e like me kēia:

  • hoʻohui i ka anode o ka LED RGB mua;
  • e hoʻomālamalama, e hoʻouna i nā hōʻailona kūpono i nā cathodes;
  • kali a hiki i ka hopena o ka pōʻai PWM;
  • hoʻohui i ka anode o ka lua RGB LED;
  • kukui ia...

Well, etc. ʻOiaʻiʻo, no ka hana nani e pono e hoʻopili ʻia ka anode a "hoʻā ʻia" ka LED i ka manawa like. ʻAe, a kokoke paha. I kēlā me kēia hihia, pono mākou e kākau i kahi code e hoʻopuka i nā waiwai i ʻekolu mau kahawai o ka lua o ka manawa, e hoʻololi iā lākou i ka wā e hiki ai iā UEV, a ma ka manawa like e hoʻololi i ka LED RGB e hana nei i kēia manawa.

No ka mea ʻokoʻa ka hoʻololi ʻana o LED, pono mākou e hana i kahi "hoʻomanaʻo wikiō" kahi e loaʻa ai ka ʻikepili i ka mea nāna e hoʻopau. He papa maʻalahi kēia:

uint8_t colors[8][3];

I mea e hoʻololi ai i ke kala o kahi LED kikoʻī, lawa ia e kākau i nā waiwai i koi ʻia i loko o kēia ʻano. A ʻo ka mea hoʻololi ke kuleana no ka helu o ka LED hana

uint8_t cnt;

Demux

No ka multiplexing kūpono, pono mākou, he mea kupanaha, he CD74HC238 demultiplexer. Demultiplexer - he puʻupuʻu e hoʻokō i ka mea hoʻohana i ka lako <<. Ma o ʻekolu mau pine hoʻokomo (bits 0, 1 a me 2) hānai mākou iā ia i kahi helu ʻekolu-bit X, a ma ka pane ʻana e hoʻāla i ka helu puka (1<<X). Hoʻohana ʻia nā mea hoʻokomo i koe o ka chip e hoʻonui i ka hoʻolālā holoʻokoʻa. Pono mākou i kēia puʻupuʻu ʻaʻole wale e hoʻemi i ka nui o nā pine i noho ʻia o ka microcontroller, akā no ka palekana hoʻi - i ʻole e hoʻohuli hewa i nā LED ma mua o ka hiki a ʻaʻole e puhi i ka MK. Hoʻokahi peni ke kumukūʻai o ka chip a pono e mālama mau ʻia i loko o kāu keʻena lāʻau lapaʻau home.

ʻO kā mākou CD74HC238 ke kuleana no ka hāʻawi ʻana i ka uila i ka anode o ka LED makemake. I loko o kahi multiplex piha, e hāʻawi ia i ka volta i ke kolamu ma o ka P-MOSFET, akā i kēia demo hiki ke kūpono, no ka mea huki ia 20 mA, e like me nā helu kiʻekiʻe loa i ka ʻikepili. Mai Pepa ʻikepili CD74HC238 pono mākou i nā pinout a me kēia pepa hoʻopunipuni:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
H = pae uila kiʻekiʻe, L = pae uila haʻahaʻa, X – ʻaʻole mālama

Hoʻohui mākou iā E2 a me E1 i ka honua, E3, A0, A1 a me A3 i nā pine PD5, PC3, PC4 a me PC5 o STM8. No ka mea aia ka papa ma luna o nā pae haʻahaʻa a me nā pae kiʻekiʻe, hoʻonohonoho mākou i kēia mau pine e like me nā pine push-pull.

PWM

Hoʻonohonoho ʻia ʻo PWM ma ka lua o ka manawa e like me ka moʻolelo ma mua, me ʻelua ʻokoʻa:

ʻO ka mea mua, pono mākou e hoʻopau i ka interrupt Hana Hou (UEV) ka mea e kāhea i kahi hana e hoʻohuli i ka LED hana. Hana ʻia kēia ma ka hoʻololi ʻana i ka bit Hoʻohou Interrupt Enable i loko o kahi papa inoa me ka inoa haʻi

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
Hiki ke hoʻopaʻa inoa

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

ʻO ka ʻokoʻa ʻelua e pili ana i ke ʻano o ka multiplexing, e like me hūlū - ʻālohilohi parasitic o nā diodes. I kā mākou hihia, hiki ke ʻike ʻia ma muli o ka hoʻomaka ʻana o ka manawa, ke hoʻomau nei i ka UEV, a ʻaʻohe manawa e hoʻololi i ka LED ma mua o ka hoʻomaka ʻana o ka manawa e kākau i kekahi mea i nā pine. No ka pale ʻana i kēia, pono ʻoe e hoʻohuli i ka loina (0 = ʻoi loa ka ʻōlinolino, 255 = ʻaʻohe mea i hoʻomālamalama ʻia) a pale i nā waiwai pōʻaiapili hana. ʻO kēlā mau mea. e hōʻoia ma hope o ka UEV e hele loa nā LED no hoʻokahi pōʻai PWM.

Ke hoʻololi nei i ka polarity:

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

Hōʻalo i ka hoʻonohonoho ʻana i ka r, g a me b i 255 a e hoʻomanaʻo e hoʻohuli iā lākou i ka wā e hoʻohana ai.

Hoʻopiʻi

ʻO ke kumu o ka interrupt, ʻo ia ma lalo o kekahi mau kūlana, hoʻōki ka chip i ka hoʻokō ʻana i ka papahana nui a kāhea i kekahi hana o waho. Loaʻa nā pilikia ma muli o nā mana o waho a i ʻole i loko, me ka manawa.

I ka wā i hana mua ai mākou i kahi papahana ma ST Visual Develop, ma kahi o main.c ua loaʻa iā mākou kahi puka makani me kahi faila pohihihi stm8_interrupt_vector.c, komo 'akomi i ka papahana. Ma kēia faila, hāʻawi ʻia kahi hana i kēlā me kēia interrupt NonHandledInterrupt. Pono mākou e hoʻopaʻa i kā mākou hana i ka interrupt i makemake ʻia.

Loaʻa i ka ʻikepili kahi papa o nā vectors interrupt, kahi e ʻike ai mākou i nā mea e pono ai mākou:

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8
13 TIM2 hōʻano hou/nui
14 TIM2 hopu/hoʻohālikelike

Pono mākou e hoʻololi i ka LED ma UEV, no laila pono mākou e hoʻopau i ka #13.

No laila, ʻo ka mea mua, ma ka faila stm8_interrupt_vector.c hoʻololi i ka inoa paʻamau o ka hana kuleana no ka hoʻopau ʻana i ka No. 13 (IRQ13) iā ʻoe iho:

{0x82, TIM2_Overflow}, /* irq13 */

ʻO ka lua, pono mākou e hana i kahi faila main.h me keia mau mea:

#ifndef __MAIN_H
#define __MAIN_H

@far @interrupt void TIM2_Overflow (void);
#endif

A ʻo ka hope, e kākau i kēia hana ma kāu 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;
}

ʻO ka mea i koe e hiki ai ke hoʻopau. Hana ʻia kēia me ke kauoha assembler rim - pono ʻoe e ʻimi iā ia i loko Polokalamu Polokalamu:

//enable interrupts
_asm("rim");

ʻO kekahi kauoha assembler sim - hoʻopau i nā mea hoʻopau. Pono lākou e hoʻopau ʻia i ka wā e kākau ʻia ana nā waiwai hou i ka "hoʻomanaʻo wikiō", i ʻole e hoʻopau ʻia ka hoʻopaʻa ʻana i ka wā hewa.

Nā code a pau - ma GitHub.

E heluhelu i ka ʻikepili 2: SPI ma STM32; PWM, nā manawa a me nā keakea ma STM8

Inā ʻike kekahi i kēia ʻatikala he mea pono, a laila ʻaʻole wau i kākau makehewa. E hauʻoli wau i ka loaʻa ʻana o nā manaʻo a me nā ʻōlelo, e hoʻāʻo wau e pane i nā mea āpau.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka