การเขียนโปรแกรม STM32 STM32 - ไมโครคอนโทรลเลอร์สำหรับผู้เริ่มต้นหลังจากแพลตฟอร์ม Arduino สำหรับการเขียนโปรแกรมใน c stm32

09.02.2022

เป็นการดีที่สุดที่จะเริ่มทำความคุ้นเคยกับทุกสิ่งพร้อมคำแนะนำ ในบางกรณีทุกอย่างชัดเจน ในบางกรณี - “อืม ไม่มีอะไรทำงาน ดูเหมือนว่าคุณยังคงต้องอ่านคำแนะนำ” ไมโครคอนโทรลเลอร์เป็นอุปกรณ์ที่ค่อนข้างซับซ้อน และแน่นอนว่าคุณไม่สามารถทำอะไรที่เป็นประโยชน์กับอุปกรณ์เหล่านี้ได้หากไม่ได้อ่านเอกสารประกอบ แม้ว่า...

หลังจาก AVR บางส่วน คุณอาจรู้สึกตกใจเล็กน้อยกับจำนวน PDF ที่แตกต่างกันสำหรับไมโครคอนโทรลเลอร์ STM32 จะดูที่ไหนก่อน? วิธีการใช้งาน? เกิดอะไรขึ้นอีกแล้ว?? เมื่อมองแวบแรกไม่มีอะไรชัดเจน ดังนั้นฉันจึงตัดสินใจสร้างภาพรวมเล็ก ๆ เกี่ยวกับโลกแห่งเอกสารประกอบสำหรับไมโครคอนโทรลเลอร์ที่ยอดเยี่ยมเหล่านี้ ฉันจะให้ความสำคัญเป็นพิเศษกับ STM32F103C8T6 เนื่องจากฉันวางแผนที่จะเขียนบทเรียนหลายบทเกี่ยวกับการใช้หินก้อนนี้

เอกสารหลักสำหรับ STM มีดังต่อไปนี้:

  1. แผ่นข้อมูล
  2. คู่มืออ้างอิง
  3. คู่มือการเขียนโปรแกรม
  4. แผ่นข้อผิดพลาด

แผ่นข้อมูล

เอกสารข้อมูลประกอบด้วยข้อมูลเกี่ยวกับการมีอยู่ของอุปกรณ์ต่อพ่วงบางอย่างใน MK โดยเฉพาะ, pinout, ลักษณะทางไฟฟ้า และเครื่องหมายของชิปสำหรับ STM32F103x8 และ STM32F103xB นั่นคือสำหรับอุปกรณ์เหล่านี้ซึ่งวงกลมเป็นสี่เหลี่ยมสีแดง:

ค่อนข้างง่าย แผ่นข้อมูลหนึ่งแผ่นสำหรับไมโครคอนโทรลเลอร์ 8 ตัว

พื้นฐานของเอกสารข้อมูล

ก่อนอื่นคุณต้องใส่ใจกับส่วนนี้ก่อน 7.รูปแบบข้อมูลการสั่งซื้อซึ่งระบุไว้แล้วหมายถึงอักขระแต่ละตัวในการทำเครื่องหมาย ตัวอย่างเช่น สำหรับ STM32F103C8T6: แพ็คเกจ LQFP-48, แฟลช 64Kb, ช่วงอุณหภูมิ –40 ถึง 85 °C

ความแตกต่างที่สำคัญระหว่างไมโครคอนโทรลเลอร์จากคอลัมน์ต่างๆ คือจำนวนขาและปริมาตรของแฟลช ส่วนอย่างอื่นก็เหมือนกัน ข้อยกเว้นเล็กๆ น้อยๆ คือคอลัมน์เวอร์ชันแรก ขอบคุณ: ไมโครคอนโทรลเลอร์เหล่านี้มีโมดูล SPI, I2C และ USART น้อยกว่า การกำหนดหมายเลขอุปกรณ์ต่อพ่วงเริ่มต้นจากหนึ่ง: นั่นคือหากอยู่ใน STM32F103 Cxเรามี SPI 2 ตัว จากนั้นจะมีชื่อ SPI1 และ SPI2 และใน STM32F103 ขอบคุณเรามีเพียง SPI1 เนื่องจากเรามีเอกสารข้อมูลสำหรับไมโครคอนโทรลเลอร์ STM32F103x8 และ STM32F103xB ตารางนี้จึงใช้ได้กับรุ่นเหล่านี้เท่านั้น เช่น STM32F103 C8หรือ STM32F103 ซี.บี.สอดคล้องกับตารางนี้และ STM32F103 ค6ไม่ มีเอกสารข้อมูลแยกต่างหาก

ในบทที่ 2.2 ความเข้ากันได้เต็มรูปแบบทั่วทั้งครอบครัวกล่าวกันว่าอุปกรณ์ STM32F103xx เป็นซอฟต์แวร์ ใช้งานได้จริง และเข้ากันได้กับแบบ pin-to-pin (สำหรับกรณีเดียวกัน)

ในคู่มืออ้างอิงจะมีการแบ่งออกเป็น “ประเภท” ของไมโครคอนโทรลเลอร์ดังต่อไปนี้: STM32F103x4 และ STM32F103x6 ถูกกำหนดให้เป็น อุปกรณ์ที่มีความหนาแน่นต่ำ , STM32F103x8 และ STM32F103xB เช่น อุปกรณ์ที่มีความหนาแน่นปานกลาง , STM32F103xC, STM32F103xD และ STM32F103xE เป็น อุปกรณ์ที่มีความหนาแน่นสูง . อุปกรณ์ที่มีความหนาแน่นต่ำจะมีหน่วยความจำแฟลชและ RAM ตัวจับเวลา และอุปกรณ์ต่อพ่วงน้อยกว่า อุปกรณ์ความหนาแน่นสูงมีหน่วยความจำ Flash และ RAM มากกว่า และยังมีอุปกรณ์ต่อพ่วงเพิ่มเติม เช่น SDIO, FSMC, I2S และ DAC ในขณะที่ยังคงเข้ากันได้กับสมาชิกคนอื่นๆ ในกลุ่ม STM32F103xx อย่างสมบูรณ์ นั่นคือหากในบางขั้นตอนของการพัฒนาเห็นได้ชัดว่าไมโครคอนโทรลเลอร์ที่เลือกไม่เพียงพอที่จะใช้ความสามารถทั้งหมดคุณสามารถเลือกหินที่ซับซ้อนกว่านี้ได้อย่างปลอดภัยโดยไม่ต้องเขียนซอฟต์แวร์ที่มีอยู่ทั้งหมดใหม่และหากมีหินใหม่เข้ามา กรณีเดียวกันก็ไม่จำเป็นต้องเดินสายแผงวงจรพิมพ์ใหม่

คู่มืออ้างอิง

เดินหน้าต่อไป คู่มืออ้างอิงประกอบด้วยคำอธิบายโดยละเอียดเกี่ยวกับอุปกรณ์ต่อพ่วง รีจิสเตอร์ ออฟเซ็ต และอื่นๆ นี่เป็นเอกสารหลักที่ใช้เมื่อสร้างเฟิร์มแวร์สำหรับไมโครคอนโทรลเลอร์ คู่มืออ้างอิงได้รับการรวบรวมสำหรับไมโครคอนโทรลเลอร์กลุ่มใหญ่ ในกรณีของเราสำหรับ STM32F10xxx ทั้งหมด ได้แก่ STM32F101xx, STM32F102xx, STM32F103xx และ STM32F105xx/STM32F107xx แต่ STM32F100xx ไม่ได้รวมอยู่ใน RM นี้ แต่ก็มีอยู่หนึ่งอันสำหรับพวกเขา

สิ่งสำคัญในคู่มืออ้างอิง

ตามที่กล่าวไว้ข้างต้น ในคู่มืออ้างอิง มีการแบ่งออกเป็น “ประเภท” ของไมโครคอนโทรลเลอร์ดังต่อไปนี้: ความหนาแน่นต่ำ ปานกลาง ความหนาแน่นสูง และการเชื่อมต่อ
เส้น. ใน 2.3 อภิธานศัพท์อธิบายว่าใครเป็นใคร:

  • อุปกรณ์ที่มีความหนาแน่นต่ำได้แก่ไมโครคอนโทรลเลอร์ STM32F101xx, STM32F102xx และ STM32F103xx ที่มีหน่วยความจำแฟลชขนาดระหว่าง 16 ถึง 32 Kbytes
  • อุปกรณ์ที่มีความหนาแน่นปานกลางเหล่านี้คือ STM32F101xx, STM32F102xx และ STM32F103xx ขนาดหน่วยความจำแฟลชระหว่าง 64 ถึง 128 Kbytes
  • อุปกรณ์ที่มีความหนาแน่นสูงเหล่านี้คือ STM32F101xx และ STM32F103xx ขนาดหน่วยความจำแฟลชระหว่าง 256 ถึง 512 Kbytes
  • อุปกรณ์ความหนาแน่น XLเหล่านี้คือ STM32F101xx และ STM32F103xx ขนาดหน่วยความจำแฟลชระหว่าง 768 Kbytes ถึง 1 Mbyte
  • อุปกรณ์สายเชื่อมต่อเหล่านี้คือไมโครคอนโทรลเลอร์ STM32F105xx และ STM32F107xx

