Benutzer:Mtothea

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

Meine kleinen Programme

Basic Timer

// Mein erstes Mainfile

// Mit der conf-Datei beherrschen und steuern wir // die gesammte

  1. include "stm32f4xx_conf.h"
  1. include "stm32f4xx.h"

void RCC_init(void){ // ueber die RCC werden die diversen Peripherie-Einheiten eingeschaltet // (durch konfiguration der RCC) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); }


void GPIO_init(void){//Name ist selbst gew‰hlt // hier werden alle GPIO-Pins konfiguriert // etwas schwieriger, weil es ueber eine Struktur // gemacht werden muss, dafuer ist dann alles auf // einen Schlag erledigt

GPIO_InitTypeDef GPIO_InitTypeStructure;

GPIO_InitTypeStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitTypeStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitTypeStructure.GPIO_Pin=GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12; GPIO_InitTypeStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitTypeStructure.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_Init(GPIOD, &GPIO_InitTypeStructure); }


void TIM7_init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_Prescaler=16800;

 TIM_TimeBaseInitStructure.TIM_Period=2500;

TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStructure);

// Der Timer muss nicht nur ueber die RCC eingeschaltet werden, // sondern auch nur so zum Zaehlen gebracht werden. // Das ist im Bedarfsfall ein/ausschaltbar. TIM_Cmd(TIM7, ENABLE);

// dieser Timer darf einen Interrupt auslˆsen TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); }


void NVIC_init(void){ NVIC_InitTypeDef NVIC_InitTypeStructure; NVIC_InitTypeStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitTypeStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitTypeStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitTypeStructure.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitTypeStructure); }

void TIM7_IRQHandler(void){ // 1. Diese Funktion MUSS so heissen // 2. Diese Funtion wird beim Auftreten des Interrups ausgefuehrt // 3. Das PENDING BIT muss zurueckgesetzt werden

// Das ist die Nutzlast der Interrupt Service Routine (Handler) GPIO_ToggleBits(GPIOD, GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);

TIM_ClearITPendingBit(TIM7, TIM_IT_Update);

}


int main(void){

RCC_init(); // Stromversorgung GPIO_init(); // Alle Pins konfigurieren

GPIO_SetBits(GPIOD, GPIO_Pin_14 | GPIO_Pin_12);

TIM7_init(); // Timer 7 los NVIC_init(); // NVIC, oje


while(1){ // jetzt immer Nase bohren, weil Core sonst // die Arbeit einstellen wuerde // hier erfolgt das blinken

// hier tun wir genau gar nix, der Kern kˆnnte auch Schlafen // das ist gutes Nasebohren

}

}

Systick

//Mit der CONF-Datei beherrschen und steuern wir //die ganze FW-Lib

  1. include "stm32f4xx_conf.h"

//die Includes, damit wir und nichtmehr //irgedwelche Adressen zusammensuchen muessen

  1. include "stm32f4xx.h"


void RCC_initialisieren(void){ //ueber die RCC werden die diversen Peripherie-Einheiten //eingeschaltet (durch Konfiguration der RCC) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); }

void GPIO_initialisieren(void){ //hier werden alle GPIO-Pins konfiguriert //etwas schwieriger, weil es ueber eine Struktur //gemacht werden muss, dafuer ist dann alles auf //einen Schlag erledigt

GPIO_InitTypeDef GPIO_InitTypeStructure; GPIO_InitTypeStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitTypeStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitTypeStructure.GPIO_Pin=GPIO_Pin_15| GPIO_Pin_14| GPIO_Pin_13| GPIO_Pin_12; GPIO_InitTypeStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitTypeStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitTypeStructure);

}

void SysTick_initialisieren (void){

SysTick_Config(SystemCoreClock/100);

}


char counter = 0;

void SysTick_Handler(void) { counter++; if (counter==25) GPIO_ToggleBits(GPIOD,GPIO_Pin_15); if (counter==50) GPIO_ToggleBits(GPIOD,GPIO_Pin_14); if (counter==75) GPIO_ToggleBits(GPIOD,GPIO_Pin_13); if (counter==100){ GPIO_ToggleBits(GPIOD,GPIO_Pin_12); counter = 0; } }


int main(void){

RCC_initialisieren(); // Stromversorgung GPIO_initialisieren(); // Alle Pins konfigurieren und schonmal zwei LEDs einschalten SysTick_initialisieren();


while(1){} // Hier tun wir GENAU GAR NIX // Der Kern koennte auch schlafen // Es wird nur auf die Unterbrechung durch den Interrtup gewartet // Das ist "gutes" Nasebohren }


USART

// Mein erstes Mainfile

// Mit der conf-Datei beherrschen und steuern wir // die gesammte

  1. include "stm32f4xx_conf.h"
  2. include "stm32f4xx.h"

void RCC_init(void){ // ueber die RCC werden die diversen Peripherie-Einheiten eingeschaltet // (durch konfiguration der RCC) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); }


void GPIO_init(void){//Name ist selbst gew‰hlt // hier werden alle GPIO-Pins konfiguriert // etwas schwieriger, weil es ueber eine Struktur // gemacht werden muss, dafuer ist dann alles auf // einen Schlag erledigt

GPIO_InitTypeDef GPIO_InitTypeStructure;


GPIO_InitTypeStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitTypeStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitTypeStructure.GPIO_Pin=GPIO_Pin_13; GPIO_InitTypeStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitTypeStructure.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_Init(GPIOD, &GPIO_InitTypeStructure);


GPIO_InitTypeStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitTypeStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitTypeStructure.GPIO_Pin=GPIO_Pin_15; GPIO_InitTypeStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitTypeStructure.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_Init(GPIOD, &GPIO_InitTypeStructure); GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);


GPIO_InitTypeStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitTypeStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitTypeStructure.GPIO_Pin=GPIO_Pin_2; GPIO_InitTypeStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitTypeStructure.GPIO_Speed=GPIO_Speed_2MHz;


GPIO_Init(GPIOA, &GPIO_InitTypeStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);

// Eine Led wird von Beginn an eingeschaltet GPIO_SetBits(GPIOD, GPIO_Pin_13); }


void USART2_init(void){ USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate=9600; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Tx; USART_InitStructure.USART_Parity=USART_Parity_No; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE);

}

void TIM4_init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseInitStructure.TIM_Prescaler=99; // 41999 w‰re standard

 TIM_TimeBaseInitStructure.TIM_Period=1999;

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);

// Der Timer muss nicht nur ueber die RCC eingeschaltet werden, // sondern auch nur so zum Zaehlen gebracht werden. // Das ist im Bedarfsfall ein/ausschaltbar. TIM_Cmd(TIM4, ENABLE);

// jetzt den Channel konfigurieren TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse=100; // 1000 w‰re Standard

TIM_OC4Init(TIM4, &TIM_OCInitStructure);

}


int main(void){

RCC_init(); // Stromversorgung GPIO_init(); // Alle Pins konfigurieren

GPIO_SetBits(GPIOD, GPIO_Pin_14 | GPIO_Pin_12);

TIM4_init(); // Timer 7 los USART2_init();

while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) !=SET) {

} USART_SendData(USART2, 65);


while(1){ // jetzt immer Nase bohren, weil Core sonst // die Arbeit einstellen wuerde // hier erfolgt das blinken

// hier tun wir genau gar nix, der Kern kˆnnte auch Schlafen // das ist gutes Nasebohren

}

}