-
على الرغم من اختفاء المنافذ التسلسلية تدريجيًا في أجهزة الكمبيوتر، إلا أنه لا يزال من الممكن القول بأن المنافذ التسلسلية شائعة لأنها منخفضة التكلفة ومريحة للبرمجة على الأنظمة التي لا تحتوي على شاشات عرض أو أجهزة إدخال، إلا أن المنافذ التسلسلية أكثر شيوعًا لا غنى عنه، مع HyperTerminal، فهو يحل مشكلة عرض المعلومات وإدخالها.
بعد عدة أيام من العمل الشاق، توشك أعمال زرع NativeSample لـ .Net Micro Framework على منصة Cortex-M3 على الوصول إلى مرحلة، في الوقت الحالي، رمز بدء التشغيل، SRAM، الساعة (RCC)، المقاطعة (NVIC)، SysTick،. GPIO والمنفذ التسلسلي وNandFlash (FMSC) والوظائف الأخرى ذات الصلة، يمكن القول أن هذه الرموز هي الحد الأدنى الذي يمكن تعيينه لجعل TinyClr يعمل بشكل طبيعي، مع هذه العمل كأساس، يمكن أن تكون الخطوة التالية هي زرع TinyClr. تحتوي لوحة تطوير M3 التي نستخدمها على أكثر من 2 ميجا بايت من ذاكرة الوصول العشوائي، وقد يكون عملنا مكتملًا بنسبة 90٪ في هذه المرحلة، ولكن نظرًا لمحدودية الموارد، يجب أن تكون الخطوة التالية لتصحيح الأخطاء هي إصدار Flash، لذلك سيكون هناك الكثير من العمل غير المعروف. وسيصبح تصحيح الأخطاء أمرًا صعبًا أيضًا بغض النظر عن مدى استمرار رحلة .Net Micro Framework PortingKit. ومع ذلك، لنكون صادقين، فإن إكمال هذه المهام من البداية أمر صعب ولكنه مجزٍ تحسنت إلى مستوى جديد.
حسنًا، لنتحدث عن تطوير برنامج تشغيل المنفذ التسلسلي.
مثل تطوير GPIO، ما زلنا بحاجة إلى كتابة رمز التسجيل المتعلق بالمنفذ التسلسلي في CortexM3.h.
بناء 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;
static const UINT16 CR1_UE_Set = ((UINT16)0x2000); //USART Enable Mask
static const UINT16 CR1_UE_Reset = ((UINT16)0xDFFF); //USART Disable Mask
static const UINT16 CR1_Parity_No = ((UINT16)0x0000);
static const UINT16 CR1_Parity_Even = ((UINT16)0x0400);
static const UINT16 CR1_Parity_Odd = ((UINT16)0x0600);
static const UINT16 CR1_DataBit_8 = ((UINT16)0x0000);
static const UINT16 CR1_DataBit_9 = ((UINT16)0x1000);
static const UINT16 CR1_Mode_Rx = ((UINT16)0x0004);
static const UINT16 CR1_Mode_Tx = ((UINT16)0x0008);
static const UINT16 CR1_CLEAR_Mask = ((UINT16)0xE9F3);
static const UINT16 CR1_PEIE = ((UINT16)0x0100);
ثابت ثابت UINT16 CR1_TXEIE = ((UINT16)0x0080);
ثابت ثابت UINT16 CR1_TCIE = ((UINT16)0x0040);
static const UINT16 CR1_RXNEIE = ((UINT16)0x0020);
UINT16 محجوز3;
/****/ متطاير UINT16 CR2;
static const UINT16 CR2_StopBits_1 = ((UINT16)0x0000);
static const UINT16 CR2_StopBits_0_5 = ((UINT16)0x1000);
static const UINT16 CR2_StopBits_2 = ((UINT16)0x2000);
static const UINT16 CR2_StopBits_1_5 = ((UINT16)0x3000);
static const UINT16 CR2_StopBits_Mask= ((UINT16)0xCFFF) /* USART CR2 STOP Bits Mask */
UINT16 محجوز 4؛
/****/ متطاير UINT16 CR3;
static const UINT16 CR3_HardwareFlowControl_None = ((UINT16)0x0000);
static const UINT16 CR3_HardwareFlowControl_RTS = ((UINT16)0x0100);
static const UINT16 CR3_HardwareFlowControl_CTS = ((UINT16)0x0200);
static const UINT16 CR3_HardwareFlowControl_RTS_CTS = ((UINT16)0x0300);
static 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 |.
2. مقاطعة التنشيط
if(!CPU_INTC_ActivateInterruptEx( UsartId, (UINT32)(void *)USART1_IRQHandler)) return 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)param;
CortexM3_Usart &Usart=CortexM3::Usart(comPort);
شار ج؛
حالة UINT32؛
الحالة = Usart.SR;
إذا (الحالة وCortexM3_Usart::SR_RXNE)
{
ج = 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);
شار بايتداتا[512];
int Size=USART_BytesInBuffer(0,TRUE);
USART_Read(0,bytData,Size);
ل(int i=0;i<Size;i++)
debug_printf("%c",bytData[i]);
}
debug_printf("Hello Micro Framework!!!rn");
}
}