STM32F103C8T6 ของเราเป็นอุปกรณ์ที่มีความหนาแน่นปานกลาง ข้อมูลนี้จะเป็นประโยชน์ในการทราบเมื่อศึกษาอุปกรณ์ต่อพ่วง เช่น มีส่วนแยกต่างหากเกี่ยวกับ RCC สำหรับอุปกรณ์ความหนาแน่นต่ำ ปานกลาง สูง และ XL และอุปกรณ์สายการเชื่อมต่อ

คู่มือการเขียนโปรแกรม

คู่มือการเขียนโปรแกรมไม่ใช่เอกสารสำคัญในการเริ่มต้นทำความรู้จักกับ STM แต่มีความสำคัญมากเมื่อศึกษาไมโครคอนโทรลเลอร์เหล่านี้ในเชิงลึก ประกอบด้วยข้อมูลเกี่ยวกับแกนประมวลผล ชุดคำสั่ง และอุปกรณ์ต่อพ่วงหลัก นอกจากนี้ นี่ไม่ใช่อุปกรณ์ต่อพ่วงเดียวกันกับที่อธิบายไว้ในคู่มืออ้างอิง ประกอบด้วย:

  • ตัวจับเวลาระบบ - ตัวจับเวลาระบบ
  • ตัวควบคุมอินเทอร์รัปต์แบบเวกเตอร์ที่ซ้อนกัน - ตัวควบคุมอินเทอร์รัปต์ที่มีลำดับความสำคัญ
  • บล็อกควบคุมระบบ
  • หน่วยป้องกันหน่วยความจำ

เมื่อเราเริ่มคุ้นเคยกับการขัดจังหวะใน STM32 แล้ว เราจะต้องมีส่วนต่างๆ 4.3 ตัวควบคุมอินเทอร์รัปต์เวกเตอร์แบบซ้อน (NVIC). ตัวจับเวลาของระบบเป็นสิ่งที่ดีมากที่จะมีประโยชน์ใน RTOS บางตัวหรือสำหรับการสร้างตัวจับเวลาซอฟต์แวร์

แผ่นข้อผิดพลาด

Errata Sheet คือชุดของข้อบกพร่องด้านฮาร์ดแวร์และวงกบของไมโครคอนโทรลเลอร์ที่รู้จักทั้งหมด รวมถึงคำแนะนำเกี่ยวกับวิธีการแก้ไข เอกสารค่อนข้างสนุก 🙂 ก่อนใช้อุปกรณ์ต่อพ่วงใดๆแนะนำให้ดูก่อนครับ วิธีนี้สามารถช่วยลดจำนวนเซลล์ประสาทที่สูญเสียไปเมื่อทำการดีบั๊กเฟิร์มแวร์มหัศจรรย์ของคุณซึ่งไม่ต้องการทำงาน :)

ระบบตอกบัตร STM32

วันนี้เราจะมาพูดถึงระบบนาฬิกาสำหรับไมโครคอนโทรลเลอร์ STM 32 หากคุณยังไม่รู้ว่านาฬิกาคืออะไร ความถี่ และไม่เคยสัมผัสระบบนาฬิกามาก่อน แม้ว่าลิงก์นี้จะกล่าวถึงระบบการตอกบัตรของไมโครคอนโทรลเลอร์ AVR แต่แนวคิดที่กำหนดไว้ในบทเรียนในลิงก์ยังสามารถใช้ได้กับระบบการตอกบัตรของไมโครคอนโทรลเลอร์ STM 32 อีกด้วย

มาเริ่มกันเลย!

เราจะพิจารณาระบบการตอกบัตรโดยใช้ตัวอย่างของไมโครคอนโทรลเลอร์ STM 32F 303VCT 6 ซึ่งติดตั้งในบอร์ดดีบัก STM 32 F 3 DISCOVERY

มาดูโครงสร้างทั่วไปของระบบตอกบัตรกัน:

ดังที่เราเห็น ระบบนาฬิกา STM 32 นั้นมีลำดับความสำคัญที่ซับซ้อนกว่าระบบนาฬิกาของไมโครคอนโทรลเลอร์ AVR แม้ว่าข้อเท็จจริงนั้นก็ตามรูปภาพแสดงเฉพาะส่วนหลักเท่านั้น

มาหาคำตอบกัน!

ควรดูแผนภาพจากซ้ายไปขวา อันดับแรก เราต้องเลือกแหล่งสัญญาณนาฬิกาหลักของคอนโทรลเลอร์ เราจะเลือกระหว่าง HSI และ HSE

สสจ.- เครื่องกำเนิดความถี่สูงภายนอก แหล่งที่มาของนาฬิกาคือสัญญาณนาฬิกาภายนอก (ความถี่อินพุต) ซึ่งตามที่เราเห็นจากแผนภาพอาจมีตั้งแต่ 4 ถึง 32 MHz นี่อาจเป็นเครื่องสะท้อนควอทซ์ เครื่องกำเนิดสัญญาณนาฬิกา และอื่นๆ

สสส - เครื่องกำเนิดความถี่สูงภายใน ในไมโครคอนโทรลเลอร์ STM 32 F 3 เป็นวงจร RC ที่มีความถี่ 8 MHz ความแม่นยำต่ำกว่าเครื่องกำเนิด HSE ภายนอกอย่างมาก

แต่ละแหล่งสัญญาณนาฬิกาเหล่านี้สามารถเชื่อมต่อได้ พีแอลแอล. อย่างไรก็ตาม สัญญาณ HSI จะลดลง 2 เท่าก่อนที่จะถูกส่งไปยัง PLL ในทางกลับกัน สัญญาณ HSE สามารถจ่ายให้กับ PLL โดยไม่มีการเปลี่ยนแปลง หรือสามารถลดลงตามจำนวนครั้งที่กำหนดได้ ตามคำขอของผู้ใช้

พีแอลแอล นาฬิกา - ระบบเฟสล็อคลูป (PLL) ช่วยให้คุณสามารถคูณสัญญาณอินพุต HSI หรือ HSE ตามจำนวนครั้งที่ต้องการ

ด้วย PLL สามารถส่งสัญญาณไปยังบัสระบบซึ่งมีความถี่สูงสุดคือ 72 MHz อีกทางหนึ่ง สามารถจ่ายสัญญาณ HSE หรือ HSI ให้กับบัสระบบได้โดยตรง กล่าวคือ โดยไม่ต้องแปลง PLL

ความถี่สัญญาณนาฬิกาของระบบ SYSCLK จะส่งสัญญาณนาฬิกาบัสหลักทั้งหมดของไมโครคอนโทรลเลอร์ผ่านตัวแบ่งที่สอดคล้องกันดังที่เราเห็นในแผนภาพด้านบน โปรดทราบว่ารถโดยสารบางคันมีความเร็วสัญญาณนาฬิกาสูงสุดต่ำกว่า SYSCLK ดังนั้นก่อนที่จะใช้สัญญาณนาฬิกา SYSCLK กับบัส ควรแบ่งด้วยตัวแบ่งที่เหมาะสม หากไม่เสร็จสิ้น ไมโครคอนโทรลเลอร์จะหยุดทำงาน

หากต้องการปรับนาฬิกา คุณสามารถใช้การแก้ไขการลงทะเบียนด้วยตนเอง หรือใช้ฟังก์ชันห้องสมุด เราจะใช้ห้องสมุด

มาตั้งค่าบอร์ดดีบักของเรากันดีกว่า STM 32 F 3 ดิสคัฟเวอรี่เพื่อทำงานที่ความถี่สัญญาณนาฬิกา 72 MHz

มาสร้างและกำหนดค่าโปรเจ็กต์ใน Keil uVision กันดีกว่า .

มาเพิ่มรหัสต่อไปนี้:

#include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" เป็นโมฆะ InitRCC () ( RCC_HSEConfig (RCC_HSE_ON); // เปิดใช้งาน HSE ในขณะที่ (RCC_GetFlagStatus (RCC_FLAG_HSERDY) == RESET) ; // กำลังรอ HSE // ตั้งค่าเวลาแฝงแฟลช FLASH ->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)((uint8_t)0x02); RCC_PREDIV1Config(RCC_PREDIV1_Div1);//PREDIV 1 ตัวแบ่ง = 1 RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);//ตั้งค่า PREDIV1 เป็นแหล่งสำหรับ PLL และตั้งค่า PLLMUL=9 RCC_PLLCmd(ENABLE);//Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;//กำลังรอ PLL RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);//ตั้งค่า PLL เป็น SYSCLK Soucre RCC_HSICmd(DISABLE);//ปิดการใช้งาน HSI ) int main(void) ( RCC_ClocksTypeDef RCC_Clocks; InitRCC(); RCC_GetClocksFreq (&RCC_Clocks); __NOP (); ในขณะที่ (1) ( ) )

