了解stm32f334R8的LED灯代码?

时间:2017-05-30 20:32:03

标签: c stm32 led

#include "stm32f30x_conf.h"

uint16_t read_pos(void);
void PC_Conf(void);
uint8_t get_bit(uint8_t, uint8_t);

// PROCESSORTACT = 64 MHz
// AHB  Prescaler = 1
// APB1 Prescaler = 2
// APB2 Prescaler = 1

long pin = 1;
long dir = 1;
char recvd;

int main(void){
    /*

    */
    //Definitions
    GPIO_InitTypeDef GPIO_Initstructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_NVICInitStructure;

    //ENABLE CLOCK
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //GPIO
    GPIO_Initstructure.GPIO_Mode=GPIO_Mode_OUT;
    GPIO_Initstructure.GPIO_OType=GPIO_OType_PP;
    GPIO_Initstructure.GPIO_Pin=GPIO_Pin_All;
    GPIO_Initstructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_Initstructure);

    //TIMER
    TIM_TimeBaseInitStructure.TIM_Prescaler = (64000-1); //TIM2 cycle to 1kHz
    TIM_TimeBaseInitStructure.TIM_Period = 500; //Every 500ms
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

    //NVIC
    NVIC_NVICInitStructure.NVIC_IRQChannel=TIM2_IRQn;
    NVIC_NVICInitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_NVICInitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_NVICInitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_NVICInitStructure);

    //Enable everything
    TIM_Cmd(TIM2, ENABLE);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

  /* Infinite loop */
  while (1)
  {
  }
}

void TIM2_IRQHandler(void)
{   
    GPIOB->ODR &= 0;
    GPIOB->ODR ^=1<<pin;

    //Pin to new value
    if(dir == 1)
    {
        if(pin == 5)
            pin=11;
        else if(pin == 15)
        {   pin-=1;
            dir = 0;
        }
        else
            pin+=1;
    }
    else
    {
        if(pin == 11)
            pin = 5;
        else if(pin == 1)
        {
            pin+=1;
            dir = 1;
        }
        else
            pin-=1;
    }

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

我无法理解这段代码。第一部分没关系,但我不明白最后一个功能。

有人可以解释一下TIM2_IRQHandler(void)中此代码的最后部分的内容吗?

我是新手,欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

在许多中断中,您需要清除中断挂起标志。如果在退出处理程序时没有,则会再次调用中断。每个中断都在您的micro的参考手册中描述。例如,通过写入或读取DR寄存器来清除SPI中断挂起标志。另一个要求程序员清除该位。

经验法则:输入中断后立即清除标志。

如果中断可以被多个事件触发,程序员应该检查哪一个是异常的来源。