#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
uint32_t msCnt;
void SysTick_Handler(void)
{
msCnt++;
}
void delayms(uint32_t t)
{
uint32_t i,j;
i = j = msCnt;
while((j - i) < t)j = msCnt;
}
static unsigned char LEDSEG[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
static unsigned char LEDDIG[] = {0x0E,0x0D,0x0B,0x07}; //λѡ
static unsigned char LEDBuffer[4] = {0,0,0,0}; //ѧºÅ
static unsigned char LEDIndex=0;
static unsigned char LED_min1=0;
static unsigned char LED_min2=0;
static unsigned char LED_s1=0;
static unsigned char LED_s2=0;
/***********ÊýÂë¹ÜGPIOʹÄܺ¯Êý************/
void LEDPin_Init(void)
{
GPIO_InitTypeDef MyGPIO;
//GPIOE0-12 ʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
MyGPIO.GPIO_Mode = GPIO_Mode_OUT; //Êä³öģʽ
MyGPIO.GPIO_OType = GPIO_OType_PP; //ÍÆÍìÊä³ö
MyGPIO.GPIO_PuPd = GPIO_PuPd_NOPULL; //²»ÉÏÀ²»ÏÂÀ
MyGPIO.GPIO_Speed = GPIO_Speed_2MHz; //2MHZËÙÂÊ
GPIO_Init(GPIOE,&MyGPIO);
}
/***********GPIOA9³õʼ»¯º¯Êý************/
void LEDFANZHUAN_Init(void)
{
GPIO_InitTypeDef MyGPIO;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_9;
MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
MyGPIO.GPIO_OType = GPIO_OType_PP;
MyGPIO.GPIO_PuPd = GPIO_PuPd_UP;
MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&MyGPIO);
}
/***********°´¼üGPIO³õʼ»¯º¯Êý************/
void AJ_Init(void)
{
GPIO_InitTypeDef MyGPIO;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_5;
MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
MyGPIO.GPIO_PuPd = GPIO_PuPd_UP;
MyGPIO.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA,&MyGPIO);
}
/***********°´¼üÖжϳõʼ»¯º¯Êý************/
void Key_EXTI_Init(void)
{
EXTI_InitTypeDef MyEXTI;
RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource1);
MyEXTI.EXTI_Line = EXTI_Line1; //EXTIÏß1
MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling; //ϽµÑØ´¥·¢
MyEXTI.EXTI_LineCmd = ENABLE;
EXTI_Init(&MyEXTI);
}
void Key1_EXTI_Init(void)
{
EXTI_InitTypeDef MyEXTI;
RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource5);
MyEXTI.EXTI_Line = EXTI_Line5;
MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling;
MyEXTI.EXTI_LineCmd = ENABLE;
EXTI_Init(&MyEXTI);
}
/***********°´¼üNVICÓÅÏȼ¶³õʼ»¯***************/
void Key_NVIC_Init(void)
{
NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = EXTI1_IRQn;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;
MyNVIC.NVIC_IRQChannelSubPriority = 1;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
}
void Key1_NVIC_Init()
{
NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = EXTI9_5_IRQn;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;
MyNVIC.NVIC_IRQChannelSubPriority = 0;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
}
/***********ÖжÏÏìÓ¦º¯Êý**********/
void EXTI1_IRQHandler(void) //¸Ä±äÃëÊý
{
if(RESET != EXTI_GetFlagStatus(EXTI_Line1))
{
LED_s1++;
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void EXTI9_5_IRQHandler(void)
{
if(RESET != EXTI_GetFlagStatus(EXTI_Line5))
{
LED_min1++;
EXTI_ClearITPendingBit(EXTI_Line5);
}
}
/***********¶¨Ê±Æ÷1¡¢2¡¢3NVICÓÅÏȼ¶³õʼ»¯***************/
void Timer_NVIC_Init(void)
{
NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = TIM3_IRQn;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;
MyNVIC.NVIC_IRQChannelSubPriority = 2;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
}
void Timer2_NVIC_Init(void)
{
NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = TIM2_IRQn; //ÖжÏԴΪ¶¨Ê±Æ÷2
MyNVIC.NVIC_IRQChannelPreemptionPriority = 1; //¶¨Ê±Æ÷2ÇÀÕ¼ÓÅÏȼ¶Îª1
MyNVIC.NVIC_IRQChannelSubPriority = 2; //¶¨Ê±Æ÷2ÏìÓ¦ÓÅÏȼ¶Îª2
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
}
void Timer3_NVIC_Init(void)
{
NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = TIM5_IRQn;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 1;
MyNVIC.NVIC_IRQChannelSubPriority = 1;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
}
/***********¶¨Ê±Æ÷3³õʼ»¯***************/
void TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef MyTIM;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3EN,ENABLE);
MyTIM.TIM_Prescaler = 800-1;
MyTIM.TIM_Period = 1000-1;
MyTIM.TIM_CounterMode = TIM_CounterMode_Up; //µÝÔö¼ÆÊý
MyTIM.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM3,&MyTIM);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //ʹÄÜ
TIM_Cmd(TIM3,ENABLE);
}
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef MyTIM;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM2EN,ENABLE);
MyTIM.TIM_Prescaler = 8-1;
MyTIM.TIM_Period = 1000-1;
MyTIM.TIM_CounterMode = TIM_CounterMode_Up;
MyTIM.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM2,&MyTIM);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
void TIM5_Init(void)
{
TIM_TimeBaseInitTypeDef MyTIM;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM5EN,ENABLE);
MyTIM.TIM_Prescaler = 8-1;
MyTIM.TIM_Period = 1000-1;
MyTIM.TIM_CounterMode = TIM_CounterMode_Up;
MyTIM.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM5,&MyTIM);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM5,ENABLE);
}
void TIM1_CH1_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //TIM1ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄÜPORTAʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //ÉÏÀ
GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA8
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1);
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //ʹÄÜTIM1ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); //½ûÖ¹TIM1-CH2 Êä³öÐèÒªµ¥¶ÀʹÓÃTIM1-CH2ʱ´Ë´¦ÒòÉèÖÃΪ½ûÖ¹TIM1-CH2N Êä³ö
TIM_ARRPreloadConfig(TIM1,ENABLE); //ARPEʹÄÜ
TIM_Cmd(TIM1, ENABLE); //ʹÄÜTIM1
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_SetCompare1(TIM1, 200);
}
void TIM3_IRQHandler (void)
{
if(RESET != TIM_GetITStatus(TIM3,TIM_IT_Update))
{
LED_s1++;
LEDBuffer[0] = LED_s1;
LEDBuffer[1] = LED_s2;
LEDBuffer[2] = LED_min1;
LEDBuffer[3] = LED_min2;
if(LED_min2==2)
{
if(LED_min1==3)
{
if(LED_s2==5)
{
if(LED_s1==9)
{
LED_s1 = 0;
LED_s2 = 0;
LED_min1 = 0;
LED_min2 = 0;
}
}
}
}
if(LED_min1==9)
{
if(LED_s2==5)
{
if(LED_s1==9)
{
LED_min2++;
LED_min1=0;
}
}
}
if(LED_s2==5)
{
if(LED_s1==9)
{
LED_min1++;
LED_s2=0;
}
}
if(LED_s1==9)
{
LED_s2++;
LED_s1=0;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
GPIO_Write(GPIOE,(LEDDIG[LEDIndex] << 9) | (LEDSEG[LEDBuffer[LEDIndex]]));
if(++LEDIndex >= sizeof(LEDBuffer))LEDIndex = 0;
}
}
void TIM5_IRQHandler (void)
{
if(RESET != TIM_GetITStatus(TIM5,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
// GPIO_Write(GPIOE,(LEDDIG[LEDIndex] << 9) | (LEDSEG[LEDBuffer[LEDIndex]]));
if(++LEDIndex >= sizeof(LEDBuffer))LEDIndex = 0;
}
}
void TIM2_IRQHandler (void)
{
if(RESET != TIM_GetITStatus(TIM2,TIM_IT_Update))
{
GPIO_ToggleBits(GPIOA,GPIO_Pin_9);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
int main(void)
{
if(SysTick_Config(SystemCoreClock / 1000)){while(1);}
TIM1_CH1_PWM_Init(1000-1,16-1);
LEDPin_Init();
Timer_NVIC_Init();
TIM3_Init();
AJ_Init();
Key_EXTI_Init();
Key1_EXTI_Init();
Key_NVIC_Init();
Key1_NVIC_Init();
LEDFANZHUAN_Init();
TIM2_Init();
Timer2_NVIC_Init();
Timer3_NVIC_Init();
TIM5_Init();
while(1)
{
}
}
实验三 STM32的定时器应用实验
最新推荐文章于 2024-05-08 19:44:34 发布