Სარჩევი:

ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩამტვირთავი თქვენს "ცისფერ აბაში" მერე რა?: 7 ნაბიჯი
ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩამტვირთავი თქვენს "ცისფერ აბაში" მერე რა?: 7 ნაბიჯი

ვიდეო: ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩამტვირთავი თქვენს "ცისფერ აბაში" მერე რა?: 7 ნაბიჯი

ვიდეო: ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩამტვირთავი თქვენს
ვიდეო: ჟირაფი ჟოზე - მხიარული მათემატიკა (სეზონი 1 | სერია 1) 2024, ნოემბერი
Anonim
ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩატვირთვის პროგრამა თქვენს
ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩატვირთვის პროგრამა თქვენს
ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩატვირთვის პროგრამა თქვენს ტელეფონში
ასე რომ, თქვენ ჩატვირთეთ STM32duino ჩატვირთვის პროგრამა თქვენს ტელეფონში

თუ თქვენ უკვე წაიკითხეთ ჩემი ინსტრუქციები, რომლებიც განმარტავს, თუ როგორ იტვირთება STM32duino ჩამტვირთავი ან სხვა მსგავსი დოკუმენტაცია, თქვენ სცადეთ კოდის ჩატვირთვის მაგალითი და….შეიძლება არაფერი მოხდეს.

პრობლემა ის არის, რომ ბევრი, თუ არა ყველა მაგალითი "Generic" STM32 არ იმუშავებს ყუთში. მცირე ცვლილებები იქნება საჭირო იმისათვის, რომ შემდეგ იმუშაოთ თქვენს STM32 "ცისფერი აბი" დაფაზე.

მე შევარჩევ 4 კოდის მაგალითს, რომ ავხსნა რა უნდა შეიცვალოს და რატომ. კოდები არის: "BlinkWithoutDelay", "Fading", "Dimmer" და "AnalogInSerial".

შენიშვნა მე არაფერი დამიწერია. მე მხოლოდ მცირე ცვლილებებს ვაძლევ კოდებში შექმნილ:

დევიდ ა. მელის და გვიან მოდიფიცირებული ტომ იგოეს, მარტი ბოლივარისა და ზოგიერთ შემთხვევაში სკოტ ფიცჯერალდის მიერ

ტომ იგო და გვიან მოდიფიცირებული ბრაიან ნიუბოლდის მიერ

ასე რომ, მე მირჩევნია ავტორების სახელები შევიცვალო იმ კოდებშიც კი, რომელსაც მე ვცვლი და შევინარჩუნო შემოქმედების კრედიტი.

ნაბიჯი 1: ქინძისთავები … რატომ კოდი არ მუშაობს?

ქინძისთავები … რატომ კოდი არ მუშაობს?
ქინძისთავები … რატომ კოდი არ მუშაობს?

მოდით შევხედოთ STM32 "ლურჯი აბი" პინში. შენიშვნა ქინძისთავები იდენტიფიცირებულია როგორც PA1 ან PC2…. მსგავსი რამ.

თუ დააკვირდებით, მაგალითად, "BlinkWithoutDelay" კოდის მაგალითს, პინი გამოცხადებულია როგორც "33" ….რატომ?

მე ეჭვი მაქვს, რომ ეს იმიტომ, რომ ბატონმა მარტი ბოლივარმა ეს კოდი მიაწოდა MAPLE დაფაზე.

მე ვფიქრობ, რომ ეს არ იყო მისი განზრახვა "Blue Pill" დაფებთან თავსებადი კოდი.

ნეკერჩხლის და ნეკერჩხლის მინი დაფის ქინძისთავები არის რიცხვითი გამოცხადებული, არდუინოს მსგავსად, თუმცა ისინი იყენებენ 33, 24 და ზოგიერთ მსგავს ციფრებს.

მე ვთქვი, რომ კოდი არ მუშაობს? Ჩემი შეცდომა. კოდი შედგენილია ყოველგვარი შეცდომის გარეშე და სწორად ატვირთეთ "ცისფერ აბაზე", ასე რომ, ჩემი აზრით ის მართლაც მუშაობს, მაგრამ GPIO გამომავალი გამოყენებით ჩვენ არ ველოდებით. შეიძლება არც იყოს ხელმისაწვდომი.

ასე რომ, მცირე ცვლილებებია საჭირო კოდში, რათა ის იმუშაოს, როგორც მოსალოდნელი იყო.

ნაბიჯი 2: მოდით "განვსაზღვროთ" ზოგიერთი ქინძისთავები…

მოდით
მოდით

