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

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

  hot3.png

设我们要使用TIM3作为计数器使用, 首先配置时钟;

void TIM3_cfg(void)

{
    //首先要使能TIM3;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    //TIM3时基单元配置;

    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        
        /*
        TIM3的主频源自APB1, 即72MHz, 故
            TIM3频率= Perscaler / TIM3主频 = 7200/72000000 = 1/10000 = 10KHz
            即每秒10K次计数;
        Period为10000, 表示时钟计数器累加到(10000-1)后, 再加1时, 产生溢出中断;
        所以, 如此设置后的时钟的中断频率为1Hz, 即1s一次中断;
        
        注意, Period与Prescaler均为16bite寄存器, 即最大值为0xFFFF;
        */
        TIM_DeInit(TIM3);
        TIM_TimeBaseStructure.TIM_Period = 10000-1;        //预装载
        TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;    //预分频
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    //0
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //时钟计数向上溢出
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
        
        //使能预装载值
        TIM_ARRPreloadConfig(TIM3,ENABLE);
                
        //使能更新中断
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);  //清除溢出中断标志
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);  //开启TIM3中断
        
        //开启时钟
        TIM_Cmd(TIM3, ENABLE);
    }
    
    //中断向量配置
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        
        /*
        中断执行次序判定原则:
            两个中断, 先看抢占等级, 高等级的可以在低等级的中断处理过程中被响应,即中断嵌套;
            若抢占等级相同, 则无嵌套调用关系, 比较各自的响应等级, 高等级的先执行;
            若响应等级也相同, 则根据中断在向量表中的先后次序执行;
        优先级Group2, 2bit表示抢占式中断的等级, 2bit表示响应式中断的等级;
        */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;    //此名称为STM32预先定义好的;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //抢占等级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应等级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
        NVIC_Init(&NVIC_InitStructure);
    }
}

//自定义中断函数, 函数名也是标准的;

volatile unsigned short __tms = 0;
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
        
        __tms++;
    }
}

 

转载于:https://my.oschina.net/laozh/blog/868859

你可能感兴趣的文章
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
做程序开发的你如果经常用Redis,这些问题肯定会遇到
查看>>
006android初级篇之jni数据类型映射
查看>>
org.openqa.selenium.StaleElementReferenceException
查看>>
HBase 笔记3
查看>>
Linux嵌入式GDB调试环境搭建
查看>>
java分析jvm常用指令
查看>>
【Linux】Linux 在线安装yum
查看>>
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
阿里百川码力APP监控 来了!
查看>>
使用dotenv管理环境变量
查看>>
温故js系列(11)-BOM
查看>>
Vuex学习
查看>>
bootstrap - navbar
查看>>
切图崽的自我修养-[ES6] 编程风格规范
查看>>
服务器迁移小记
查看>>
FastDFS存储服务器部署
查看>>
Android — 创建和修改 Fragment 的方法及相关注意事项
查看>>
swift基础之_swift调用OC/OC调用swift
查看>>