#รวม "stm32f30x_gpio.h"

#รวม "stm32f30x_rcc.h"

เป็นโมฆะ InitRCC()

RCC_HSEConfig(RCC_HSE_ON); //เปิดใช้งาน HSE

ในขณะที่ (RCC_GetFlagStatus (RCC_FLAG_HSERDY ) == รีเซ็ต ) ; //กำลังรอ HSE

//ตั้งค่าเวลาแฝงของแฟลช

แฟลช -> ACR |= FLASH_ACR_PRFTBE ;

แฟลช -> ACR &= (uint32_t ) ((uint32_t ) ~ FLASH_ACR_LATENCY );

แฟลช -> ACR |= (uint32_t ) ((uint8_t ) 0x02 ) ;

RCC_PREDIV1Config(RCC_PREDIV1_Div1); //PREDIV 1 ตัวหาร = 1

RCC_PLLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //ตั้งค่า PREDIV1 เป็นแหล่งสำหรับ PLL และตั้งค่า PLLMUL=9

RCC_PLLCmd(เปิดใช้งาน); //เปิดใช้งาน PLL

ในขณะที่ (RCC_GetFlagStatus (RCC_FLAG_PLLRDY ) == รีเซ็ต ) ; //กำลังรอ PLL

RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK ) ; //ตั้งค่า PLL เป็น SYSCLK Soucre

RCC_HSICmd(ปิดการใช้งาน); //ปิดการใช้งาน HSI

int main (เป็นโมฆะ)

RCC_ClocksTypeDef RCC_Clocks ;

InitRCC();

RCC_GetClocksFreq (& RCC_Clocks ) ;

นพ();

ในขณะที่(1)

ในฟังก์ชัน main main โครงสร้างจะถูกประกาศ อาร์ซีซี _ ประเภทนาฬิกาDef. โครงสร้างนี้มีฟิลด์ที่สะท้อนถึงความถี่สัญญาณนาฬิกาปัจจุบันของบางส่วนของคอนโทรลเลอร์

จากนั้นฟังก์ชันหลักจะเรียกใช้ฟังก์ชัน InitRCC ซึ่งจะปรับนาฬิกาของตัวควบคุม มาดูรายละเอียดเพิ่มเติมกัน

ทีม อาร์ซีซี _ HSEConfig (อาร์ซีซี _ สสจ. _ บน ), เราเปิดใช้งาน HSE การเปิดใช้งานต้องใช้เวลาดังนั้นคุณต้องรอจนกว่าจะตั้งค่าสถานะ อาร์ซีซี _ ธง _ เฮเซอร์ดี . เราทำสิ่งนี้เป็นวง ในขณะที่ (อาร์ซีซี _ รับสถานะธง (อาร์ซีซี _ ธง _ เฮเซอร์ดี ) == รีเซ็ต ) .

จากนั้นเราจะปรับความล่าช้าของหน่วยความจำแฟลช สิ่งนี้จะต้องทำเมื่อบัสระบบทำงานที่ความถี่สูงกว่า 36 MHz!

หลังจากตั้งค่าการหน่วงเวลาแล้ว ให้เลือกพรีสเกลเลอร์ PLL ทีม อาร์ซีซี _ ก่อนหน้า 1 การกำหนดค่า (อาร์ซีซี _ ก่อนหน้า 1_ สาขาวิชา 1) เราตั้งค่าพรีสเกลเลอร์เป็น 1 ด้วยคำสั่ง อาร์ซีซี _ PLLConfig (อาร์ซีซี _ PLLSource _ ก่อนหน้า 1, อาร์ซีซี _ PLLMul _9 ) เลือก HSE เป็นแหล่งความถี่สำหรับ PLL และเลือกการคูณ 9 ครั้ง สิ่งที่เหลืออยู่คือการเปิดใช้งาน PLL ด้วยคำสั่ง อาร์ซีซี _ PLLCMd (เปิดใช้งาน ), และรอให้ปักธง อาร์ซีซี _ ธง _ PLLRDYในอีกสักครู่ ดังนั้นเราจึงจัดเตรียมการหน่วงเวลาที่จำเป็นสำหรับการเปิด PLL หลังจากนั้นเลือก PLL เป็นแหล่งความถี่ของระบบ SYSCLK ด้วยคำสั่ง อาร์ซีซี _ SYSCLKConfig (อาร์ซีซี _ SYSCLKแหล่งที่มา _ PLLCLK ). เราจะไม่แตะต้องตัวแบ่งล่วงหน้าของบัส ดังนั้น รถเมล์ AHB, APB 1, APB 2 จะทำงานที่ความถี่ 72.36 และ 72 MHz ตามลำดับ

สิ่งที่เหลืออยู่คือปิดเชน RC ภายในด้วยคำสั่ง อาร์ซีซี _ HSICmd (ปิดการใช้งาน ).

หลังจากดำเนินการฟังก์ชัน InitRCC เราจะเติมโครงสร้างในลูปเฟิร์มแวร์หลัก อาร์ซีซี _ ประเภทนาฬิกาDefซึ่งจะทำให้เราทราบว่าเราได้ตั้งค่าระบบนาฬิกาไว้ถูกต้องหรือไม่ เราทำสิ่งนี้กันเป็นทีม RCC_GetClocksFreq(&RCC_Clocks)

คุณสามารถดูความถี่นาฬิกาของคอนโทรลเลอร์ได้ในโหมดดีบั๊กโดยการตั้งค่าเบรกพอยต์บนคำสั่ง __ นพ () ซึ่งหมายถึงคำสั่งว่าง คำสั่งนี้มักจะถูกเพิ่มไว้เพื่อความสะดวกในการแก้ไขจุดบกพร่อง

การเชื่อมต่อบอร์ดดีบัก การค้นพบ STM32 F3รวบรวมเฟิร์มแวร์แฟลชบอร์ดและเข้าสู่โหมดดีบั๊กในที่สุดโดยกดปุ่มเริ่ม / หยุดเซสชันดีบั๊ก (Ctrl + F 5) การตั้งค่าเบรกพอยต์บนฟังก์ชัน __ นพและเพิ่มโครงสร้าง RCC _Clocks ลงใน Watch เราจะเริ่มดำเนินการเฟิร์มแวร์โดยกด F 5 เป็นผลให้เราเห็น:

มีการปรับความถี่อย่างถูกต้อง และไมโครคอนโทรลเลอร์กำลังทำงานที่ 72 MHz

ตามที่คุณได้เรียนรู้จากบทเรียนวันนี้ ระบบตอกบัตร STM 32 มีประสิทธิภาพและยืดหยุ่นเพียงพอที่จะตอบสนองความต้องการของโครงการของคุณ ใช้เวลาในการตั้งค่า คุณจะได้รับผลลัพธ์ที่ยอดเยี่ยม!

ขอขอบคุณสำหรับความสนใจของคุณ! ตามปกติคำถามของคุณอยู่ในความคิดเห็น!

การคัดลอก การทำซ้ำ การอ้างอิงเนื้อหาหรือส่วนหนึ่งส่วนใดของเนื้อหาดังกล่าวจะได้รับอนุญาตก็ต่อเมื่อได้รับความยินยอมเป็นลายลักษณ์อักษรจากฝ่ายบริหารของ MKPROG .RU การคัดลอก คัดลอก ทำซ้ำ มีโทษตามกฎหมาย!

ในช่วงไม่กี่ปีที่ผ่านมา ไมโครคอนโทรลเลอร์ (MCU) 32 บิตที่ใช้โปรเซสเซอร์ ARM ได้ครองโลกของอุปกรณ์อิเล็กทรอนิกส์อย่างรวดเร็ว ความก้าวหน้าครั้งนี้เกิดขึ้นเนื่องจากประสิทธิภาพสูง สถาปัตยกรรมขั้นสูง การใช้พลังงานต่ำ ต้นทุนต่ำ และเครื่องมือการเขียนโปรแกรมขั้นสูง

