博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stm32单片机时钟中断的配置
阅读量:5264 次
发布时间:2019-06-14

本文共 3012 字,大约阅读时间需要 10 分钟。

原作者:http://www.eeworld.com.cn/mcu/article_2016082828940.html

 

配置流程:

 

1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。

2:IO口初始化,包括引脚,速率,输入输出模式等。
3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。
4:TIM3初始化:包括自动重装值,分频值,计数模式,使能TIM中断,使能TIM3外设
5:中断处理函数:注意清除TIMx的中断待处理位
注意:
1:RCC初始化要使能或者失能 APB1 外设时钟。
2:中断处理函数:注意清除TIMx的中断待处理位 TIMx_SR寄存器
3:关于时钟:初始化RCC时使用SystemInit()函数时默认的是AHB不分频,即HCLK等于SYSHCLK,APB2不分频,APB1为HCLK 2分频而定时器3时钟使能在RCC_APB1ENR寄存器中定义,因此TIM3时钟为36M

 

 

 

 

原程序为:

#include"stm32f10x.h"
#include"stm32f10x_tim.h"
#define LED0_OFF  GPIO_SetBits(GPIOA,GPIO_Pin_8)// LED0关
#define LED0_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0开
u16 i=0;
//初始化IO端口
void IO_Configuart(void)   
{
    GPIO_InitTypeDef GPIO_InitStructure;                                       //定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型
    //LED0
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;                               //引脚选择
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           //50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;           //推挽输出
    GPIO_Init(GPIOA,&GPIO_InitStructure);                                 //初始化
}
//复位和系统时钟控制
void RCC_Configuare(void)
{
    SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率
    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统
    //使能GPIOA,GPIOD端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能或者失能 APB1 外设时钟 
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
    /*    也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);   更加简洁*/
}
//NVIC设置 系统中断管理
void NVIC_Configuare(void)
{
    NVIC_InitTypeDef   NVIC_InitStructure;
    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位  从优先级4位
    //使能TIM3中断
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;                       //TIM3中断 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F;    //先占优先级0位,从优先级4位
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F;                //
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
//初始化TIM3 1ms 定时
void TIM3_Configuare(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    //TOUT=ARR*(PSC+1)/Tclk   ARR=10 PSC=3599 Tclk=36M  TOUT=0.001s=1ms
    TIM_TimeBaseStructure.TIM_Period = 10;                  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到10为1ms
    TIM_TimeBaseStructure.TIM_Prescaler =(7200-1);    //设置用来作为TIMx时钟频率除数的预分频值  这里是7200分频    72M=72000000 ; 72000000 /7200=10000;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;         //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    
    TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //使能或者失能指定的 TIM 中断 
    TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
}
int main (void)
{
    RCC_Configuare();
    IO_Configuart();
    NVIC_Configuare();
    TIM3_Configuare();
    LED0_OFF;
    while(1)
    {
    
    }
            
}
//TIM3中断处理函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //检查指定的 TIM 中断发生与否 
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
        i++;
        if(i==1000)
        {
            LED0_ON;
        }
        if(i==2000)
        {
            LED0_OFF;
            i=0;
        }    
    }
}

转载于:https://www.cnblogs.com/chulin/p/8479935.html

你可能感兴趣的文章
结对编程总结 1175 1176
查看>>
php学习笔记(一)————php类的概念
查看>>
Centos 安装KScope1.6.2
查看>>
内核链表使用--删除链表节点
查看>>
eclipse启动无响应,停留在Loading workbench状态
查看>>
How exactly does Google AdWords work?
查看>>
多线程系列(4)使用多线程的安全问题
查看>>
C# 你可能没这样用过(逗逼方式) return
查看>>
弄明白Android 接口回调机制
查看>>
sharepoint中在blog中,发布post可以直接打开 word 发布!(Launch blog program to post用代码实现)...
查看>>
20175320 2018-2019-2 《Java程序设计》第10周学习总结
查看>>
javascript设计模式之单例模式
查看>>
前端性能优化-雅虎军规
查看>>
php--->php 缓冲区 buffer 原理
查看>>
基本数据类型
查看>>
Hybrid APP基础篇(五)->JSBridge实现示例
查看>>
python打印log重复问题
查看>>
开发软件时的复用
查看>>
css清除浮动,最常用的方法
查看>>
UVA 10817 - Headmaster's Headache(三进制状压dp)
查看>>