Wie man eine LED auf ARM STR9 blinkt

Ich bin ziemlich neu in STR 9 und auch in der Mikrocontroller-Programmierung. Kann mir bitte jemand die Bedeutung dieser Zeilen im Beispiel blinky erklären. Ich habe Schwierigkeiten, es zu verstehen. Danke

Ich möchte nur eine LED auf einmal blinken lassen, sagen wir LED Nr. 4 . Wie kann ich es tun?

    int main (void) {
  unsigned int i, n;
  unsigned short AD_old, AD_value;

  /* ADC Setup                                                                */
  SCU->GPIOIN[4]  |= 0x01;                /* P4.0 input  - mode 0             */
  SCU->GPIOOUT[4] &= 0xFFFC;              /* P4.0 output - mode 0             */
  GPIO4->DDR      &= 0xFE;                /* P4.0 direction - input           */
  SCU->GPIOANA    |= 0x0001;              /* P4.0 analog mode ON              */

  ADC->CR         |= 0x0002;              /* Set POR bit                      */
  for (n = 0; n < 100000; n ++);          /* Wait > 1 ms  (at 96 MHz)         */

  ADC->CR         &= 0xFFF7;              /* Clear STB bit                    */
  for (n = 0; n < 1500; n ++);            /* Wait > 15 us (at 96 MHz)         */

  ADC->CR         |= 0x0400;              /* Enable end of conversion interupt*/
  ADC->CCR         = 0x0003;              /* AD Conversion, No WDG on Ch 0    */

  SCU->GPIOOUT[7]  = 0x5555;              /* P7.0..7 output - mode 1          */
  GPIO7->DDR       = 0xFF;                /* P7.0..7 Outputs (LED Data)       */

  /* LCD Setup                                                                */
  GPIO8->DDR       = 0xFF;                /* P8.0..7 Outputs (LCD Data)       */
  GPIO9->DDR       = 0x07;                /* P9.0..2 Outputs (LCD Control)    */

  lcd_init();
  lcd_clear();
  lcd_print (" MCB-LAB  ");
  set_cursor (0, 1);
  lcd_print (" biomed ");

  for (i = 0; i < 200; i++) wait();       /* Wait for initial display         */

  /* Configure and enable IRQ for A/D Converter (ADC)                         */
  VIC0->VAiR[15]  = (unsigned int)ADC_IRQ_Handler; /* Setup ADC IRQ Hndl addr */
  VIC0->VCiR[15] |= 0x20;                 /* Enable the vector interrupt      */
  VIC0->VCiR[15] |= 15;                   /* Specify the interrupt number     */
  VIC0->INTER    |= (1<<15);              /* Enable ADC interrupt             */

  /* Configure and enable IRQ for Timer (TIM3)                                */
  VIC0->VAiR[7]   = (unsigned int)TIM3_IRQ_Handler;/* Setup TIM3 IRQ Hndl addr*/
  VIC0->VCiR[7]  |= 0x20;                 /* Enable the vector interrupt      */
  VIC0->VCiR[7]  |= 7;                    /* Specify the interrupt number     */
  VIC0->INTER    |= (1<<7);               /* Enable TIM3 interrupt            */

  /* Timer 3 Configuration (TIM3)                                             */
  TIM3->CNTR      = 0x0000;               /* Setup TIM3 counter register      */
  TIM3->CR2      &= 0xFF00;               /* Clear prescaler value            */
  TIM3->CR2      |= 0x000F;               /* Setup TIM3 prescaler             */
  TIM3->CR2      |= 0x2000;               /* TIM3 timer overflow intrupt en   */
  TIM3->CR1      |= 0x8000;               /* TIM3 counter enable              */

    while (1) {                             /* Loop forever                     */
    for (n = 0x01; n <= 0xFF; n <<= 1) {
      GPIO7->DR[0x3FC] = n;               /* Turn on LED                      */
      wait();                             /* Delay                            */
      AD_value = AD_last;                 /* Read AD_last value               */
      if (AD_value != AD_last)            /* Make sure that AD interrupt did  */
        AD_value = AD_last;               /* not interfere with value reading */
      AD_value /= 13;                     /* Scale to AD_Value to 0 - 78      */
      if (AD_old != AD_value)  {          /* If AD value has changed          */
        set_cursor (0, 1);
        AD_old = AD_value;
        for (i = 0; i < 16; i++)  {       /* Disp bargraph according to AD    */
          if (AD_value > 5)  {
            lcd_putchar (0x05);
            AD_value -= 5;
          }  else  {
            lcd_putchar (AD_value);
            AD_value = 0;
          }
        }
      }
    }
  }
}

Antworten (2)

Als erstes müssen alle Dinge entfernt werden, die nichts mit dem Blinken der LED zu tun haben.

int main (void) {

  SCU->GPIOOUT[7]  = 0x5555;              /* P7.0..7 output - mode 1          */
  GPIO7->DDR       = 0xFF;                /* P7.0..7 Outputs (LED Data)       */

    while (1) {                             /* Loop forever                     */
    for (n = 0x01; n <= 0xFF; n <<= 1) {  
      GPIO7->DR[0x3FC] = n;               /* Turn on LED                      */
  }
}

Ich habe mir das Datenblatt nicht angesehen, aber ich würde vermuten, dass:

SCU->GPIOOUTsetzt die Funktion der Pins auf GPIO. GPIO7->DDRSetzt die Pins auf Ausgänge (Data Direction Register) GPIO7->DRSetzt die auszugebenden Daten.

Der nächste Schritt besteht darin, sich diese Register in der Dokumentation anzusehen und ihre genaue Funktion zu überprüfen.

+1 fürThe first thing is to remove all of the stuff unrelated to flashing the LED.
Eine weitere +1 zum Entfernen aller Dinge, die nichts mit dem Blinken der LED zu tun haben.

Die Mikrocontroller-Familie STR91x verfügt über sehr flexible Peripheriegeräte. Leider macht diese Flexibilität die Einrichtung etwas kompliziert. Mein Vorschlag ist, mit dem Herunterladen der STR91xFA-Firmwarebibliothek von ST.com zu beginnen . Sobald Sie die Bibliothek mit Ihrem Projekt verknüpft haben, müssen Sie etwas Ähnliches wie das Folgende tun, um Port 7 (vorausgesetzt, Ihre LEDs sind an Port 7 angeschlossen) als Allzweck-Ausgangspins zu konfigurieren:

void InitGPIO7( void )
{
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Enable the GPIO7 clock */
   SCU_APBPeriphClockConfig(__GPIO7, ENABLE);

   /* Initialize the GPIO port */
   GPIO_DeInit(GPIO7);

   /* Configure port 7 pins as general purpose output */
   GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
   GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
   GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
   GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1;
   GPIO_Init (GPIO7, &GPIO_InitStructure);
}

Nachdem der Port konfiguriert wurde, können Sie die Bibliotheksfunktion verwenden

GPIO_Write(...);  /* see documentation for parameters */

auf alle 8 Bits auf einmal schreiben oder

GPIO_WriteBit(...);  /* see documentation for parameters */

um jeweils ein Bit zu schreiben.

Beachten Sie, dass dies ungetesteter Code ist.