เรื่องสั้น
ชื่อ ARM เป็นตัวย่อสำหรับ Advanced RISC Machines โดยที่ RISC (Reduced Instruction Set Computer) ย่อมาจากสถาปัตยกรรมตัวประมวลผลชุดคำสั่งที่ลดลง ไมโครคอนโทรลเลอร์ยอดนิยมจำนวนมาก เช่น ตระกูล PIC และ AVR ก็มีสถาปัตยกรรม RISC เช่นกัน ซึ่งเพิ่มประสิทธิภาพโดยการถอดรหัสคำสั่งให้ง่ายขึ้นและเร่งการดำเนินการ การเกิดขึ้นของไมโครคอนโทรลเลอร์ ARM 32 บิตขั้นสูงและมีประสิทธิภาพช่วยให้เราสามารถแก้ไขปัญหาที่ซับซ้อนมากขึ้นซึ่ง MCU 8 และ 16 บิตไม่สามารถรับมือได้อีกต่อไป สถาปัตยกรรมไมโครโปรเซสเซอร์ ARM ที่มีคอร์ 32 บิตและชุดคำสั่ง RISC ได้รับการพัฒนาโดยบริษัทอังกฤษ ARM Ltd ซึ่งพัฒนาเคอร์เนล คอมไพเลอร์ และเครื่องมือแก้ไขข้อบกพร่องโดยเฉพาะ บริษัทไม่ได้ผลิต MK แต่จำหน่ายใบอนุญาตสำหรับการผลิต MK ARM เป็นหนึ่งในกลุ่มที่เติบโตเร็วที่สุดของตลาด MK อุปกรณ์เหล่านี้ใช้เทคโนโลยีประหยัดพลังงาน ดังนั้นจึงมีการใช้กันอย่างแพร่หลายในระบบฝังตัวและครองตลาดสำหรับอุปกรณ์เคลื่อนที่ซึ่งมีความสำคัญในการใช้พลังงานต่ำ นอกจากนี้ ไมโครคอนโทรลเลอร์ ARM ยังถูกใช้อย่างแข็งขันในการสื่อสาร อุปกรณ์พกพา และอุปกรณ์ฝังตัวที่ต้องการประสิทธิภาพสูง คุณลักษณะของสถาปัตยกรรม ARM คือแกนประมวลผลของโปรเซสเซอร์ซึ่งไม่ได้ติดตั้งองค์ประกอบเพิ่มเติมใดๆ ผู้พัฒนาโปรเซสเซอร์แต่ละคนจะต้องจัดเตรียมบล็อกที่จำเป็นสำหรับคอร์นี้อย่างอิสระสำหรับงานเฉพาะของพวกเขา แนวทางนี้ใช้ได้ผลดีกับผู้ผลิตชิปรายใหญ่ แม้ว่าในตอนแรกจะเน้นไปที่โซลูชันโปรเซสเซอร์แบบคลาสสิกก็ตาม โปรเซสเซอร์ ARM ได้ผ่านการพัฒนาหลายขั้นตอนแล้วและเป็นที่รู้จักกันดีในตระกูล ARM7, ARM9, ARM11 และ Cortex หลังถูกแบ่งออกเป็นตระกูลย่อยของโปรเซสเซอร์ CortexA แบบคลาสสิก, โปรเซสเซอร์แบบเรียลไทม์ CortexR และคอร์ไมโครโปรเซสเซอร์ CortexM มันเป็นคอร์ CortexM ที่กลายเป็นพื้นฐานสำหรับการพัฒนา MCU 32 บิตคลาสขนาดใหญ่ แตกต่างจากสถาปัตยกรรม Cortex รุ่นอื่นๆ ตรงที่การใช้ชุดคำสั่ง Thumb2 แบบ 16 บิต ชุดนี้รวมประสิทธิภาพและความกะทัดรัดของคำสั่ง ARM และ Thumb แบบ "คลาสสิก" และได้รับการพัฒนาโดยเฉพาะสำหรับการทำงานกับภาษา C และ C++ ซึ่งปรับปรุงคุณภาพของโค้ดอย่างมาก ข้อได้เปรียบที่ยอดเยี่ยมของไมโครคอนโทรลเลอร์ที่สร้างขึ้นบนคอร์ CortexM คือความเข้ากันได้ของซอฟต์แวร์ ซึ่งในทางทฤษฎีอนุญาตให้ใช้โค้ดโปรแกรมภาษาระดับสูงในรุ่นจากผู้ผลิตหลายราย นอกเหนือจากการระบุขอบเขตการใช้งานคอร์แล้ว นักพัฒนา MK ยังระบุถึงประสิทธิภาพของคอร์ CortexM ในระดับสิบจุด ปัจจุบันตัวเลือกยอดนิยมคือ CortexM3 และ CortexM4 MCU ที่มีสถาปัตยกรรม ARM ผลิตโดยบริษัทต่างๆ เช่น Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander ,HiSilicon และอื่นๆ
ด้วยสถาปัตยกรรมที่ได้รับการปรับให้เหมาะสม ค่าใช้จ่ายของ MCU ที่ใช้คอร์ CortexM ในบางกรณีจึงต่ำกว่าราคาของอุปกรณ์ 8 บิตหลายๆ ตัวด้วยซ้ำ ปัจจุบันสามารถซื้อรุ่น "น้อง" ได้ในราคา 30 รูเบิล สำหรับตัวถังซึ่งสร้างการแข่งขันให้กับเอ็มเครุ่นก่อนๆ ไมโครคอนโทรลเลอร์ STM32 ลองพิจารณา MCU ตระกูล STM32F100 ที่ราคาไม่แพงและแพร่หลายที่สุดจาก STMicroelectronics ซึ่งเป็นหนึ่งในผู้ผลิต MCU ชั้นนำของโลก บริษัทเพิ่งประกาศเริ่มการผลิต MK 32 บิตที่ใช้ประโยชน์จากอุตสาหกรรม
แกน STM32 ในแอปพลิเคชันราคาประหยัด MCU ของตระกูล STM32F100 Value Line ได้รับการออกแบบมาสำหรับอุปกรณ์ที่ประสิทธิภาพของ MCU 16 บิตยังไม่เพียงพอ และฟังก์ชันการทำงานที่หลากหลายของอุปกรณ์ 32 บิต "ปกติ" นั้นมีซ้ำซ้อน MCU กลุ่มผลิตภัณฑ์ STM32F100 มีพื้นฐานมาจากคอร์ ARM CortexM3 ที่ทันสมัย ​​พร้อมด้วยอุปกรณ์ต่อพ่วงที่ได้รับการปรับแต่งเพื่อใช้ในแอปพลิเคชันทั่วไปที่ใช้ MCU 16 บิต ประสิทธิภาพของ MCU STM32F100 ที่ 24 MHz นั้นเหนือกว่า MCU 16 บิตส่วนใหญ่ บรรทัดนี้ประกอบด้วยอุปกรณ์ที่มีพารามิเตอร์ต่างๆ:
● จาก 16 ถึง 128 กิโลไบต์ของหน่วยความจำแฟลชโปรแกรม;
● RAM ตั้งแต่ 4 ถึง 8 กิโลไบต์;
● พอร์ตอินพุต/เอาท์พุต GPIO สูงสุด 80 พอร์ต;
● ตัวจับเวลา 16 บิตสูงสุดเก้าตัวพร้อมฟังก์ชันขั้นสูง
● ตัวจับเวลาจ้องจับผิดสองตัว;
● ADC 12 บิตความเร็วสูง 16 ช่อง;
● DAC 12 บิตสองตัวพร้อมเครื่องกำเนิดสัญญาณในตัว
● อินเทอร์เฟซ UART สูงสุดสามแบบที่รองรับโหมด IrDA, LIN และ ISO7816
● มากถึงสองอินเทอร์เฟซ SPI;
● อินเทอร์เฟซ I2C สูงสุดสองตัวที่รองรับโหมด SMBus และ PMBus
● การเข้าถึงหน่วยความจำโดยตรง 7 ช่องทาง (DMA);
● อินเทอร์เฟซ CEC (Consumer Electronics Control) รวมอยู่ในมาตรฐาน HDMI;
● นาฬิกาเรียลไทม์ (RTC);
● ตัวควบคุมการขัดจังหวะแบบซ้อน NVIC

แผนภาพการทำงานของ STM32F100 แสดงในรูปที่ 1

ข้าว. 1. สถาปัตยกรรมของสาย MK STM32F100

ความสะดวกสบายเพิ่มเติมคือความเข้ากันได้ของพินของอุปกรณ์ซึ่งช่วยให้สามารถใช้ MK ใด ๆ ของตระกูลที่มีฟังก์ชันและหน่วยความจำที่ดีกว่าได้หากจำเป็นโดยไม่ต้องใช้แผงวงจรพิมพ์ซ้ำ คอนโทรลเลอร์กลุ่ม STM32F100 ผลิตขึ้นในแพ็คเกจสามประเภท LQFP48, LQFP64 และ LQFP100 โดยมีพิน 48, 64 และ 100 ตามลำดับ การกำหนดพินจะแสดงในรูปที่ 2, 3 และ 4 กรณีดังกล่าวสามารถติดตั้งบนแผงวงจรพิมพ์ได้โดยไม่ต้องใช้อุปกรณ์พิเศษซึ่งเป็นปัจจัยสำคัญในการผลิตขนาดเล็ก


