Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx_conf.h"
- #include "stm32f4xx_gpio.h"
- #include "stm32f4xx_rcc.h"
- #include "stm32f4xx_tim.h"
- #include "misc.h"
- #include "stm32f4xx_exti.h"
- #include "stm32f4xx_syscfg.h"
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- int stan = 0;
- int i;
- void Delay(__IO uint32_t nCount)
- {
- while(nCount--)
- {
- }
- }
- GPIO_konfiguracja()
- {
- // Configure PD12, PD13, PD14 and PD15 in output pushpull mode
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14|GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- }
- void TIM3_IRQHandler(void)
- {
- unsigned int i;
- if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
- {
- while(1)
- {
- GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
- for(i=0;i< 100000;i++){}
- }
- // wyzerowanie flagi wyzwolonego przerwania
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
- }
- }
- void TIM4_IRQHandler(void)
- {
- unsigned int i;
- if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
- {
- while(1)
- {
- GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
- for(i=0;i< 100000;i++){}
- }
- // wyzerowanie flagi wyzwolonego przerwania
- TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
- }
- }
- void przerwanie_wew_tim3()
- {
- // ustawienie trybu pracy priorytetow przerwan
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitTypeDef NVIC_InitStructure;
- // numer przerwania
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- // priorytet glowny
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; // 15
- // subpriorytet
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
- // uruchom dany kanal
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- // zapisz wypelniona strukturedo rejestrow
- NVIC_Init(&NVIC_InitStructure);
- //Numerow przerwan nalezy szukac w pliku stm32f4xx.h jako wartosci typu
- //wyliczeniowego IRQn.
- // wyczyszczenie przerwania od timera 3 (wystapilo przy konfiguracji timera)
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
- // zezwolenie na przerwania od przepelnienia dla timera 3
- TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
- }
- void przerwanie_wew_tim4()
- {
- // ustawienie trybu pracy priorytetow przerwan
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitTypeDef NVIC_InitStructure;
- // numer przerwania
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
- // priorytet glowny
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
- // subpriorytet
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
- // uruchom dany kanal
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- // zapisz wypelniona strukturedo rejestrow
- NVIC_Init(&NVIC_InitStructure);
- //Numerow przerwan nalezy szukac w pliku stm32f4xx.h jako wartosci typu
- //wyliczeniowego IRQn.
- // wyczyszczenie przerwania od timera 3 (wystapilo przy konfiguracji timera)
- TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
- // zezwolenie na przerwania od przepelnienia dla timera 3
- TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
- }
- void zad6()
- {
- //Korzystając z informacji przedstawionych na wykładzie oraz informacji
- //zawartych w pliku misc.c dotyczących priorytetów
- //(NVIC_IRQChannelPreemptionPriority oraz NVIC_IRQChannelSubPriority) napisać
- //program, który zobrazuje działanie wywłaszczania przerwań. Przykład: stworzyć
- //dwa timery, które odmierzają odpowiednio 5 oraz 10 sekund. W funkcjach
- //obsługi przerwań umieścić nieskończoną pętlę, która zmienia stanu pinu od
- //diody LED w pewnych odstępach czasu (opóźnienia za pomocą pustych pętli).
- //Niech każda z funkcji obsługi timera kontroluje inną diodę. Modyfikując
- //priorytety przerwań obserwować efekty wykonania programu
- SystemInit();
- SystemCoreClockUpdate();
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
- GPIO_konfiguracja();
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- // Time base configuration
- TIM_TimeBaseStructure.TIM_Period =41999; // co 5sek - 41999,9995 // co 3 = 5997 ;
- TIM_TimeBaseStructure.TIM_Prescaler = 9995;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- //uruchomienie timera
- TIM_Cmd(TIM3, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- //timer
- TIM_TimeBaseStructure.TIM_Period = 41999; //2000; //41999; // co 200ms - 41999, 399,8
- TIM_TimeBaseStructure.TIM_Prescaler = 19990; //399; //8400; //9995; // co 10 sek = 19990
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
- TIM_Cmd(TIM4,ENABLE);
- //dla tim3
- //przerwania_wewnetrzne();
- przerwanie_wew_tim3();
- //dla tim4
- //przerwania_wewnetrzne_tim4_v2();
- przerwanie_wew_tim4();
- }
- int main()
- {
- //zad1();
- //zad2();
- //zad3();
- //zad4();
- //zad5();
- zad6();
- while(1)
- {}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement