-
Bien que dans les PC, les ports série disparaissent progressivement, dans le domaine embarqué, les ports série peuvent toujours être considérés comme populaires car ils sont peu coûteux et faciles à programmer. Sur les systèmes sans écran d'affichage ni périphérique d'entrée, les ports série sont encore plus populaires. . Indispensable, associé à HyperTerminal, il résout le problème de l'affichage et de la saisie des informations.
Après plusieurs jours de travail acharné, le travail de transplantation de NativeSample de .Net Micro Framework sur la plateforme Cortex-M3 est sur le point d'atteindre une étape. Actuellement, le code de démarrage, SRAM, horloge (RCC), interruption (NVIC), SysTick, GPIO, port série, NandFlash (FMSC) et autres fonctions associées, ces codes peuvent être considérés comme l'ensemble minimum pour que TinyClr fonctionne normalement. Avec ceux-ci fonctionnent comme base, la prochaine étape peut être de transplanter TinyClr si le Cortex-. La carte de développement M3 que nous utilisons a plus de 2 Mo de RAM, notre travail peut donc être terminé à 90 % à ce stade, mais en raison de ressources limitées, la prochaine étape du débogage doit être la version Flash, il y aura donc beaucoup de travail inconnu, et le débogage deviendra également difficile. Peu importe la manière dont nous continuerons le voyage de .Net Micro Framework PortingKit. Cependant, pour être honnête, accomplir ces tâches à partir de zéro est difficile mais enrichissant. amélioré à un nouveau niveau.
Bon, parlons du développement du pilote de port série.
Comme pour le développement GPIO, nous devons toujours écrire le code de registre lié au port série dans CortexM3.h.
structure CortexM3_Usart
{
const statique UINT32 c_MAX_BAUDRATE = 45000000 ;
const statique UINT32 c_MIN_BAUDRATE = 1200 ;
const statique UINT32 c_Base1 = 0x40013800 ;
const statique UINT32 c_Base2 = 0x40004400 ;
const statique UINT32 c_Base3 = 0x40004800 ;
/****/ volatile UINT16 SR ;
const statique UINT16 SR_TXE=((UINT16)0x0080);
const statique UINT16 SR_TC=((UINT16)0x0040);
const statique UINT16 SR_RXNE=((UINT16)0x0020);
UINT16 RÉSERVÉ0;
/****/ volatile UINT16 DR ;
UINT16 RÉSERVÉ1 ;
/****/ volatile UINT16 BRR ;
UINT16 RÉSERVÉ2 ;
/****/ volatile UINT16 CR1 ;
const statique UINT16 CR1_UE_Set = ((UINT16)0x2000 //USART Activer le masque
static const UINT16 CR1_UE_Reset = ((UINT16)0xDFFF //USART désactiver le masque
const statique UINT16 CR1_Parity_No = ((UINT16)0x0000);
const statique UINT16 CR1_Parity_Even = ((UINT16)0x0400);
const statique UINT16 CR1_Parity_Odd = ((UINT16)0x0600);
const statique UINT16 CR1_DataBit_8 = ((UINT16)0x0000);
const statique UINT16 CR1_DataBit_9 = ((UINT16)0x1000);
const statique UINT16 CR1_Mode_Rx = ((UINT16)0x0004);
const statique UINT16 CR1_Mode_Tx = ((UINT16)0x0008);
const statique UINT16 CR1_CLEAR_Mask = ((UINT16)0xE9F3);
const statique UINT16 CR1_PEIE = ((UINT16)0x0100);
const statique UINT16 CR1_TXEIE = ((UINT16)0x0080);
const statique UINT16 CR1_TCIE = ((UINT16)0x0040);
const statique UINT16 CR1_RXNEIE = ((UINT16)0x0020);
UINT16 RÉSERVÉ3 ;
/****/ volatile UINT16 CR2 ;
const statique UINT16 CR2_StopBits_1 = ((UINT16)0x0000);
const statique UINT16 CR2_StopBits_0_5 = ((UINT16)0x1000);
const statique UINT16 CR2_StopBits_2 = ((UINT16)0x2000);
const statique UINT16 CR2_StopBits_1_5 = ((UINT16)0x3000);
const statique UINT16 CR2_StopBits_Mask= ((UINT16)0xCFFF); /* Masque de bits d'arrêt USART CR2 */
UINT16 RÉSERVÉ4 ;
/****/ volatile UINT16 CR3 ;
const statique UINT16 CR3_HardwareFlowControl_None = ((UINT16)0x0000);
const statique UINT16 CR3_HardwareFlowControl_RTS = ((UINT16)0x0100);
const statique UINT16 CR3_HardwareFlowControl_CTS = ((UINT16)0x0200);
const statique UINT16 CR3_HardwareFlowControl_RTS_CTS = ((UINT16)0x0300);
const statique UINT16 CR3_HardwareFlowControl_Mask = ((UINT16)0xFCFF);
UINT16 RÉSERVÉ5 ;
/****/ volatile UINT16 GTPR ;
UINT16 RÉSERVÉ6 ;
} ;
Avec le code ci-dessus, nous pouvons facilement faire fonctionner le registre du port série.
L'initialisation du port série nécessite le travail d'initialisation suivant (la carte de développement STM3210E dispose de trois ports série, nous prendrons le port série 1 comme exemple) :
1. Allumez l'horloge du port série
UsartId = CortexM3_NVIC :: c_IRQ_Index_USART1;
RCC.APB2ENR |= CortexM3_RCC::APB2_GPIOA | CortexM3_RCC::APB2_USART1;
2. Interruption d'activation
if(!CPU_INTC_ActivateInterruptEx( UsartId, (UINT32)(void *)USART1_IRQHandler)) renvoie FALSE ;
3. Définissez les paramètres du port série, tels que le débit en bauds, la parité, les bits de données, les bits d'arrêt, etc.
légèrement
4. Redéfinition 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. Activation du port série
Usart.CR1 |= CortexM3_Usart::CR1_UE_Set;
Complétez l'envoi et la réception des données dans la fonction d'interruption :
void CortexM3_USART_Driver::ISR (paramètre void*)
{
UINT32 comPort = (UINT32)param ;
CortexM3_Usart &Usart=CortexM3::Usart(comPort);
char c;
Statut UINT32 ;
Statut = Usart.SR ;
si (Statut & CortexM3_Usart :: SR_RXNE)
{
c = Usart.DR;
USART_AddCharToRxBuffer( comPort, c );
Events_Set(SYSTÈME_EVENT_FLAG_COM_IN);
}
si (Statut & CortexM3_Usart :: SR_TC)
{
if(0 == (c_RefFlagTx & g_CortexM3_USART_Driver.m_RefFlags[comPort]))
{
retour;
}
si (USART_RemoveCharFromTxBuffer (comPort, c))
{
WriteCharToTxBuffer( comPort, c );
}
autre
{
// désactive les autres interruptions Tx puisque nous sommes déclenchés par niveau
TxBufferEmptyInterruptEnable(comPort, FALSE);
}
Events_Set(SYSTÈME_EVENT_FLAG_COM_OUT);
}
}
Le code principal est le contenu pertinent présenté ci-dessus. Ci-dessous, nous écrivons un code de test de port série dans NativeSample :
annuler ApplicationEntryPoint()
{
pendant que(VRAI)
{
si (Events_WaitForEvents (SYSTEM_EVENT_FLAG_COM_IN,100))
{
Événements_Clear(SYSTEM_EVENT_FLAG_COM_IN);
char bytData[512];
int Taille=USART_BytesInBuffer(0,TRUE);
USART_Read(0,octetDonnées,Taille);
pour(int i=0;i<Taille;i++)
debug_printf("%c",bytData[i]);
}
debug_printf("Bonjour Micro Framework!!!rn");
}
}