Benutzer:Mtothea
Meine kleinen Programme
Basic Timer
// Mein erstes Mainfile
// Mit der conf-Datei beherrschen und steuern wir
// die gesammte
- include "stm32f4xx_conf.h"
- 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
- include "stm32f4xx_conf.h"
//die Includes, damit wir und nichtmehr
//irgedwelche Adressen zusammensuchen muessen
- 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
- include "stm32f4xx_conf.h"
- 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
}
}