Forum: Mikrocontroller und Digitale Elektronik Frage zu GPIO STM32


von Sven T. (theoretiker87)


Lesenswert?

Hallo,
habe eine Verständnis Frage:

was genau bedeutet Reset Bit und Set Bit?

Bit Setzen: GPIO_BSRR_BS_6;

und

Bit Restet: GPIO_BSRR_BR_6;

die frage bezieht sich auf die 6 und das Register.




Grüsse

von DanS S. (dns712)


Lesenswert?

Möchtest du einfach nur ein GPIO setzten oder wie muss man die Frage 
verstehen?

Set Bit:    Du setzte den Ausgang auf High

Reset Bit:  Du setzte den GPIO auf Low

In deinem Fall GPIO6 eines PORTS

von Horst (Gast)


Lesenswert?

Was verstehst Du da dran jetzt nicht?
Was ein gesetztes Bit ist oder was das 6. Bit ist?

von Sven T. (theoretiker87)


Lesenswert?

Hallo,

ich verwende das für die Erzeugung eines PWM Signals.
Das soll über einen DMA erzeugt werden. Dazu setze ich die Bit oder 
resete das Bit.



Aber ich glaube ich habe es Verstanden.


Grüsse

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

PWM ueber DMA? Warum nicht mit Timer?

von Sven T. (theoretiker87)


Lesenswert?

Hallo,

Ja dieses PWM- Signal soll einfacher zu konfiguieren sein, also zum 
Beispiel Zahnräder abbilden.
Daher ist das über einen DMA Ausgang einfacher.
Ich dachte ich kann mit dem GPIO das Zahnrad wiedergeben.


Grüsse

von hä! (Gast)


Lesenswert?

Zahnrad  -> Sägezahn vielleicht ???

von Sven T. (theoretiker87)


Lesenswert?

So ich habe jetzt ein Programm geschrieben, wie ich mir das Vorstelle.
Aber ich finde den Fehler nicht weil ich noch kein PWM Signal aus GPIO 
PIN E6 bekomme.
Jemand eine Idee.
Hier das Programm:


#define Speed_MAX      280
#define Speed_MIN      20
#define Raddurchmesser    300   //mm
#define Buffersize      360
#define PI          3.14

uint32_t RDS_buffer[Buffersize];

uint16_t speed;


void RDS_Init_GPIO (void)
{
  GPIO_InitTypeDef    GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE , &GPIO_InitStructure);
  GPIO_ResetBits(GPIOE,GPIO_Pin_11);


}


void RDS_Init_TIM_DMA(void)
{
  DMA_InitTypeDef      DMA_InitStructure;

  /*DMA for RDS Gemoetry*/
  DMA_DeInit(DMA_RDS);
  while(DMA_GetCmdStatus(DMA_RDS));
  DMA_InitStructure.DMA_Channel = DMA_Channel_7;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &GPIOE->BSRRL;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) RDS_buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = Buffersize;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA_RDS, &DMA_InitStructure);
  /* Enable DMA1 Stream1 */
  DMA_Cmd(DMA_RDS, ENABLE);



  TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

  TIM_Cmd(TIM8, DISABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
  TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInitStructure.TIM_Period = 0;          setting
  TIM_TimeBaseInitStructure.TIM_Prescaler = 5;
  //TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;

  TIM_ARRPreloadConfig(TIM8, DISABLE);

  //TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseInitStructure);

  TIM_DMACmd(TIM8, TIM_DMA_CC3, ENABLE);

}





void RDS_Encoder_Wheel() // Vorgabe der Zähnezahl durch den Modul
{

  int i;
  for(i=0; i<360; i++)
  {
    if(i%6 < 3)
      RDS_buffer[i] = GPIO_BSRR_BS_6;
    else
      RDS_buffer[i] = GPIO_BSRR_BR_6;
  }
}



 void Speed_Init(uint16_t speed)
{
  uint16_t  speed_tics;

  TIM_Cmd(TIM8, ENABLE);

  speed_tics = 28000000/6/speed;

    if (TIM8->CNT >= speed_tics)
      {                      TIM8->CNT = speed_tics -1;
    }
    TIM8->ARR = speed_tics;
}

von Imperator (Gast)


Lesenswert?

Nutze bitte die Formatierung
1
C-Code
 für dein Code!

Habe jetzt nicht den ganzen Code angeschaut. Bei Timer 1,8,...(siehe 
Datenblätter) muss TIM_CtrlPWMOutputs(...); eingefügt werden.

von Sven T. (theoretiker87)


Lesenswert?

Hallo,
Hm ich nutze DMA und nicht die Klassischen PWM Varianten mit 
TIM_OC_Mode.
Im Refernzhandbuch steht das man das in Verbindung mit TIM_OC_Mode 
macht. Den benutze ich nicht.
Ich denke mit den GPIO sitmmt was nicht.

Grüsse

von Bastler (Gast)


Lesenswert?

>RDS_buffer[i] = GPIO_BSRR_BR_6;

meinst du nicht: GPIO_BSRR_BR_6 = RDS_buffer[i];  ???

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.