- พื้นฐานของการสื่อสาร UART
- ข้อกำหนดฮาร์ดแวร์และการตั้งค่า
- แผนภาพวงจรสำหรับ Nuvoton N76E003 UART Communication
- UART Pins บนไมโครคอนโทรลเลอร์ Nuvoton N76E003
- UART Registers ในไมโครคอนโทรลเลอร์ Nuvoton N76E003
- UART โหมดการทำงานใน N76E003
- การเขียนโปรแกรม Nuvoton N76E003 สำหรับการสื่อสาร UART
UART ย่อมาจาก Universal Asynchronous Receiver / Transmitter และเป็นคุณสมบัติฮาร์ดแวร์ที่มีประโยชน์ในหน่วยไมโครคอนโทรลเลอร์ใด ๆ ไมโครคอนโทรลเลอร์จำเป็นต้องรับข้อมูลประมวลผลและส่งไปยังอุปกรณ์อื่น ๆ มีโปรโตคอลการสื่อสารหลายประเภทที่มีอยู่ในไมโครคอนโทรลเลอร์อย่างไรก็ตาม UART เป็นโปรโตคอลที่ใช้มากที่สุดในบรรดาโปรโตคอลการสื่อสารอื่น ๆ เช่น SPI และ I2C หากมีคนต้องการรับหรือส่งข้อมูลแบบอนุกรม UART เป็นตัวเลือกที่ง่ายและธรรมดาที่สุด ข้อดีของ UART คือต้องใช้สายไฟสองเส้นในการส่งข้อมูลระหว่างอุปกรณ์ ต่อจากบทช่วยสอนไมโครคอนโทรลเลอร์ Nuvoton ของเราในบทความนี้เราจะเรียนรู้วิธีการสื่อสารแบบอนุกรมโดยใช้ไมโครคอนโทรลเลอร์ N76E003
พื้นฐานของการสื่อสาร UART
ตอนนี้เมื่อเราทราบแล้วว่า UART คืออะไรสิ่งสำคัญคือต้องทราบพารามิเตอร์ที่เกี่ยวข้องของ UART
อุปกรณ์ UART สองเครื่องรับและส่งข้อมูลด้วยความถี่เดียวกัน เมื่ออุปกรณ์ UART ที่รับตรวจพบบิตเริ่มต้นอุปกรณ์จะเริ่มอ่านบิตขาเข้าที่ความถี่เฉพาะที่เรียกว่าอัตราการส่งข้อมูล อัตราการรับส่งข้อมูลเป็นสิ่งสำคัญสำหรับการสื่อสาร UART และใช้ในการวัดความเร็วในการถ่ายโอนข้อมูลในหน่วยบิตต่อวินาที (bps) ความเร็วของอัตรารับส่งข้อมูลนี้สำหรับการส่งและรับจะต้องเป็นอัตราบอดเดียวกัน ความแตกต่างของความเร็วในการรับส่งข้อมูลระหว่าง UART การส่งและการรับอาจมีค่าประมาณ 10% ก่อนที่เวลาของบิตจะหลุดออกไป ความเร็วในการรับส่งข้อมูลที่เป็นที่นิยมมากที่สุดคือ 4800, 9600, 115200 bps เป็นต้นก่อนหน้านี้เราได้ใช้การสื่อสาร UART ในไมโครคอนโทรลเลอร์อื่น ๆ เช่นกันซึ่งแสดงไว้ด้านล่าง
- การสื่อสาร UART ระหว่าง ATmega8 และ Arduino Uno
- การสื่อสาร UART ระหว่างไมโครคอนโทรลเลอร์ ATmega8 สองตัว
- การสื่อสาร UART โดยใช้ไมโครคอนโทรลเลอร์ PIC
- การสื่อสาร UART บนไมโครคอนโทรลเลอร์ STM8S
N76E003 มีสอง UARTs - UART0 และ UART1 ในบทช่วยสอนนี้เราจะใช้อุปกรณ์ต่อพ่วง UART กับหน่วยไมโครคอนโทรลเลอร์ N76E003 โดยไม่ต้องเสียเวลามากลองประเมินว่าเราต้องการการตั้งค่าฮาร์ดแวร์แบบใดสำหรับแอปพลิเคชันนี้
ข้อกำหนดฮาร์ดแวร์และการตั้งค่า
องค์ประกอบหลักที่จำเป็นสำหรับโปรเจ็กต์นี้คือโมดูลตัวแปลง USB เป็น UART หรือ TTLที่จะทำให้อินเทอร์เฟซที่จำเป็นระหว่างพีซีหรือแล็ปท็อปกับโมดูลไมโครคอนโทรลเลอร์ สำหรับโครงการนี้เราจะใช้โมดูล USB กับ UART ที่ใช้CP2102ซึ่งแสดงไว้ด้านล่าง
ไม่ต้องพูดถึงนอกเหนือจากองค์ประกอบข้างต้นเราต้องN76E003 ไมโครคอนโทรลเลอร์คณะกรรมการพัฒนาการตามเช่นเดียวกับNu-Link โปรแกรมเมอร์ อาจต้องใช้ชุดจ่ายไฟ 5V เพิ่มเติมหากไม่ได้ใช้โปรแกรมเมอร์เป็นแหล่งจ่ายไฟ
แผนภาพวงจรสำหรับ Nuvoton N76E003 UART Communication
ดังที่เราเห็นในแผนผังบอร์ดพัฒนาด้านล่างขาที่ 2 และ 3 ของหน่วยไมโครคอนโทรลเลอร์จะใช้เป็น UART0 Tx และ Rx ตามลำดับ ทางด้านซ้ายสุดจะแสดงการเชื่อมต่ออินเทอร์เฟซการเขียนโปรแกรม
UART Pins บนไมโครคอนโทรลเลอร์ Nuvoton N76E003
N76E003 มีพิน 20 พินซึ่งสามารถใช้ 4 พินสำหรับการสื่อสาร UART ภาพด้านล่างแสดงพิน UART ที่ไฮไลต์ในกล่องสี่เหลี่ยมสีแดง (Rx) และกล่องสี่เหลี่ยมสีน้ำเงิน (Tx)
สำหรับ UART0 พิน 2 และ 3 ใช้สำหรับการสื่อสาร UART และสำหรับ UART1 จะใช้พิน 8 และพิน 18 สำหรับการสื่อสาร
UART Registers ในไมโครคอนโทรลเลอร์ Nuvoton N76E003
N76E003 มี UART แบบฟูลดูเพล็กซ์ที่ได้รับการปรับปรุงสองชุดพร้อมการจดจำที่อยู่อัตโนมัติและการตรวจจับข้อผิดพลาด - UART0 และ UART1 UART ทั้งสองนี้ได้รับการควบคุมโดยใช้การลงทะเบียนซึ่งแบ่งออกเป็นสอง UART ที่แตกต่างกัน มีหมุด RX และ TX สองคู่ใน N76E003 สำหรับการใช้งาน UART ขั้นตอนแรกคือการเลือกพอร์ต UART ที่ต้องการสำหรับการดำเนินการ
ในบทช่วยสอนนี้เราจะใช้UART0ดังนั้นการกำหนดค่าจะแสดงสำหรับ UART0 เท่านั้น UART1 จะมีการกำหนดค่าเหมือนกัน แต่การลงทะเบียนจะแตกต่างกัน
หลังจากเลือกหนึ่ง UART (UART0 ในกรณีนี้) พิน I / O ที่จำเป็นสำหรับการสื่อสาร RX และ TX จะต้องได้รับการกำหนดค่าเป็นอินพุตและเอาต์พุต ขา RX ของ UART0 คือพิน 3 ของไมโครคอนโทรลเลอร์ที่เป็นพอร์ต 0.7 เนื่องจากนี่คือพินรับพอร์ตอนุกรมจึงจำเป็นต้องตั้งพอร์ต 0.7 เป็นอินพุต ในทางกลับกันพอร์ต 0.6 ซึ่งเป็นพินที่ 2 ของไมโครคอนโทรลเลอร์คือพินส่งหรือพินเอาต์พุต จำเป็นต้องตั้งค่าเป็นโหมดสองทิศทางเสมือน สามารถเลือกได้โดยใช้รีจิสเตอร์ pxM1 และ pxM2 รีจิสเตอร์ทั้งสองนี้ตั้งค่าโหมด I / O โดยที่ x ย่อมาจากหมายเลขพอร์ต (ตัวอย่างเช่นพอร์ต P1.0 รีจิสเตอร์จะเป็น P1M1 และ P1M2 สำหรับ P3.0 จะเป็น P3M1 และ P3M2 เป็นต้น) การกำหนดค่าสามารถ เห็นได้จากภาพด้านล่าง -
UART โหมดการทำงานใน N76E003
จากนั้นขั้นตอนต่อไปคือการกำหนดรูปแบบของการดำเนินงาน UART UART ทั้งสองสามารถทำงานได้ 4 โหมด โหมดคือ -
อย่างที่เราเห็น SM0 และ SM1 (บิตที่ 7 และ 6 ของการลงทะเบียน SCON) เลือกโหมดการทำงานของ UART โหมด 0 คือการดำเนินการซิงโครและอีกสามโหมดการดำเนินงานไม่ตรงกันอย่างไรก็ตามตัวสร้างBaud RateและFrame bitsจะแตกต่างกันสำหรับโหมดพอร์ตอนุกรมแต่ละโหมด ทุกโหมดสามารถเลือกได้ตามความต้องการของแอปพลิเคชันและนี่ก็เหมือนกับ UART1 เช่นกัน สำหรับบทช่วยสอนนี้จะใช้การทำงาน 10 บิตพร้อมตัวจับเวลา 3 อัตราล้นหารด้วย 32 หรือ 16
ตอนนี้ได้เวลารับข้อมูลและกำหนดค่าทะเบียน SCON (SCON_1 สำหรับ UART1) สำหรับ UART0
บิตที่ 6 และ 7 จะตั้งค่าโหมด UART ตามที่กล่าวไว้ก่อนหน้านี้ Bit 5 ใช้เพื่อตั้งค่าโหมดการสื่อสารแบบมัลติโปรเซสเซอร์เพื่อเปิดใช้งานตัวเลือก อย่างไรก็ตามกระบวนการนี้ขึ้นอยู่กับโหมด UART ที่เลือก นอกเหนือจากนี้บิต REN จะถูกตั้งค่าเป็น 1 เพื่อเปิดใช้งานการรับและแฟล็กTI จะถูกตั้งค่าเป็น 1 สำหรับฟังก์ชัน printf ที่จะใช้แทนฟังก์ชันการส่ง UART0 ที่กำหนดเอง
การลงทะเบียนที่สำคัญถัดไปคือการลงทะเบียนควบคุมพลังงาน (PCON) (ตัวจับเวลา 3 บิต 7 และ 6 สำหรับ UART1) หากคุณยังใหม่กับตัวจับเวลาโปรดดูบทช่วยสอนตัวจับเวลา Nuvoton N76E003 เพื่อทำความเข้าใจวิธีใช้ตัวจับเวลาบนไมโครคอนโทรลเลอร์ N76E003
บิต SMOD มีความสำคัญในการเลือกอัตราการส่งข้อมูลสองครั้งในโหมด UART0 1 ในขณะที่เรากำลังใช้ตัวจับเวลา 3 จึงจำเป็นต้องกำหนดค่าการลงทะเบียนควบคุมตัวจับเวลา 3 T3CON อย่างไรก็ตามบิตที่ 7 และ 6 สงวนไว้สำหรับการตั้งค่าอัตราข้อมูลสองเท่าสำหรับ UART1
และค่าตัวจับเวลาล่วงหน้า 3
BRCK บิตที่ 5 จะตั้งค่า Timer 3 เป็นแหล่งสัญญาณนาฬิกาอัตราบอดสำหรับ UART1 ตอนนี้แผ่นข้อมูลของ N76E003 ได้รับสูตรสำหรับการคำนวณอัตราบอดที่ต้องการตลอดจนค่าชุดตัวอย่างสำหรับการลงทะเบียนสูงและต่ำของตัวจับเวลา 3 (16 บิต)
ค่าตัวอย่างสำหรับแหล่งสัญญาณนาฬิกา 16 Mhz
ดังนั้นจึงต้องกำหนดค่าอัตราการส่งข้อมูลในการลงทะเบียน Timer 3 โดยใช้สูตรข้างต้น สำหรับกรณีของเราจะเป็นสูตร 4 หลังจากนั้นเริ่มจับเวลา 3 โดยตั้งค่าทะเบียน TR3 เป็น 1 จะสิ้นสุดการตั้งเวลาเริ่มต้น UART0 3 เพื่อรับและส่งข้อมูล UART0 เพื่อใช้การลงทะเบียนด้านล่าง -
การลงทะเบียน SBUFได้รับการกำหนดค่าโดยอัตโนมัติสำหรับการรับและส่ง ในการรับข้อมูลจาก UART ให้รอให้แฟล็กRIตั้งค่า 1 และอ่าน SBUF register และส่งข้อมูลไปยัง UART0 ส่งข้อมูลไปยัง SBUF และรอให้ TI flag ได้รับ 1 เพื่อยืนยันการส่งข้อมูลที่สำเร็จ
การเขียนโปรแกรม Nuvoton N76E003 สำหรับการสื่อสาร UART
ส่วนการเข้ารหัสนั้นเรียบง่ายและโค้ดทั้งหมดที่ใช้ในบทช่วยสอนนี้สามารถพบได้ที่ด้านล่างของหน้านี้ คำอธิบายของรหัสมีดังต่อไปนี้ UART0 เริ่มต้นที่อัตรารับส่งข้อมูล 9600 โดยใช้คำสั่งในฟังก์ชันหลัก -
เริ่มต้น UART0_Timer3 (9600);
ฟังก์ชันข้างต้นถูกกำหนดไว้ในไฟล์ common.c และกำลังกำหนดค่า UART0 ด้วย Timer 3 เป็นแหล่งที่มาของอัตราการส่งข้อมูลในโหมด 1 และมีอัตราการส่งข้อมูลที่ 9600 คำจำกัดความของฟังก์ชันมีดังนี้ -
ถือเป็นโมฆะ InitialUART0_Timer3 (UINT32 u32Baudrate) // ใช้ timer3 เป็นตัวสร้าง Baudrate { P06_Quasi_Mode; // การตั้งค่าพิน UART เป็นโหมด Quasi สำหรับการส่ง P07_Input_Mode; // ตั้งค่าพิน UART เป็นโหมดอินพุตสำหรับรับ SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 อัตราสองเท่าเปิดใช้งาน T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // แหล่งสัญญาณนาฬิกาอัตราการส่งข้อมูล UART0 = ตัวจับเวลา 3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / endif # #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1,037,500 / u32Baudrate)); /*16.6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /*16.6 เมกะเฮิรตซ์ * / endif # set_TR3; // Trigger Timer3 set_TI; // สำหรับฟังก์ชัน printf ต้องตั้งค่า TI = 1 }
การประกาศจะทำทีละขั้นตอนตามที่กล่าวไว้ก่อนหน้านี้และการลงทะเบียนจะได้รับการกำหนดค่าตามนั้น อย่างไรก็ตามในไลบรารี BSP ของ N76E003มีจุดบกพร่องที่แทนที่ P07_Input_Mode; มีP07_Quasi_Mode ด้วยเหตุนี้ฟังก์ชันรับ UART จึงไม่ทำงาน
อัตราการส่งข้อมูลยังได้รับการกำหนดค่าตามอินพุตอัตรารับส่งข้อมูลและใช้สูตรที่กำหนดโดยแผ่นข้อมูล ตอนนี้ในฟังก์ชั่นหลักหรือ while loop จะใช้ฟังก์ชัน printf ในการใช้ฟังก์ชัน printf ต้องตั้งค่า TI เป็น 1 นอกเหนือจากนี้ใน ลูป while จะใช้เคสสวิตช์และตามข้อมูล UART ที่ได้รับค่าจะถูกพิมพ์
ในขณะที่ (1) { printf ("\ r \ n กด 1 หรือกด 2 หรือกด 3 หรือกด 4"); ตัวดำเนินการ = Receive_Data_From_UART0 (); สวิตช์ (oper) { case '1': printf ("\ r \ n1 ถูกกด"); หยุดพัก; กรณี '2': printf ("\ r \ N2 ถูกกด"); หยุดพัก; กรณี '3': printf ("\ r \ N3 ถูกกด"); หยุดพัก; กรณี '4': printf ("\ r \ N4 ถูกกด"); หยุดพัก; ค่าเริ่มต้น: printf ("\ r \ n กดคีย์ผิด"); } Timer0_Delay1ms (300); } }
สำหรับ UART0 ได้รับ Receive_Data_From_UART0 (); ใช้ฟังก์ชัน นอกจากนี้ยังกำหนดไว้ในไลบรารี common.c
UINT8 Receive_Data_From_UART0 (โมฆะ) { UINT8 c; ในขณะที่ (! RI); c = SBUF; ริ = 0; ผลตอบแทน (c); }
มันจะรอให้แฟล็ก RI ได้ 1 และส่งกลับข้อมูลที่ได้รับโดยใช้ตัวแปร c
กะพริบรหัสและเอาต์พุต
รหัสส่งคืนคำเตือน 0 และ 0 ข้อผิดพลาดและกระพริบโดยใช้วิธีการกะพริบเริ่มต้นโดย Keil หากคุณไม่แน่ใจว่าจะรวบรวมและอัปโหลดโค้ดอย่างไรให้ดูบทความเริ่มต้นใช้งาน nuvoton บรรทัดด้านล่างยืนยันว่ารหัสของเราได้รับการอัปโหลดเรียบร้อยแล้ว
เริ่มสร้างใหม่: โครงการ: printf_UART0 สร้างเป้าหมายใหม่ 'GPIO' ที่ รวบรวม PUTCHAR.C… รวบรวม Print_UART0.C… รวบรวม Delay.c… รวบรวม Common.c… ประกอบ STARTUP.A51… กำลัง เชื่อมโยง… ขนาดโปรแกรม: data = 54.2 xdata = 0 code = 2341 การสร้างไฟล์ hex จาก ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Error (s), 0 Warning (s) เวลาสร้างที่ผ่านไป: 00:00:02 โหลด "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" การ ลบแฟลชเสร็จสิ้น Flash Write Done: โปรแกรม 2341 ไบต์ Flash Verify Done: ยืนยันแล้ว 2341 ไบต์ การโหลดแฟลชเสร็จสิ้นเวลา 15:48:08 น
บอร์ดพัฒนาเชื่อมต่ออยู่ในแหล่งจ่ายไฟผ่านโปรแกรมเมอร์และแล็ปท็อปโดยใช้โมดูล USB to UART ในการแสดงหรือส่งข้อมูล UART จำเป็นต้องใช้ซอฟต์แวร์มอนิเตอร์แบบอนุกรม ฉันกำลังใช้คำศัพท์ teraสำหรับกระบวนการนี้
ดังที่คุณเห็นในภาพด้านล่างฉันสามารถแสดงสตริงที่ส่งมาจากคอนโทรลเลอร์ nuvoton ของเราและแสดงบนซอฟต์แวร์มอนิเตอร์แบบอนุกรม ยังสามารถอ่านค่าจากมอนิเตอร์แบบอนุกรม
คุณสามารถดูวิดีโอที่ลิงก์ด้านล่างเพื่อดูการสาธิตทั้งหมดของบทช่วยสอนนี้ หวังว่าคุณจะสนุกกับบทความและเรียนรู้สิ่งที่เป็นประโยชน์ หากคุณมีคำถามใด ๆ คุณสามารถฝากไว้ในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัมของเราเพื่อโพสต์คำถามทางเทคนิคอื่น ๆ