ข้าว. 2. STM32 MCU ในแพ็คเกจ LQFP48 3. STM32 MCU ในแพ็คเกจ LQFP64


ข้าว. 4. STM32 MCU ในแพ็คเกจ LQFP100

STM32F100 เป็นอุปกรณ์ราคาไม่แพงและได้รับการปรับแต่งมาโดยเฉพาะ ซึ่งใช้คอร์ CortexM3 ซึ่งได้รับการสนับสนุนโดยสภาพแวดล้อมการพัฒนาขั้นสูงสำหรับไมโครคอนโทรลเลอร์ตระกูล STM32 ซึ่งประกอบด้วย
ไลบรารีฟรีสำหรับอุปกรณ์ต่อพ่วงทั้งหมด รวมถึงการควบคุมมอเตอร์และคีย์บอร์ดแบบสัมผัส

แผนภาพการเชื่อมต่อ STM32F100C4
ลองพิจารณาการใช้งานจริงของ MK โดยใช้ตัวอย่างอุปกรณ์ STM32F100C4 ที่ง่ายที่สุดซึ่งมีบล็อกหลักทั้งหมดของสาย STM32F100 แผนภาพวงจรไฟฟ้าของ STM32F100C4 แสดงในรูปที่ 5


ข้าว. 5. แผนภาพการเชื่อมต่อสำหรับ MK STM32F100C4

ตัวเก็บประจุ C1 ช่วยให้มั่นใจได้ว่า MK จะถูกรีเซ็ตเมื่อเปิดเครื่อง และตัวเก็บประจุ C2-C6 จะกรองแรงดันไฟฟ้า ตัวต้านทาน R1 และ R2 จำกัดกระแสสัญญาณของพิน MK ออสซิลเลเตอร์ภายในถูกใช้เป็นแหล่งสัญญาณนาฬิกา ดังนั้นจึงไม่จำเป็นต้องใช้คริสตัลภายนอก


อินพุต BOOT0 และ BOOT1 ช่วยให้คุณสามารถเลือกวิธีการโหลด MK เมื่อเปิดเครื่องตามตาราง อินพุต BOOT0 เชื่อมต่อกับบัสที่มีศักยภาพเป็นศูนย์ผ่านตัวต้านทาน R2 ซึ่งป้องกันพิน BOOT0 จากการลัดวงจรเมื่อใช้เป็นพอร์ตเอาต์พุตของ PB2 การใช้ตัวเชื่อมต่อ J1 และจัมเปอร์หนึ่งตัวคุณสามารถเปลี่ยนศักยภาพที่อินพุต BOOT0 ได้ดังนั้นจึงกำหนดวิธีการโหลด MK - จากหน่วยความจำแฟลชหรือจาก bootloader ในตัว หากคุณต้องการโหลด MK จาก RAM คุณสามารถเชื่อมต่อขั้วต่อที่คล้ายกันพร้อมจัมเปอร์กับอินพุต BOOT1 ได้
การเขียนโปรแกรม MK ดำเนินการผ่านพอร์ตอนุกรม UART1 หรือผ่านโปรแกรมเมอร์พิเศษ - ดีบักเกอร์ JTAG หรือ STLink หลังเป็นส่วนหนึ่งของอุปกรณ์ดีบักยอดนิยม STM32VLDISCOVERY ดังแสดงในรูปที่ 6 บนบอร์ด STM32VLDIS COVERY ตัวเชื่อมต่อ 4 พินของโปรแกรมเมอร์ - ดีบักเกอร์ STLink - ถูกกำหนดให้เป็น SWD ผู้เขียนบทความแนะนำให้เขียนโปรแกรม MK ผ่านพอร์ตอนุกรม UART1 เนื่องจากง่ายกว่ามากไม่จำเป็นต้องใช้อุปกรณ์พิเศษและไม่ด้อยกว่าความเร็วของ JTAG หรือ ST Link คอมพิวเตอร์ส่วนบุคคล (PC) ใด ๆ ที่มีพอร์ต COM แบบอนุกรมหรือพอร์ต USB พร้อมตัวแปลง USBRS232 สามารถใช้เป็นอุปกรณ์ควบคุมที่สามารถสร้างคำสั่งและแสดงผลลัพธ์ของโปรแกรม MK เช่นเดียวกับโปรแกรมเมอร์

ในการเชื่อมต่อพอร์ต COM ของพีซีกับ MK ตัวแปลงสัญญาณ RS232 ใด ๆ ให้เป็นระดับสัญญาณลอจิคัลตั้งแต่ 0 ถึง 3.3 V เช่น ADM3232 microcircuit ก็เหมาะสม สายส่ง TXD ของพอร์ตอนุกรมของคอมพิวเตอร์หลังจากตัวแปลงระดับควรเชื่อมต่อกับอินพุต PA10 ของไมโครคอนโทรลเลอร์และสายรับ RXD ผ่านตัวแปลงที่คล้ายกันไปยังเอาต์พุต PA9

หากคุณต้องการใช้นาฬิกา MK ที่ไม่ลบเลือนคุณควรเชื่อมต่อแบตเตอรี่ CR2032 ที่มีแรงดันไฟฟ้า 3 V และตัวสะท้อนควอทซ์ที่มีความถี่ 32768 Hz เพื่อจุดประสงค์นี้ MK จึงติดตั้งพิน Vbat/GND และ OSC32_IN/OSC32_OUT ต้องถอดพิน Vbat ออกจากพาวเวอร์บัส 3.3 V ก่อน

เทอร์มินัลอิสระที่เหลือของ MK สามารถใช้งานได้ตามต้องการ ในการทำเช่นนี้ควรเชื่อมต่อกับตัวเชื่อมต่อที่อยู่รอบปริมณฑลของแผงวงจรพิมพ์สำหรับ MK โดยการเปรียบเทียบกับอุปกรณ์ Arduino ยอดนิยมและบอร์ดดีบัก STM32VLDISCOVERY


ข้าว. 6. อุปกรณ์ดีบัก STM32VLDISCOVERY


แผนภาพวงจรไฟฟ้า STM32VLDISCOVERY

ดังนั้นขึ้นอยู่กับวัตถุประสงค์และวิธีการใช้งาน MK คุณสามารถเชื่อมต่อองค์ประกอบที่จำเป็นเข้ากับองค์ประกอบดังกล่าวเพื่อใช้บล็อกและพอร์ตการทำงานอื่น ๆ เช่น ADC, DAC, SPI, I2C เป็นต้น ในอนาคตอุปกรณ์เหล่านี้จะได้รับการพิจารณาอย่างละเอียดมากขึ้น

การเขียนโปรแกรม
ปัจจุบัน หลายบริษัทนำเสนอเครื่องมือสำหรับสร้างและแก้ไขโปรแกรมสำหรับไมโครคอนโทรลเลอร์ STM32 ซึ่งรวมถึง Keil จาก ARM Ltd, IAR Embedded Workbench สำหรับ ARM, Atol lic TrueStudio, CooCox IDE, GCC และ Eclipse IDE นักพัฒนาสามารถเลือกซอฟต์แวร์ได้ตามความต้องการ ด้านล่างนี้เราจะอธิบายชุดเครื่องมือ Keil uVision 4 จาก บริษัท Keil ซึ่งรองรับไมโครคอนโทรลเลอร์หลายประเภทมีระบบเครื่องมือแก้ไขข้อบกพร่องที่พัฒนาขึ้นและสามารถใช้งานได้ฟรีโดยมีข้อ จำกัด เกี่ยวกับขนาดของรหัสที่สร้างขึ้น 32 กิโลไบต์ ( ซึ่งในความเป็นจริงคือค่าสูงสุดสำหรับไมโครคอนโทรลเลอร์ที่อยู่ระหว่างการพิจารณา)

เริ่มต้นอย่างง่ายและรวดเร็วด้วย CooCox CoIDE

มาเริ่มกันเลย ไปที่เว็บไซต์อย่างเป็นทางการของ CooCox และดาวน์โหลด CooCox CoIDE เวอร์ชันล่าสุด หากต้องการดาวน์โหลด คุณต้องลงทะเบียน การลงทะเบียนทำได้ง่ายและฟรี จากนั้นติดตั้งไฟล์ที่ดาวน์โหลดมาและเรียกใช้

คูค็อกซ์ โคไอดี- สภาพแวดล้อมการพัฒนาที่ใช้ Eclipse ซึ่งนอกเหนือจาก STM32 แล้ว ยังรองรับไมโครคอนโทรลเลอร์ตระกูลอื่นๆ อีกมากมาย: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro ฯลฯ ด้วย CoIDE เวอร์ชันใหม่แต่ละเวอร์ชัน รายการไมโครคอนโทรลเลอร์ได้รับการปรับปรุงอย่างต่อเนื่อง หลังจากติดตั้ง CoIDE สำเร็จแล้ว ให้รัน:

หน้าต่างเริ่มต้นขั้นตอนที่ 1 จะปรากฏขึ้น ซึ่งคุณจะต้องเลือกผู้ผลิตไมโครคอนโทรลเลอร์ของเรา กด ST และไปที่ขั้นตอนที่ 2 (การเลือกไมโครคอนโทรลเลอร์) ซึ่งคุณจะต้องเลือกรุ่นเฉพาะ เรามี STM32F100RBT6B ดังนั้นคลิกที่รุ่นที่เกี่ยวข้อง:

ทางด้านขวา หน้าต่างวิธีใช้จะแสดงคุณลักษณะโดยย่อของแต่ละชิป หลังจากเลือกไมโครคอนโทรลเลอร์ที่เราต้องการแล้ว ให้ดำเนินการตามขั้นตอนที่สาม ขั้นตอนที่ 3 - เพื่อเลือกไลบรารีที่จำเป็นสำหรับการทำงาน:

มาสร้างโปรเจ็กต์ง่ายๆ สำหรับการกะพริบ LED ตามธรรมเนียมในการเรียนรู้ไมโครคอนโทรลเลอร์กันดีกว่า

ในการดำเนินการนี้ เราจำเป็นต้องมีไลบรารี GPIO เมื่อเปิดใช้งาน CoIDE จะขอให้คุณสร้างโครงการใหม่ คลิกใช่ในข้อเสนอนี้ ระบุโฟลเดอร์ที่จะจัดเก็บโครงการของเราและชื่อ ในเวลาเดียวกัน CoIDE จะเชื่อมต่อกับโปรเจ็กต์อีก 3 รายการที่จำเป็นสำหรับการทำงานของห้องสมุด และจะสร้างโครงสร้างโปรเจ็กต์ที่จำเป็นทั้งหมดด้วย:

ข้อดีอีกประการหนึ่งของ CoIDE ก็คือสามารถโหลดตัวอย่างลงในสภาพแวดล้อมการพัฒนาได้โดยตรง ในแท็บส่วนประกอบคุณจะเห็นว่ามีตัวอย่างสำหรับเกือบทุกไลบรารี คลิกที่ GPIO (มี 4 ตัวอย่าง) และดู:

คุณสามารถเพิ่มตัวอย่างของคุณเองได้ที่นั่น ดังที่คุณเห็นในภาพหน้าจอด้านบน ตัวอย่างมีโค้ดสำหรับการกะพริบไฟ LED GPIO_Blink อยู่แล้ว คุณสามารถคลิกปุ่มเพิ่ม จากนั้นมันจะถูกเพิ่มเข้าไปในโปรเจ็กต์ แต่เป็นไฟล์ที่รวมไว้ ดังนั้นเราจะดำเนินการแตกต่างออกไป และเพียงแค่คัดลอกโค้ดตัวอย่างทั้งหมดลงในไฟล์ main.c สิ่งเดียวคือการแทนที่บรรทัด void GPIO_Blink(void) ด้วย int main(void) ดังนั้น กด F7 (หรือเลือก Project->Build จากเมนู) เพื่อคอมไพล์โปรเจ็กต์และ... โชคไม่ดีเลย!

สภาพแวดล้อมต้องการคอมไพเลอร์ GCC แต่เราไม่มี ดังนั้น ให้ไปที่หน้าเครื่องมือ GNU สำหรับโปรเซสเซอร์ที่ฝังตัว ARM เลือกประเภทระบบปฏิบัติการของคุณทางด้านขวา และดาวน์โหลด Toolchain เวอร์ชันล่าสุด จากนั้นเรารันไฟล์และติดตั้ง gcc toolchain ถัดไปในการตั้งค่า CoIDE เราจะระบุเส้นทางที่ถูกต้องไปยัง toolchain:

กด F7 อีกครั้ง (Project->Build) และดูว่าการรวบรวมสำเร็จ:

สิ่งที่เหลืออยู่คือการแฟลชไมโครคอนโทรลเลอร์ ในการทำเช่นนี้เราเชื่อมต่อบอร์ดของเราเข้ากับคอมพิวเตอร์โดยใช้ USB จากนั้นในการตั้งค่าดีบักเกอร์คุณต้องติดตั้ง ST-Link โดยในเมนูให้เลือกโครงการ -> การกำหนดค่าและเปิดแท็บดีบักเกอร์ เลือก ST-Link จากรายการแบบเลื่อนลงและปิดหน้าต่าง:

มาลองแฟลช MK กัน ในเมนูให้เลือก Flash->ดาวน์โหลดโปรแกรม (หรือคลิกที่ไอคอนที่เกี่ยวข้องบนแถบเครื่องมือ) และดูว่า MK ได้รับการแฟลชสำเร็จแล้ว:

เราเห็นไฟ LED กะพริบบนบอร์ด ฉันคิดว่าการจัดเตรียมวิดีโอหรือภาพถ่ายไม่สมเหตุสมผล เพราะ... ทุกคนเห็นมัน

นอกจากนี้ โหมดการแก้ไขข้อบกพร่องต่างๆ ยังทำงานใน CoIDE โดยกด CTRL+F5 (หรือในเมนู Debug->Debug):

นั่นคือทั้งหมดที่ อย่างที่คุณเห็น การตั้งค่าและการทำงานกับ CoIDE นั้นง่ายมาก ฉันหวังว่าบทความนี้จะสนับสนุนให้คุณศึกษาไมโครคอนโทรลเลอร์ STM32 ที่มีแนวโน้มและราคาไม่แพง

ฉันยินดีต้อนรับผู้ชื่นชอบการเขียนโปรแกรม ไมโครคอนโทรลเลอร์ และอุปกรณ์อิเล็กทรอนิกส์ทั่วไปเข้าสู่เว็บไซต์ของเรา! ในบทความนี้ ฉันจะบอกคุณเล็กน้อยเกี่ยวกับสิ่งที่เราจะทำที่นี่ กล่าวคือเกี่ยวกับหลักสูตรการฝึกอบรมเกี่ยวกับไมโครคอนโทรลเลอร์ ARM

ก่อนอื่น เรามาดูกันว่าคุณจำเป็นต้องรู้อะไรบ้างและสามารถทำอะไรได้บ้างเพื่อเริ่มเรียนรู้ ARM แต่โดยหลักการแล้ว ไม่มีอะไรซับซ้อนและน่าหลงใหลสุด ๆ 😉 แน่นอนว่าผู้คนมักจะเปลี่ยนมาใช้คอนโทรลเลอร์ ARM หลังจากที่เล่นกับ PIC และ AVR มามากพอแล้ว นั่นคือส่วนใหญ่เป็นนักพัฒนาที่มีประสบการณ์ แต่ฉันจะพยายามอธิบายทุกอย่างที่เราจะวิเคราะห์อย่างละเอียดและชัดเจนที่สุดเพื่อให้ผู้ที่ตัดสินใจลองใช้การเขียนโปรแกรมไมโครคอนโทรลเลอร์เป็นครั้งแรกสามารถเข้าใจเนื้อหาได้อย่างง่ายดาย อย่างไรก็ตาม หากคุณมีคำถามใด ๆ หรือหากมีบางอย่างไม่ทำงานตามที่ตั้งใจไว้ เขียนความคิดเห็น ฉันจะพยายามคิดออกและช่วยเหลือ

ตอนนี้เรามาดูปัญหาด้านเทคนิคกันดีกว่า) ฉันได้พูดถึงชื่อ "หลักสูตรการฝึกอบรม ARM" ไปแล้วหลายครั้ง แต่โดยส่วนใหญ่แล้วสิ่งนี้ไม่เป็นความจริงทั้งหมด ไม่มีสิ่งที่เรียกว่าไมโครคอนโทรลเลอร์ ARM มีคอนโทรลเลอร์ที่มีคอร์ ARM(!) แต่คุณเห็นแล้วว่าสิ่งนี้ยังคงไม่เหมือนเดิม ดังนั้นอุปกรณ์ดังกล่าวจึงผลิตโดยบริษัทหลายแห่ง โดยที่ STMicroelectronics และ NXP Semiconductors มีความโดดเด่น ดังนั้นพวกเขาจึงผลิตคอนโทรลเลอร์ STM และ LPC ฉันเลือกใช้ STM32 ฉันชอบมันมากกว่า =) STM เป็นเรื่องน่าหลงใหลมากที่เมื่อคุณได้จัดการกับ MK ใดๆ จากกลุ่มผลิตภัณฑ์ STM32F10x แล้ว คุณจะไม่มีปัญหาใดๆ เลย หนึ่งบรรทัด – หนึ่งแผ่นข้อมูล อย่างไรก็ตามมีบอร์ดพัฒนาทั้งราคาแพงและไม่แพงจำนวนมากที่มีคอนโทรลเลอร์ STM32 ซึ่งเป็นที่น่าพอใจมากแม้ว่าในตอนแรกเราจะทำการดีบักโปรแกรมของเราในเครื่องจำลองเพื่อประเมินความสามารถของคอนโทรลเลอร์ก่อนที่จะซื้อฮาร์ดแวร์ ในกรณีนี้คือเว็บไซต์อย่างเป็นทางการของ STMicroelectronics -