ეს არის კარგი კოდური პრაქტიკა, გამოაცხადოს რესურსები, როგორც ცვლადების ან მუდმივების ადვილად იდენტიფიცირება ან მნიშვნელობა. ეს გაგიადვილებთ კოდის გაგებას და პრობლემების მოგვარებას.

მე გამოვიყენე დეკლარირებული Arduino ქინძისთავები ასე:

const int ledPin = 13;

…"

თუ თქვენ მომწონხართ, იქნებ თქვენ ჰკითხავთ საკუთარ თავს: "როგორ შემიძლია გამოვაცხადო ქინძისთავები PC13 სახელებით?"

პასუხი არის: გამოიყენეთ "#define" C განაცხადი.

ასე რომ, pinout გათამაშების მიხედვით, PC13 არის ის პინი, რომელიც ჩვენ გვაქვს ბორტზე LED- ში "BluePill" - ში. მისი გამოსაყენებლად, მე ასე გამოვაცხადებ ბიბლიოთეკების განსაზღვრის შემდეგ (#მოიცავს …) და სხვა რამის წინ:

#განსაზღვრეთ LedPin PC13

…"

გაითვალისწინეთ, რომ არ არსებობს ";" ხაზის შეწყვეტა, NOR "=" დავალება.

შეადარეთ ორივე კოდი. ერთი არის IDE– დან დატვირთული ორიგინალური მაგალითი. მეორე არის ის, რაც მე შევასწორე "BluePill" - თან მუშაობისთვის.

მე მკაცრად გირჩევთ გამოაცხადოთ ყველა ის პინი, რომლის გამოყენებასაც აპირებთ კოდში. ისინიც კი აპირებენ გამოიყენონ როგორც ADC შეყვანა (ამის შესახებ მოგვიანებით).

ეს გაადვილებს თქვენს ცხოვრებას.

ნაბიჯი 3: PinMode ()… როგორ გამოიყენებთ თქვენს ქინძისთავებს…

გაგრძელებამდე, მოდით გავიგოთ PinMode () ფუნქცია.

არდუინოს მსგავსად, STM32 პინს აქვს მრავალი ფუნქცია. ერთი ან მეორის არჩევის უმარტივესი გზაა pinMode () განცხადების გამოყენება.

Arduino– ს აქვს მხოლოდ 3 რეჟიმი, INPUT, OUTPUT ან INPUT_PULLUP.

STM32– ს, მეორეს მხრივ, აქვს pinMode () მრავალი არომატი. Ისინი არიან:

OUTPUT -ძირითადი ციფრული გამომავალი: როდესაც pin არის მაღალი, ძაბვა შენარჩუნებულია +3.3v (Vcc) და როდესაც ის დაბალია, ის იშლება მიწაზე

OUTPUT_OPEN_DRAIN -ღია გადინების რეჟიმში, პინი მიუთითებს "დაბალზე" დენის ნაკადის მიღებით მიწაზე და "მაღალზე" გაზრდილი წინაღობის უზრუნველყოფით

INPUT_ANALOG -ეს არის სპეციალური რეჟიმი, როდესაც პინი გამოყენებული იქნება ანალოგური (არა ციფრული) კითხვისთვის. საშუალებას აძლევს ADC კონვერტაციის შესრულებას ძაბვაზე პინზე

INPUT_PULLUP -პინის მდგომარეობა ამ რეჟიმში არის მოხსენებული ანალოგიურად, როგორც INPUT– ით, მაგრამ პინის ძაბვა ნაზად "ამოწეულია" +3.3 ვ -ისკენ

INPUT_PULLDOWN -პინის მდგომარეობა ამ რეჟიმში არის მოხსენებული ანალოგიურად, როგორც INPUT– ის შემთხვევაში, მაგრამ პინის ძაბვა ნაზად „იშლება“0v– ისკენ

INPUT_FLOATING -INPUT- ის სინონიმი

PWM -ეს არის სპეციალური რეჟიმი, როდესაც პინი გამოიყენება PWM გამოყვანისთვის (ციფრული გამომუშავების სპეციალური შემთხვევა)

PWM_OPEN_DRAIN -ისევე როგორც PWM, გარდა იმისა, რომ LOW და HIGH ციკლების მონაცვლეობის ნაცვლად, ძაბვა პინზე შედგება LOW და მცურავი (გათიშული) ცვლადი ციკლებისგან

(შენიშვნა: ამოღებულია

მე უბრალოდ ვხსნი ამ ფრჩხილს, რადგან როდესაც დაიწყებთ საკუთარი კოდის შექმნას, ფრთხილად იყავით, რომ გამოიყენოთ სწორი pinMode () თქვენი საჭიროებისთვის.

ნაბიჯი 4: AnalogWrite () წინააღმდეგ PwmWrite ()… ანალოგური გამომავალი 2 არომატით

AnalogWrite () წინააღმდეგ PwmWrite ()… ანალოგური გამომავალი 2 არომატით
AnalogWrite () წინააღმდეგ PwmWrite ()… ანალოგური გამომავალი 2 არომატით
AnalogWrite () წინააღმდეგ PwmWrite ()… ანალოგური გამომავალი 2 არომატით
AnalogWrite () წინააღმდეგ PwmWrite ()… ანალოგური გამომავალი 2 არომატით

"ლურჯი აბი" GPIO ქინძისთავების გამოყენებამდე აუცილებელია გამოაცხადოთ მისი ქცევა, ანუ როგორ იმუშავებს. ეს არის ზუსტად ის, რასაც pinMode () ფუნქცია აკეთებს.

მოდით, ახლა გავამახვილოთ ყურადღება იმაზე, თუ რამდენად სწორად არის მითითებული ანალოგური გამომავალი. ის შეიძლება გამოცხადდეს როგორც OUTPUT რეჟიმში, ასევე PWM რეჟიმში.

ანალოგიურად, ანალოგური მნიშვნელობები შეიძლება მივაკუთვნოთ GPIO– ს ორი გზით: analogWrite () ან pwmWrite (), მაგრამ, analogWrite () მხოლოდ იმ შემთხვევაში იმუშავებს, თუ pinMode () = OUTPUT. მეორეს მხრივ, pwmWrite () იმუშავებს მხოლოდ იმ შემთხვევაში, თუ pinMode () = PWM.

ავიღოთ PA0, მაგალითად: ეს არის ანალოგური/pwm გამომავალი კანდიდატი.

analogWrite (): გამოაცხადე ეს ასე:

….

#განსაზღვრეთ ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <ნომერი>);

……"

სადაც რიცხვი უნდა იყოს 0 -დან 255 -მდე, არდუინოს მსგავსად. სინამდვილეში, ის უკანაა თავსებადი არდუინოსთან.

pwmWrite (): გამოაცხადე ასე:

#განსაზღვრეთ ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <ნომერი.>);

…."

სადაც რიცხვი უნდა იყოს 0 ~ 65535 -ს შორის, გარჩევადობა გაცილებით მაღალია ვიდრე არდუინო.

სურათებში შესაძლებელია შედარება 2 კოდს შორის. თქვენ ასევე შეგიძლიათ ნახოთ ორიგინალური კოდი.

ნაბიჯი 5: STM32 სერიული კომუნიკაცია

STM32 სერიული კომუნიკაცია
STM32 სერიული კომუნიკაცია

ვნახოთ, როგორ არის მოწყობილი USART ინტერფეისები STM32– ში. დიახ, ინტერფეისები მრავლობით რიცხვში ….

"ცისფერ ტაბლეტს" აქვს 3 USART (RX/ TX 1 ~ 3) და, თუ თქვენ იყენებთ ჩამტვირთველს საშუალებას გაძლევთ გამოიყენოთ USB, ის არ არის დაკავშირებული რომელიმე მათგანთან.

იმისდა მიხედვით, იყენებთ თუ არა USB- ს, თქვენ უნდა გამოაცხადოთ სერიული პორტი ამა თუ იმ გზით თქვენს კოდში.

შემთხვევა 1: USB- ის გამოყენება:

ამ გზით, ესკიზები გადმოწერილია პირდაპირ USB– ის საშუალებით. არ არის საჭირო BOOT0 მხტუნავის გადატანა 1 პოზიციაზე და უკან 0 – ზე.

ამ შემთხვევაში, ნებისმიერ დროს, როდესაც თქვენ გამოაცხადებთ "სერიალს" ინდექსის გარეშე, ნიშნავს კომუნიკაციას USB- ით.

ასე რომ, Serial1, ნიშნავს TX/ RX 1 (ქინძისთავები PA9 და PA10); Serial2, ნიშნავს TX/ RX 2 (ქინძისთავები PA2 და PA3) და სერიალი 3 ნიშნავს TX/ RX 3 (ქინძისთავები PA10 და PA11).

ეს არის გზა, რომელთანაც ჩვენ ვმუშაობთ. მე წარმოგიდგენთ ცვლილებებს მაგალითებში ამ სახის კოდირებისთვის.

კიდევ ერთი რამ: "სერიული USB" არ საჭიროებს ინიციალიზაციას. სხვა სიტყვებით რომ ვთქვათ, "… Serial.begin (15200);" არ არის აუცილებელი.

შესაძლებელია ნებისმიერი სერიული ფუნქციის გამოძახება (Serial.read (), Serial.write () და სხვა) ყოველგვარი ინიციალიზაციის გარეშე.

თუ რაიმე მიზეზით ის არის კოდში, შემდგენელი იგნორირებას უკეთებს მას.

შემთხვევა 2: TTL სერიის გამოყენება USB ადაპტერზე:

ამგვარად, ჩამტვირთავი არ უჭერს მხარს მშობლიურ STM32 USB კომუნიკაციას, ასე რომ თქვენ გჭირდებათ USB სერიული ადაპტერი, რომელიც დაკავშირებულია TX/ RX 1 (pin PA9 და PA10) ესკიზების ასატვირთად.

ამ შემთხვევაში, ნებისმიერ დროს "სერიული" ინდექსის გარეშე არის კოდი, ნიშნავს TX/ RX1 (პორტი გამოიყენება კოდის ასატვირთად). ასე რომ, სერიალი 1 ეხება TX/ RX 2 (ქინძისთავები PA2 და PA3) და სერიალი 2 ეხება TX/ RX 3 (ქინძისთავები PA10 და PA11). სერიალი 3 არ არის.

ნაბიჯი 6: გადაეცი მნიშვნელობა მიკროკონტროლერს

მიკროკონტროლერისთვის ღირებულების გადაცემა
მიკროკონტროლერისთვის ღირებულების გადაცემა

დიმერის მაგალითი არის მარტივი გზა იმის საჩვენებლად, თუ როგორ გადაეცემა მნიშვნელობა მიკროკონტროლერს.

ვარაუდობენ, რომ გაივლის მნიშვნელობა 0 -დან 255 -მდე LED სიკაშკაშის გასაკონტროლებლად.

ის არ იმუშავებს, როგორც მოსალოდნელი იყო Blue Pill გამო:

  1. PwmWrite () ფუნქციის გამოსაყენებლად, pinMode () უნდა გამოცხადდეს როგორც PWM რეჟიმში.
  2. თქვენ ვერასდროს მიიღებთ მთელ სამნიშნა რიცხვს. Serial.read () ფუნქცია იღებს მხოლოდ ბუფერულ შინაარსს, რომელიც არის "BYTE". თუ აკრიფებთ "100" და დააჭირეთ "enter", მხოლოდ ბოლო "0" იქნება აღებული ბუფერიდან. და მისი მნიშვნელობა იქნება "48" (ათობითი ASCII მნიშვნელობა "0"). თუ აპირებთ "100" მნიშვნელობის გაცემას, აუცილებელია ჩაწეროთ "d". ასე რომ, სწორია იმის თქმა, რომ ის გარდაქმნის ASCII სიმბოლოს ათწილად მნიშვნელობას LED სიკაშკაშეში, არა ??…. კარგი, ერთგვარი…
  3. პრობლემა, რუქების მნიშვნელობები პირდაპირ Serial.read () ფუნქციისგან არის შეასრულა მოქმედება. თითქმის დარწმუნებულია, რომ მიიღებთ მოულოდნელ მნიშვნელობებს. უკეთესი მიდგომაა შენახვა ბუფერული შინაარსი დროებით ცვლადში და ვიდრე მისი რუკა.

როგორც მე ავხსენი მე 2 პუნქტში, მე შემოვიღებ ცვლილებებს, რაც საშუალებას მოგცემთ შეიყვანოთ ASCII სიმბოლო და ეს გააკონტროლებს LED სიკაშკაშეს მისი ASCII ათობითი მნიშვნელობით… და "}" შესაძლებელია ყველაზე მაღალი (მნიშვნელობა 126). სხვა პერსონაჟები არ არის დასაბეჭდი, ამიტომ ტერმინალი ვერ გაიგებს ან შესაძლოა ისინი ხასიათის ერთობლიობას წარმოადგენს (მაგალითად "~" არის კლავიატურა ჩემს კლავიატურაზე და არ იმუშავებს სწორად). ეს ნიშნავს, რომ ეს რთული ხასიათი, ტერმინალში შეყვანისას გამოგზავნის თავად პერსონაჟს და სხვას. ჩვეულებრივ, დასაბეჭდი. და არის ეს უკანასკნელი კოდი. ასევე, გახსოვდეთ თქვენი ტერმინალი, ამ შემთხვევაში, არ უნდა გამოაგზავნოთ არც "ვაგონის დაბრუნება" და არც "ხაზის კვება". თქვენ უნდა მიაქციოთ ამას ყურადღება, რომ კოდი სწორად იმუშაოს.

თუ თქვენ დაცემულხართ, ეს ცოტა გაუგებარია, ის უარესი გახდება…..

ნაბიჯი 7: და თუ მსურს სამი ციფრის აკრეფა…. ან კიდევ უფრო მეტი ??

და თუ მინდა სამი ციფრი დავწერო… ან კიდევ უფრო მეტი ??
და თუ მინდა სამი ციფრი დავწერო… ან კიდევ უფრო მეტი ??

სერიული კომუნიკაციისგან მრავალჯერადი ხასიათის მიღება არ არის მარტივი ამოცანა.

სერიული ბუფერი არის FIFO ბაიტიანი სიმბოლო. ნებისმიერ დროს, როდესაც Serial.read () ფუნქცია იძახებს, პირველი სიმბოლო იხსნება წყობიდან და ინახება სხვაგან. ჩვეულებრივ, კოდი ცვლადია. შენიშვნა, დამოკიდებულია აპარატურაზე, ჩვეულებრივ არის ვადა, თუ როგორ შეუძლია ჟურნალ ბუფერს შეინარჩუნოს ინფორმაცია.

თუ თქვენ აპირებთ სერიის საშუალებით ერთზე მეტი ციფრის შეყვანას, თქვენ უნდა "შეადგინოთ" სტრიქონი სიმბოლოების მიხედვით, როდესაც ისინი შედიან UART ბუფერში.

ეს ნიშნავს, რომ ველოსიპედით წაიკითხავთ თითოეულ ბუფერულ სიმბოლოს, შეინახავთ ტემპერატურის ცვლადში, ჩატვირთავთ მას სტრიქონის მასივის პირველ პოზიციაში, გადადით შემდეგ პოზიციაზე და იწყებთ თავიდან, სანამ… კარგად, დამოკიდებულია აპლიკაციაზე. ციკლის დასრულების 2 გზა არსებობს:

  1. ზოგიერთი "ბოლო ნიშნის" სიმბოლოს გამოყენებით, როგორიცაა "ვაგონის დაბრუნება" ან "ხაზის არხი". როგორც კი "end Mark" char მოიძებნება, loop მთავრდება.
  2. ალტერნატიულად, სიმებიანი ჯაჭვის სიმბოლოების რაოდენობა შეიძლება შეზღუდული იყოს, ასევე ინტერაქტიული ციკლების რაოდენობა. როდესაც ის მიაღწევს ზღვარს, ვთქვათ, 4, შეიძინეთ რუტინული დასრულებები თავად.

მოდით შევხედოთ მარტივ მაგალითს, როგორ გავაკეთოთ ეს:

  • დააყენეთ "დასასრულის" სიმბოლო, როგორიცაა '\ n' (ეს ნიშნავს ASCII ჩამწერ ხაზს).
  • ამასობაში looping Serial.available () მართალია
  • Serial.read () შენახვა იწვევს დროებით char ცვლადს. დაიმახსოვრე: როგორც კი Serial.read () ფაქტობრივად "კითხულობს" ბუფერს, ის სუფთაა და მასში იტვირთება შემდეგი სიმბოლო.
  • გაზარდეთ სიმებიანი ცვლადი ამ სიმბოლოსთან ერთად
  • თუ ბოლო სიმბოლო არის "დასასრული", დატოვეთ მარყუჟი.

ჩვეულებრივ, სერიული ხასიათის მასივის მისაღებად რუტინა ჰგავს სურათს.

იგი დაფუძნებული იყო ბატონი დავით ა. მელისის ორიგინალური კოდის ფართო ადაპტაციით.

დაეცა მისი გამოყენება და გამოცდა. დაიმახსოვრე: მნიშვნელობები უნდა შეიყვანო 3 ციფრის ფორმატში.

ეს არის ახლა. მე არ გავაგრძელებ თავს სერიულ საკომუნიკაციო დეტალებში. ძალიან რთულია აქ დაფარვა და ის იმსახურებს საკუთარ Intructables- ს.

ვიმედოვნებ, რომ ის დაგეხმარებათ გამოიყენოთ მაგალითები Blue Pill– ში და მოგცემთ განმანათლებლობას, რამდენად სწორია კოდი ამ პატარა დაფისთვის.

შევხვდებით სხვა სასწავლო ინსტრუქციებში.

გირჩევთ: