-
แม้ว่าในพีซี พอร์ตอนุกรมจะค่อยๆ หายไป แต่ในช่องฝังตัว พอร์ตอนุกรมยังคงได้รับความนิยมเนื่องจากมีราคาถูกและสะดวกในการตั้งโปรแกรม ในระบบที่ไม่มีหน้าจอแสดงผลหรืออุปกรณ์อินพุต พอร์ตอนุกรมจะได้รับความนิยมมากกว่า . ที่ขาดไม่ได้เมื่อใช้ร่วมกับ HyperTerminal จะช่วยแก้ปัญหาการแสดงข้อมูลและการป้อนข้อมูล
หลังจากการทำงานหนักมาหลายวัน งานการปลูกถ่าย NativeSample ของ .Net Micro Framework บนแพลตฟอร์ม Cortex-M3 กำลังจะถึงขั้นแล้ว ในปัจจุบัน รหัสเริ่มต้น, SRAM, นาฬิกา (RCC), การขัดจังหวะ (NVIC), SysTick, GPIO, พอร์ตอนุกรม, NandFlash (FMSC) และฟังก์ชันอื่น ๆ ที่เกี่ยวข้อง อาจกล่าวได้ว่าเป็นชุดขั้นต่ำเพื่อให้ TinyClr ทำงานได้ตามปกติ ด้วยการทำงานเหล่านี้เป็นรากฐาน ขั้นตอนต่อไปคือการปลูกถ่าย TinyClr บอร์ดพัฒนา M3 ที่เราใช้มี RAM มากกว่า 2M ดังนั้นงานของเราอาจจะเสร็จสมบูรณ์ 90% ณ จุดนี้ แต่เนื่องจากทรัพยากรที่จำกัด ขั้นตอนต่อไปของการดีบักต้องเป็นเวอร์ชัน Flash ดังนั้นจะมีงานที่ไม่รู้จักมากมาย และการดีบักก็จะกลายเป็นเรื่องยากเช่นกัน ไม่ว่าเราจะเป็นอย่างไร การเดินทางของ .Net Micro Framework PortingKit จะดำเนินต่อไป อย่างไรก็ตาม พูดตามตรงว่าการทำงานเหล่านี้ให้เสร็จสิ้นตั้งแต่เริ่มต้นนั้นเป็นเรื่องยากแต่ก็คุ้มค่าที่ความเข้าใจของฉันเกี่ยวกับการพัฒนา ARM (โดยเฉพาะ Cortex-M3) ปรับปรุงไปสู่ระดับใหม่
เอาล่ะ เรามาพูดถึงการพัฒนาไดร์เวอร์พอร์ตอนุกรมกันดีกว่า
เช่นเดียวกับการพัฒนา GPIO เรายังจำเป็นต้องเขียนโค้ดการลงทะเบียนที่เกี่ยวข้องกับพอร์ตอนุกรมใน CortexM3.h
struct CortexM3_Usart
-
ค่าคงที่ UINT32 c_MAX_BAUDRATE = 45000000;
ค่าคงที่ UINT32 c_MIN_BAUDRATE = 1200;
ค่าคงที่ UINT32 c_Base1 = 0x40013800;
ค่าคงที่ UINT32 c_Base2 = 0x40004400;
ค่าคงที่ UINT32 c_Base3 = 0x40004800;
/****/ UINT16 SR ที่ผันผวน;
ค่าคงที่ UINT16 SR_TXE=((UINT16)0x0080);
ค่าคงที่ UINT16 SR_TC=((UINT16)0x0040);
ค่าคงที่ UINT16 SR_RXNE=((UINT16)0x0020);
UINT16 จองไว้ 0;
/****/ UINT16 DR ผันผวน;
UINT16 สงวนไว้1;
/****/ ผันผวน UINT16 BRR;
UINT16 สงวนไว้2;
/****/ ระเหย UINT16 CR1;
const แบบคงที่ UINT16 CR1_UE_Set = ((UINT16)0x2000); // USART เปิดใช้งานมาสก์
const แบบคงที่ UINT16 CR1_UE_Reset = ((UINT16)0xDFFF); // USART ปิดการใช้งานมาสก์
ค่าคงคงที่ UINT16 CR1_Parity_No = ((UINT16)0x0000);
const แบบคงที่ UINT16 CR1_Parity_Even = ((UINT16)0x0400);
const แบบคงที่ UINT16 CR1_Parity_Odd = ((UINT16)0x0600);
ค่าคงที่ UINT16 CR1_DataBit_8 = ((UINT16)0x0000);
const แบบคงที่ UINT16 CR1_DataBit_9 = ((UINT16)0x1000);
ค่าคงที่ UINT16 CR1_Mode_Rx = ((UINT16)0x0004);
ค่าคงที่ UINT16 CR1_Mode_Tx = ((UINT16)0x0008);
const แบบคงที่ UINT16 CR1_CLEAR_Mask = ((UINT16)0xE9F3);
ค่าคงที่ UINT16 CR1_PEIE = ((UINT16)0x0100);
ค่าคงที่ UINT16 CR1_TXEIE = ((UINT16)0x0080);
ค่าคงที่ UINT16 CR1_TCIE = ((UINT16)0x0040);
ค่าคงที่ UINT16 CR1_RXNEIE = ((UINT16)0x0020);
UINT16 สงวนไว้3;
/****/ UINT16 CR2 ผันผวน;
const แบบคงที่ UINT16 CR2_StopBits_1 = ((UINT16)0x0000);
const แบบคงที่ UINT16 CR2_StopBits_0_5 = ((UINT16)0x1000);
const แบบคงที่ UINT16 CR2_StopBits_2 = ((UINT16)0x2000);
const แบบคงที่ UINT16 CR2_StopBits_1_5 = ((UINT16)0x3000);
const แบบคงที่ UINT16 CR2_StopBits_Mask= ((UINT16)0xCFFF); /* USART CR2 STOP Bits Mask */
UINT16 สงวนไว้4;
/****/ ผันผวน UINT16 CR3;
const แบบคงที่ UINT16 CR3_HardwareFlowControl_None = ((UINT16)0x0000);
const แบบคงที่ UINT16 CR3_HardwareFlowControl_RTS = ((UINT16)0x0100);
const แบบคงที่ UINT16 CR3_HardwareFlowControl_CTS = ((UINT16)0x0200);
const แบบคงที่ UINT16 CR3_HardwareFlowControl_RTS_CTS = ((UINT16)0x0300);
const แบบคงที่ UINT16 CR3_HardwareFlowControl_Mask = ((UINT16)0xFCFF);
UINT16 สงวนไว้5;
/****/ UINT16 GTPR ผันผวน;
UINT16 สงวนไว้6;
-
ด้วยโค้ดข้างต้น เราสามารถใช้งานรีจิสเตอร์พอร์ตอนุกรมได้อย่างง่ายดาย
การเริ่มต้นพอร์ตอนุกรมต้องมีการเริ่มต้นดังต่อไปนี้ (บอร์ดพัฒนา STM3210E มีพอร์ตอนุกรมสามพอร์ต เราจะใช้พอร์ตอนุกรม 1 เป็นตัวอย่าง):
1. เปิดนาฬิกาพอร์ตอนุกรม
UsartId = CortexM3_NVIC::c_IRQ_Index_USART1;
RCC.APB2ENR |= CortexM3_RCC::APB2_GPIOA |. CortexM3_RCC::APB2_USART1;
2. การขัดจังหวะการเปิดใช้งาน
ถ้า(!CPU_INTC_ActivateInterruptEx( UsartId, (UINT32)(void *)USART1_IRQHandler)) ส่งคืน FALSE;
3. ตั้งค่าพารามิเตอร์พอร์ตอนุกรม เช่น อัตรารับส่งข้อมูล พาริตี บิตข้อมูล บิตหยุด ฯลฯ
เล็กน้อย
4. นิยามใหม่ของ GPIO
CPU_GPIO_DisablePin(GPIO_Driver::PA9,RESISTOR_DISABLED,FALSE,GPIO_ALT_MODE_1);
CPU_GPIO_DisablePin(GPIO_Driver::PA10,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_2);
5. การเปิดใช้งานพอร์ตอนุกรม
Usart.CR1 |= CortexM3_Usart::CR1_UE_Set;
ดำเนินการส่งและรับข้อมูลในฟังก์ชันขัดจังหวะให้เสร็จสิ้น:
เป็นโมฆะ CortexM3_USART_Driver::ISR (เป็นโมฆะ * พารามิเตอร์)
-
UINT32 comPort = (UINT32)พารามิเตอร์;
CortexM3_Usart &Usart=CortexM3::Usart(comPort);
ถ่านค;
สถานะ UINT32;
สถานะ = Usart.SR;
ถ้า (สถานะ & CortexM3_Usart::SR_RXNE)
-
c = Usart.DR;
USART_AddCharToRxBuffer( comPort, c );
Events_Set( SYSTEM_EVENT_FLAG_COM_IN );
-
ถ้า (สถานะ & CortexM3_Usart::SR_TC)
-
ถ้า (0 == (c_RefFlagTx & g_CortexM3_USART_Driver.m_RefFlags [comPort]))
-
กลับ;
-
ถ้า(USART_RemoveCharFromTxBuffer( comPort, c ))
-
WriteCharToTxBuffer( comPort, c );
-
อื่น
-
// ปิดการใช้งานการขัดจังหวะ Tx เพิ่มเติมเนื่องจากเราถูกกระตุ้นระดับ
TxBufferEmptyInterruptEnable (comPort, FALSE);
-
Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
-
-
รหัสหลักคือเนื้อหาที่เกี่ยวข้องที่แนะนำข้างต้น ด้านล่างนี้เราเขียนรหัสทดสอบพอร์ตอนุกรมใน NativeSample:
ApplicationEntryPoint เป็นโมฆะ()
-
ในขณะที่(จริง)
-
ถ้า(Events_WaitForEvents(SYSTEM_EVENT_FLAG_COM_IN,100))
-
Events_Clear (SYSTEM_EVENT_FLAG_COM_IN);
ถ่าน bytData [512];
ขนาด int=USART_BytesInBuffer(0,TRUE);
USART_Read(0,bytData,ขนาด);
สำหรับ(int i=0;i<ขนาด;i++)
debug_printf("%c",bytData[i]);
-
debug_printf("สวัสดีไมโครเฟรมเวิร์ก!!!rn");
-
-