ยังไงก็ตามเราย้ายไปยังหัวข้อของคอมไพเลอร์ได้อย่างราบรื่น ดังนั้นฉันจะพูดสองสามคำเกี่ยวกับเรื่องนี้ ฉันเลือก Keil โดยไม่ต้องคิดซ้ำสอง เพราะตัวจำลองในตัวอันทรงพลัง คุณสามารถดู UART ที่นั่น และที่รีจิสเตอร์ใดก็ได้ และแม้แต่เครื่องวิเคราะห์ลอจิกก็มีให้ใช้งาน กล่าวอีกนัยหนึ่ง Keil ทิ้งฉันไว้เพียงความประทับใจที่น่าพึงพอใจเป็นส่วนใหญ่แม้ว่าจะมีข้อเสียอยู่บ้าง แต่ก็ไม่ใช่หายนะ ดังนั้นคุณจึงสามารถดาวน์โหลด Keil uvision4 จากปิดได้อย่างปลอดภัย เว็บไซต์(). จริงอยู่มีอยู่อย่างหนึ่ง แต่ - จ่าย IDE แล้ว แต่โหมดสาธิตใช้งานได้โดยจำกัดรหัสไว้ที่ 32 kB ซึ่งเกินพอสำหรับเราในตอนนี้ สำหรับผู้ที่ยังไม่เพียงพอ Keil มีรอยแตกจำนวนมาก 😉 ทุกอย่างได้รับการติดตั้งโดยไม่มีปัญหา - เรากระตุ้นเพิ่มเติมอีกสองสามครั้งและทุกอย่างติดตั้งได้อย่างสมบูรณ์แบบและใช้งานได้โดยไม่ต้องเต้นรำเพิ่มเติมกับแทมบูรีน

จริงๆ แล้ว นั่นคือทั้งหมดที่ฉันอยากจะบอกคุณที่นี่ ถึงเวลาที่ต้องเปลี่ยนจากคำพูดไปสู่การกระทำ แต่นั่นคือในบทความถัดไป เราจะเรียนรู้การเขียนโปรแกรมไมโครคอนโทรลเลอร์ STM32 ตั้งแต่เริ่มต้น!

เมื่อเร็ว ๆ นี้เพื่อนร่วมงานคนหนึ่งทำให้ฉันสนใจแนวคิดในการสร้างบ้านอัจฉริยะ และฉันก็ยังสามารถสั่งเซ็นเซอร์หลายสิบตัวให้ตัวเองได้ด้วย คำถามเกิดขึ้นเกี่ยวกับการเลือก ไมโครคอนโทรลเลอร์(ต่อไปนี้จะเรียกว่า MK) หรือกระดาน หลังจากค้นหาฉันพบหลายตัวเลือก ในหมู่พวกเขามี อาร์ดูโน่(รวมถึงร่างโคลนของเขาด้วย ซึ่งหนึ่งในนั้นฉันสั่งให้ตัวเองเพื่อความสนุกสนาน) และ ยิงจรวดขีปนาวุธแต่ทั้งหมดนี้ซ้ำซ้อนและยุ่งยาก (แม้ว่าในแง่ของการเขียนโปรแกรมจะง่ายกว่ามาก แต่ฉันจะไม่ยกหัวข้อของโฮลิวาร์ทุกคนมีรสนิยมของตัวเอง) ในท้ายที่สุดฉันตัดสินใจที่จะไม่ตัดสินใจเลือกบอร์ดสำเร็จรูป แต่จะเอาเฉพาะ MK และทำทุกอย่างตั้งแต่เริ่มต้น สุดท้ายฉันก็เลือกระหว่าง แอตเมล แอตตินี่ (2313), แอตเมล เอทีเมก้า(ตัดสินใจปฏิเสธเพราะหาเงินไม่พอ) เอสทีเอ็ม32(เยื่อหุ้มสมองบนแกนกลาง แขน). ฉันเคยเล่นกับเด็กวัยรุ่นมาแล้ว ฉันก็เลยรับมันไปเอง STM32VL-การค้นพบ. เรียกได้ว่าเป็นการแนะนำบทความชุดนี้เลยก็ว่าได้ เอสทีเอ็ม32. ผมขอจองด่วน ผมจะไม่เป็นคนเขียนบทความพวกนี้ซะส่วนใหญ่ เพราะ... ฉันแค่เรียนรู้ด้วยตัวเอง ที่นี่ฉันเผยแพร่เพื่อตัวเองเป็นหลัก เพื่อให้ง่ายต่อการค้นหาหากฉันลืมบางสิ่งบางอย่าง ไปกันเลย!

ข้อมูลทั่วไป

ไมโครคอนโทรลเลอร์ครอบครัว เอสทีเอ็ม32มีพอร์ต I/O 16 บิตสูงสุดเจ็ดพอร์ตพร้อมชื่อตั้งแต่ PORTA ถึง PORTG ในรูปแบบเฉพาะ ไมโครคอนโทรลเลอร์โดยไม่มีข้อยกเว้น หมุดพอร์ตทั้งหมดจะพร้อมใช้งาน จำนวนทั้งหมดขึ้นอยู่กับประเภทของที่อยู่อาศัยและระบุไว้ในแผ่นข้อมูลสำหรับตระกูลย่อยที่เกี่ยวข้อง

หากต้องการเปิดใช้งานพอร์ต x คุณต้องเชื่อมต่อกับบัส APB2 ก่อนโดยตั้งค่าบิต IOpxEN ที่สอดคล้องกันในการลงทะเบียนเปิดใช้งานนาฬิกาต่อพ่วง RCC_APB2ENR:

RCC->APB2ENR |= RCC_APB2ENR_IOpxEN; // เปิดใช้งานการตอกบัตร PORTx

การจัดการท่าเรือ เอสทีเอ็ม32ดำเนินการโดยใช้ชุดรีจิสเตอร์ 32 บิตเจ็ดชุด:

  • GPIOx_CRL, GPIOx_CRH– ตั้งค่าโหมดการทำงานของแต่ละบิตพอร์ตเป็นอินพุตหรือเอาท์พุต กำหนดการกำหนดค่าของสเตจอินพุตและเอาท์พุต
  • GPIOx_IDR– ป้อนข้อมูลการลงทะเบียนเพื่ออ่านสถานะทางกายภาพของพอร์ต x พิน
  • GPIOx_ODR– เอาท์พุตรีจิสเตอร์จะเขียนข้อมูลไปยังพอร์ตโดยตรง
  • GPIOx_BSRR– อะตอมมิกรีเซ็ตและการลงทะเบียนการตั้งค่าบิตพอร์ต
  • GPIOx_BSR– การลงทะเบียนรีเซ็ตบิตพอร์ต
  • GPIOx_LCKR– รีจิสเตอร์ล็อคการกำหนดค่าพิน

โหมดการทำงานของพิน GPIO

โหมดการทำงานของพินแต่ละตัวถูกกำหนดโดยการรวมกันของบิต โหมดและ CNFy ลงทะเบียน GPIOx_CRLและ GPIOx_CRH(ต่อไปนี้: x คือชื่อพอร์ต y คือหมายเลขบิตพอร์ต)

GPIOx_CRL- การกำหนดค่าพินรีจิสเตอร์ 0...7 พอร์ต x:

โครงสร้างการลงทะเบียน GPIOx_CRHโครงสร้างที่คล้ายกัน GPIOx_CRLและได้รับการออกแบบมาเพื่อควบคุมโหมดการทำงานของพินอาวุโสของพอร์ต (บิต 8...15)

บิต MODEy ของรีจิสเตอร์ที่ระบุกำหนดทิศทางเอาต์พุตและขีดจำกัดความเร็วในการสลับในโหมดเอาต์พุต:

  • โหมด = 00:โหมดอินพุต (สถานะหลังจากรีเซ็ต);
  • โหมด = 01:โหมดเอาต์พุตความเร็วสูงสุด – 10 MHz;
  • โหมด = 10:โหมดเอาต์พุตความเร็วสูงสุด – 2 MHz;
  • โหมด = 11:โหมดเอาต์พุตความเร็วสูงสุด – 50 MHz

บิต CNF ระบุการกำหนดค่าของระยะเอาต์พุตของพินที่เกี่ยวข้อง:

