-
Walaupun di PC port serial berangsur-angsur menghilang, namun di bidang embedded, port serial masih bisa dikatakan populer karena berbiaya rendah dan mudah diprogram .Sangat diperlukan, bersama dengan HyperTerminal, ini memecahkan masalah tampilan dan input informasi.
Setelah beberapa hari kerja keras, pekerjaan transplantasi NativeSample .Net Micro Framework pada platform Cortex-M3 akan mencapai tahap saat ini, kode startup, SRAM, jam (RCC), interupsi (NVIC), SysTick, GPIO, Port serial, NandFlash (FMSC) dan fungsi terkait lainnya, kode-kode ini dapat dikatakan sebagai set minimum untuk membuat TinyClr berfungsi normal. Papan pengembangan M3 yang kami gunakan memiliki lebih dari 2M RAM, maka pekerjaan kami mungkin sudah 90% selesai saat ini, namun karena sumber daya yang terbatas, langkah debugging selanjutnya harus versi Flash, jadi akan ada banyak pekerjaan yang tidak diketahui, dan debugging juga akan menjadi sulit. Tidak peduli bagaimana kita Perjalanan .Net Micro Framework PortingKit akan terus berlanjut. Namun, sejujurnya, menyelesaikan tugas-tugas ini dari awal sulit tetapi bermanfaat ditingkatkan ke tingkat yang baru.
Oke, mari kita bicara tentang pengembangan driver port serial.
Seperti pengembangan GPIO, kita masih perlu menulis kode register terkait port serial di CortexM3.h.
struct CortexM3_Usart
{
konstanta statis UINT32 c_MAX_BAUDRATE = 45000000;
konstanta statis UINT32 c_MIN_BAUDRATE = 1200;
konstanta statis UINT32 c_Base1 = 0x40013800;
konstanta statis UINT32 c_Base2 = 0x40004400;
konstanta statis UINT32 c_Base3 = 0x40004800;
/****/ UINT16 SR yang mudah menguap;
konstanta statis UINT16 SR_TXE=((UINT16)0x0080);
konstanta statis UINT16 SR_TC=((UINT16)0x0040);
konstanta statis UINT16 SR_RXNE=((UINT16)0x0020);
UINT16 DILINDUNGI0;
/****/ UINT16 DR yang mudah menguap;
UINT16 DILINDUNGI1;
/****/ UINT16 BRR yang mudah menguap;
UINT16 DILINDUNGI2;
/****/ UINT16 CR1 yang mudah menguap;
static const UINT16 CR1_UE_Set = ((UINT16)0x2000); //USART Aktifkan Masker
static const UINT16 CR1_UE_Reset = ((UINT16)0xDFFF); //USART Nonaktifkan Masker
konstanta statis UINT16 CR1_Parity_No = ((UINT16)0x0000);
static const UINT16 CR1_Parity_Even = ((UINT16)0x0400);
konstanta statis UINT16 CR1_Parity_Odd = ((UINT16)0x0600);
konstanta statis UINT16 CR1_DataBit_8 = ((UINT16)0x0000);
konstanta statis UINT16 CR1_DataBit_9 = ((UINT16)0x1000);
konstanta statis UINT16 CR1_Mode_Rx = ((UINT16)0x0004);
konstanta statis UINT16 CR1_Mode_Tx = ((UINT16)0x0008);
statis const UINT16 CR1_CLEAR_Mask = ((UINT16)0xE9F3);
konstanta statis UINT16 CR1_PEIE = ((UINT16)0x0100);
konstanta statis UINT16 CR1_TXEIE = ((UINT16)0x0080);
konstanta statis UINT16 CR1_TCIE = ((UINT16)0x0040);
konstanta statis UINT16 CR1_RXNEIE = ((UINT16)0x0020);
UINT16 DILINDUNGI3;
/****/ UINT16 CR2 yang mudah menguap;
konstanta statis UINT16 CR2_StopBits_1 = ((UINT16)0x0000);
konstanta statis UINT16 CR2_StopBits_0_5 = ((UINT16)0x1000);
konstanta statis UINT16 CR2_StopBits_2 = ((UINT16)0x2000);
konstanta statis UINT16 CR2_StopBits_1_5 = ((UINT16)0x3000);
static const UINT16 CR2_StopBits_Mask= ((UINT16)0xCFFF); /* Masker Bit USART CR2 STOP */
UINT16 DILINDUNGI4;
/****/ UINT16 CR3 yang mudah menguap;
static const UINT16 CR3_HardwareFlowControl_None = ((UINT16)0x0000);
static const UINT16 CR3_HardwareFlowControl_RTS = ((UINT16)0x0100);
konstanta statis UINT16 CR3_HardwareFlowControl_CTS = ((UINT16)0x0200);
konstanta statis UINT16 CR3_HardwareFlowControl_RTS_CTS = ((UINT16)0x0300);
static const UINT16 CR3_HardwareFlowControl_Mask = ((UINT16)0xFCFF);
UINT16 DILINDUNGI5;
/****/ UINT16 GTPR yang mudah menguap;
UINT16 DILINDUNGI6;
};
Dengan kode di atas, kita dapat dengan mudah mengoperasikan register port serial.
Inisialisasi port serial memerlukan pekerjaan inisialisasi berikut (papan pengembangan STM3210E memiliki tiga port serial, kami akan mengambil port serial 1 sebagai contoh):
1. Nyalakan jam port serial
UsartId = KorteksM3_NVIC::c_IRQ_Index_USART1;
RCC.APB2ENR |= KorteksM3_RCC::APB2_GPIOA |.KorteksM3_RCC::APB2_USART1;
2. Interupsi aktivasi
if(!CPU_INTC_ActivateInterruptEx( UsartId, (UINT32)(void *)USART1_IRQHandler)) mengembalikan FALSE;
3. Atur parameter port serial, seperti baud rate, parity, bit data, stop bit, dll.
agak
4. Redefinisi 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. Pengaktifan port serial
Usart.CR1 |= CortexM3_Usart::CR1_UE_Set;
Selesaikan pengiriman dan penerimaan data dalam fungsi interupsi:
batal CortexM3_USART_Driver::ISR( batal* param )
{
KomPort UINT32 = (UINT32)param;
CortexM3_Usart &Usart=CortexM3::Usart(comPort);
karakter c;
Status UINT32;
Status = Usart.SR;
jika(Status & KorteksM3_Usart::SR_RXNE)
{
c = Usart.DR;
USART_AddCharToRxBuffer( comPort, c );
Acara_Set( SYSTEM_EVENT_FLAG_COM_IN );
}
jika(Status & KorteksM3_Usart::SR_TC)
{
if(0 == (c_RefFlagTx & g_CortexM3_USART_Driver.m_RefFlags[comPort]))
{
kembali;
}
if(USART_RemoveCharFromTxBuffer( comPort, c ))
{
WriteCharToTxBuffer( comPort, c );
}
kalau tidak
{
// nonaktifkan interupsi Tx lebih lanjut karena level kita terpicu
TxBufferEmptyInterruptEnable(comPort, FALSE);
}
Acara_Set( SYSTEM_EVENT_FLAG_COM_OUT );
}
}
Kode inti adalah konten relevan yang diperkenalkan di atas. Di bawah ini kami menulis kode pengujian port serial di NativeSample:
membatalkan ApplicationEntryPoint()
{
sementara(BENAR)
{
jika(Events_WaitForEvents(SYSTEM_EVENT_FLAG_COM_IN,100))
{
Acara_Hapus(SYSTEM_EVENT_FLAG_COM_IN);
char bytData[512];
int Ukuran=USART_BytesInBuffer(0,TRUE);
USART_Read(0,byteData,Ukuran);
untuk(int i=0;i<Ukuran;i++)
debug_printf("%c",bytData[i]);
}
debug_printf("Halo Kerangka Mikro!!!rn");
}
}