Datenuebertragung-STM32F4

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Datenübertragung über 4 Datenleitungen

Zwei STM32F4 Discovery Boards sollen durch 4 parallele Datenleitungen und eine Steuerleitung, ähnlich der LCD-Implementierung, miteinander kommunizieren. An einem Board werden über eine PS/2 Tastatur Zeichen eingegeben. Von diesem Board werden die Zeichen an das zweite Board übertragen. Das zweite Board sendet diese Zeichen über die USART-Schnittstelle an ein PC-Terminal Programm (Putty oder Teraterm).

Blockschaltbild

Blockschaltbild STM32F4.png Beschreibung des Projekts als Fließtext und/oder Liste von Features.

PIN-Belegung

Schaltplan stm32f4kom.png

Übertragung

Die Übertragung erfolgt parallel über 4 Datenleitungen. Eine Control Leitung „C“ teilt den Empfänger (RCV) mit wann die vom Sender (XMT) angelegten Daten gültig sind (positive Flanke des Control Signales). Da ein Character aus 8 Bit besteht, jedoch nur 4 Datenleitungen für die parallele Übertragung verfügbar sind, muss ein Character in Nibbles zu 4 Bit unterteilt werden. Auf der Empfangsseite werden die 2 empfangenen Nibbles wieder zu einem Character mit 8 Bit zusammengesetzt.

Code

Site A

/**

 * @brief  Main-Funktion
 * @param  None
 * @retval None
 */

int main(void){ /* Stromversorgung / mit Takt versorgen */

     RCC_initialisieren();
     /* Pins konfigurieren */
     GPIO_initialisieren();
     /* Interrupt fuer PS2-Clock */
     EXTILine15_10_Config();
     /* Auf interrupt warten */

while(1){} }

RCC Config

/**

  • @brief Stromversorgung und Takt für SYSCFG und GPIO aktivieren
 * @param  None
 * @retval None
 */

void RCC_initialisieren(void){

     /* Für EXTI - GPIO */
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
     // EXTI mit Takt versorgen
     /* Für XMT */
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
     // GPIOC mit Takt versorgen
     /* Für PS2 */
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
     // GPIOE mit Takt versorgen

}

GPIO Config

/**

 * @brief  GPIO Pins konfigurieren
 * Transmit:GPIOC (Pin 0-3 Daten,Pin 15 Steuerleitung) 
 *  PS2: GPIOE (Pin 9 -> Daten | Pin 11 -> Clock)
 * @param  None
 * @retval None
 */

void GPIO_initialisieren(void){

     /* Senddata (Daten) */
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     // Ports als Output definieren
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; // Pins 0,1,2,3 aktivieren
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Output Modus: Push-pull 
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // Abtastfrequenz auf 2MHz       
     GPIO_Init(GPIOC, &GPIO_InitStructure);
     // GPIOC Konfiguration übergeben, Pointer auf Struktur mit Config
     
     /* Steuerleitung */
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Port als Output definieren 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // Pin 15 aktivieren 
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Output Modus: Push-pull 
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // Abtastfrequenz auf 2MHz       
     GPIO_Init(GPIOC, &GPIO_InitStructure);
     // GPIOC Konfiguration übergeben, Pointer auf Struktur mit Config
     
     /* PS2 -> (Pin 9 -> Daten | Pin 11 -> Clock) */ 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // Port als Input definieren 
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // Input Modus: Pull-Up 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11;
     // Pin9 und Pin11 aktivieren
     GPIO_Init(GPIOE, &GPIO_InitStructure);
     // GPIOE Konfiguration übergeben, Pointer auf Struktur mit Config

}

EXTI-Config

/**

 * @brief  EXTI auf PE11 konfigurieren
 * @param  None
 * @retval None
 */

void EXTILine15_10_Config(void) {

     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);
     // Verbinde EXTILine15_10 mit PE11
EXTI_InitStructure.EXTI_Line = EXTI_Line11; // EXTI_Line 11
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Auf Interrupt-Mode EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // fallende Flanke (-> low) = Daten sind gueltig // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; // EXTI aktivieren EXTI_Init(&EXTI_InitStructure); // EXTI Konfiguration übergeben , Pointer auf Struktur mit Config NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; // NVIC-Kanal 15_10 für EXTI_Line 11 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // PreemtionPrio = 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; // SubPrio = 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC-Kanal aktivieren NVIC_Init(&NVIC_InitStructure); // NVIC Konfiguration übergeben , Pointer auf Struktur mit Config

}


Interrupt-Routine


/**

  • @brief Interrupt Handler für Pin11 (Clock von der Tastatur) * @param None
  • @retval None
  • /

void EXTI15_10_IRQHandler(void) {

     if(EXTI_GetITStatus(EXTI_Line11) != RESET) // überprüfen ob Pending Bit gesetzt ist 
     {
           ps2_data(); // Aufruf der Funktin in "functions.c" 
           EXTI_ClearITPendingBit(EXTI_Line11); // Pendingbit löschen
     }

}

Download

Receive Programm(Keil Projekt): Datei:RCV v18.zip

Transmit Programm(Keil Projekt): Datei:XMT v21.zip