ในโหมดเข้าสู่ระบบ:

  • CNFy = 00:อินพุตแบบอะนาล็อก;
  • CNFy = 01:อินพุตในสถานะที่สาม (สถานะหลังจากรีเซ็ต);
  • CNFy = 10:อินพุตที่มีตัวต้านทานแบบดึงขึ้น (ถ้า PxODR=1) หรือแบบดึงลง (ถ้า PxODR=0)
  • CNFy = 11:ที่สงวนไว้.

ในโหมดออก:

  • CNFy = 00:เอาต์พุตแบบกดดึงวัตถุประสงค์ทั่วไป
  • CNFy = 01:ท่อระบายน้ำแบบเปิดวัตถุประสงค์ทั่วไป
  • CNFy = 10:เอาต์พุตแบบพุชพูลพร้อมฟังก์ชันทางเลือก
  • CNFy = 11:เปิดท่อระบายน้ำพร้อมฟังก์ชันทางเลือก

เพื่อเพิ่มภูมิคุ้มกันทางเสียง บัฟเฟอร์อินพุตทั้งหมดจะมีทริกเกอร์ Schmidt ส่วนหนึ่งของข้อสรุป เอสทีเอ็ม32ซึ่งมีไดโอดป้องกันเชื่อมต่อกับบัสทั่วไปและบัสจ่ายไฟ มีการทำเครื่องหมายในเอกสารข้อมูลเป็น FT (ทนทานต่อ 5V) - เข้ากันได้กับแรงดันไฟฟ้า 5 โวลต์

การปกป้องบิตการกำหนดค่า GPIO

เพื่อป้องกันบิตในการลงทะเบียนการกำหนดค่าจากการเขียนที่ไม่ได้รับอนุญาต เอสทีเอ็ม32มีการลงทะเบียนล็อคการตั้งค่าไว้ GPIOx_LCKR
GPIOx_LCKR- การลงทะเบียนล็อคการตั้งค่าเอาต์พุตพอร์ต:

เพื่อป้องกันการตั้งค่าของพินพอร์ตแต่ละอัน จะต้องตั้งค่าบิต LCKy ที่สอดคล้องกัน จากนั้นจึงดำเนินการบันทึกตามลำดับในหมวดหมู่ ลคค่า "1" - "0" - "1" และการดำเนินการอ่านการลงทะเบียนสองครั้ง ลคเคอาร์ซึ่งในกรณีที่บล็อคสำเร็จก็จะให้ส่วนนั้น ลคค่า "0" และ "1" การป้องกันบิตการตั้งค่าจะยังคงมีผลจนกว่าจะรีบูตไมโครคอนโทรลเลอร์ครั้งถัดไป

ไฟล์คำจำกัดความอุปกรณ์ต่อพ่วง ไมโครคอนโทรลเลอร์ เอสทีเอ็ม32 stm32f10x.h กำหนดกลุ่มการลงทะเบียนที่แยกจากกันซึ่งรวมเป็นหนึ่งเดียวโดยมีวัตถุประสงค์การใช้งานทั่วไป (รวมถึง จีพีโอ) เป็นโครงสร้างของภาษา C และลงทะเบียนตัวเองเป็นองค์ประกอบของโครงสร้างนี้ ตัวอย่างเช่น:

GPIOC->BSRR- การตั้งค่าพอร์ต GPIOC / รีเซ็ตการลงทะเบียน BSRR
ลองใช้คำจำกัดความจากไฟล์ stm32f10x.h เพื่อแสดงวิธีทำงานกับรีจิสเตอร์ I/O ของไมโครคอนโทรลเลอร์ STM32F100RBติดตั้งอยู่ในชุดสตาร์ทเตอร์ STM32VLDISCOVERY:

#include "stm32F10x.h" u32 tmp; int main (เป็นโมฆะ) ( RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // เปิดใช้งานการตอกบัตร PORTC GPIOC->CRH |= GPIO_CRH_MODE8; // เอาต์พุต LED4 PC8 ไปยังเอาต์พุต GPIOC->CRH &=~GPIO_CRH_CNF8; // Push-pull เอาต์พุตบน PC8 GPIOC->CRH |= GPIO_CRH_MODE9; // เอาต์พุต LED3 PC9 ไปยังเอาต์พุต GPIOC->CRH &=~GPIO_CRH_CNF9; // เอาต์พุตแบบ Push-pull บน PC9 GPIOA->CRL&=~GPIO_CRL_MODE0; // "USER ปุ่ม " PA0 - เพื่ออินพุต // บล็อกการตั้งค่าพิน PC8, PC9 GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9| GPIO_LCKR_LCKK; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LC K9|GPIO_LCKR_LCKK;tmp= GPIOC-> LCKR; tmp=GPIOC->LCKR; )

เขียนและอ่าน GPIO

พอร์ตอินพุตมีไว้สำหรับการเขียนและการอ่าน GPIOx_IDRและวันหยุด GPIOx_ODRการลงทะเบียนข้อมูล

เขียนไปยังเอาท์พุตรีจิสเตอร์ โอดีอาร์พอร์ตที่กำหนดค่าไว้สำหรับเอาต์พุต ตั้งค่าระดับเอาต์พุตของบิตทั้งหมดของพอร์ตตามค่าที่บันทึกไว้ หากมีการกำหนดค่าพินเป็นอินพุตแบบดึงขึ้น สถานะของรีจิสเตอร์บิตที่สอดคล้องกัน โอดีอาร์เปิดใช้งานการดึงขึ้นของเอาต์พุตไปยังพาวเวอร์บัส (ดึงขึ้น, ODR=1) หรือบัสทั่วไปของไมโครคอนโทรลเลอร์ (ดึงลง, ODR=0)

อ่านทะเบียน ไอดีอาร์ส่งคืนค่าสถานะของพินไมโครคอนโทรลเลอร์ที่กำหนดค่าเป็นอินพุต:

// หากกดปุ่ม (PA0=1) ให้ตั้งค่าบิตพอร์ต C หรือรีเซ็ต ถ้า (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; อย่างอื่น GPIOC->ODR=0x0000;

การรีเซ็ตและการตั้งค่าบิตพอร์ต

สำหรับการรีเซ็ตอะตอมมิกและการตั้งค่าบิต จีพีโอในไมโครคอนโทรลเลอร์ เอสทีเอ็ม32มีวัตถุประสงค์เพื่อลงทะเบียน GPIOx_BSRR. แบบดั้งเดิมสำหรับสถาปัตยกรรม แขนวิธีการจัดการบิตรีจิสเตอร์ที่ไม่จำเป็นต้องใช้การดำเนินการประเภท "อ่าน-แก้ไข-เขียน"อนุญาตให้คุณตั้งค่าและรีเซ็ตบิตพอร์ตโดยเพียงแค่เขียนหนึ่งลงในบิตที่ตั้งไว้ BS (บิตเซ็ต) และรีเซ็ต BR (บิตรีเซ็ต) ลงทะเบียน บีเอสอาร์อาร์. ในกรณีนี้ การเขียนบิตเป็นศูนย์ลงในรีจิสเตอร์จะไม่ส่งผลต่อสถานะของพินที่เกี่ยวข้อง

GPIOx_BSRR– ลงทะเบียนเพื่อรีเซ็ตและตั้งค่าบิตพอร์ต:

GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // เปิดไฟ LED4 (PC8) ปิด LED3 GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8; // เปิดไฟ LED3 (PC9) ปิด LED4

ฟังก์ชั่นทางเลือก จีพีโอและการมอบหมายงานใหม่ของพวกเขา (การแมปใหม่)
วงจรภายนอกเกือบทั้งหมดเพื่อวัตถุประสงค์พิเศษ เอสทีเอ็ม32(รวมถึงลีดสำหรับเชื่อมต่อตัวสะท้อนควอทซ์ JTAG/SWDและอื่นๆ) สามารถเปิดใช้งานบนพินที่เกี่ยวข้องของไมโครคอนโทรลเลอร์ หรือปิดใช้งานจากหมุดเหล่านี้เพื่อให้สามารถใช้เป็นพินอเนกประสงค์ได้ การเลือกฟังก์ชันเอาต์พุตทางเลือกจะดำเนินการโดยใช้รีจิสเตอร์ที่มีคำนำหน้า “เอเอฟไอโอ”_.
นอกจากนี้การลงทะเบียน เอเอฟไอโอ _ อนุญาตให้คุณเลือกหลายตัวเลือกสำหรับตำแหน่งของฟังก์ชั่นพิเศษบนพินไมโครคอนโทรลเลอร์ สิ่งนี้ใช้โดยเฉพาะกับเอาต์พุตของอินเทอร์เฟซการสื่อสาร ตัวจับเวลา (รีจิสเตอร์ AFIO_MAPR) พินขัดจังหวะภายนอก (รีจิสเตอร์ AFIO_EXTICR) ฯลฯ