嵌入式作业 齐振超

首先,在野火给的例程里复制一个GPIO例程的副本,点击打开。
1、在User文件夹下新建两个文件,分别是bsp_BasicTim.h,
bsp_BasicTim.c.
2、然后在MDK的目录下添加刚刚新建好的两个文件。
3、由于我们在.c文件中需要用到.h文件,因此需要在魔法棒中的C/C++选项中选择Include Paths,添加.h的搜索路径,这是为了告诉计算机去哪里找文件。

基本定时器的好处在于由于没有外部的GPIO,就可以直接初始化结构体。

在.c文件内添加函数

static void BASIC_TIM_Config(void)
 {
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    //定义一个初始化结构体
    BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
    //开启定时器时钟,即CK_INT=72M
    TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period; 
    //自动重装载寄存器的值
    TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
    //时钟预分频数
   // TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    //时钟分频因子,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    // 计数器计数模式,基本定时器只能向上计数,没有计数模式设置
   // TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    //重复计数器的值,基本定时器没有,不用管
    TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
    //初始化定时器
    TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
    //清除计数器中断标志位
    TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
    //开启计数器中断
    TIM_Cmd(BASIC_TIM, ENABLE); 
    //使能计数器
 }



初始化完结构体之后,我们还需要对中断优先级进行配置。

代码如下:

static void BASIC_TIM_NVIC_Config(void)
 {
   NVIC_InitTypeDef NVIC_InitStructure;
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   //设置中断组为0
   NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
   //设置中断来源
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
   //设置主优先级为0
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
   //设置抢占优先级为3
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
 }



在这里要注意一点,中断函数要写在stm32f10x_it.c中
中断函数如下:

void  BASIC_TIM_IRQHandler (void)
 {
   if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) 
   //判断Update中断是否真正来了,进一次中断的时间是1MS
  { 
   time++;
   TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
   //清除中断标志位
 }



这里要注意一点的是:由于TIME是全局变量,因此需要在main.c中定义uint16_t time=0;
但是在it,c中使用了 time ,因此需要在it.c里面声明,extern uint16_t time 用以表示外部定义。

好的,接下来我们还需要对定时器进行初始化
代码如下:

void BASIC_TIM_Init(void)
 {
  BASIC_TIM_NVIC_Config();
  BASIC_TIM_Config();
 }



由于我们会在主函数中使用定时器初始化这个函数,因此我们需要在bsp_BasicTim.h中对其进行声明。

万事俱备,只欠主函数了

int main(void)
 {
   LED_GPIO_Config();//初始化IO口
   BASIC_TIM_Init();//定时器初始化
   while(1)//时间到了之后会进入中断
   {
     if(time==500) 当time==500ms时
     {
       time=0;//清零,防止下一次循环开始
       LED1_TOGGLE;  //对LED1进行一次翻转
     }
   }
 }



这样就大功告成了,大家在使用JTAG连接上开发板之后,点击MDK左上方的Dwonload,就可以看到上面的小灯半秒闪烁了。


on the way to be a Electrical Engineer & Designer......