STM32F103RCT6开发板M3单片机教程06--定时器中断

这篇具有很好参考价值的文章主要介绍了STM32F103RCT6开发板M3单片机教程06--定时器中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言


除非特别说明,本章节描述的模块应用于整个STM32F103xx微控制器系列,因为我们使用是STM32F103RCT6开发板是mini最小系统板。
本教程使用是(光明谷SUN_STM32mini开发板
 

STM32F103RCT6开发板M3单片机教程06--定时器中断,嵌入式开发,单片机,嵌入式硬件

STM32F10X定时器(Timer)基础


首先了解一下是STM32F10X定时器(Timer)

STM32F103RCT6开发板M3单片机教程06--定时器中断,嵌入式开发,单片机,嵌入式硬件


 

注:

小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx, STM32F102xx和STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx, STM32F102xx和STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。

定时器类型


大容量的STM32F103xx增强型系列产品包含最多2个高级控制定时器、 4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
下表比较了高级控制定时器、普通定时器和基本定时器的功能:

STM32F103RCT6开发板M3单片机教程06--定时器中断,嵌入式开发,单片机,嵌入式硬件

高级控制定时器(TIM1和TIM8)


两个高级控制定时器(TIM1TIM8)可以被看成是分配到6个通道的三相PWM发生器,它具有带死区插入的互补PWM输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
● 输入捕获
● 输出比较
● 产生PWM(边缘或中心对齐模式)
● 单脉冲输出
配置为16位标准定时器时,它与TIMx定时器具有相同的功能。配置为16PWM发生器时,它具有全调制能力(0~100%)
在调试模式下,计数器可以被冻结,同时PWM输出被禁止,从而切断由这些输出所控制的开关。
很多功能都与标准的TIM定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与TIM定时器协同操作,提供同步或事件链接功能。

通用定时器(TIMx)


STM32F103xC、 STM32F103xDSTM32F103xE增强型系列产品中,内置了多达4个可同步运行的标准定时器(TIM2、 TIM3、 TIM4TIM5)。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、 PWM和单脉冲模式输出,在最大的封装配置中可提供最多16个输入捕获、输出比较或PWM通道。
它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。任一标准定时器都能用于产生PWM输出。每个定时器都有独立的DMA请求机制。
这些定时器还能够处理增量编码器的信号,也能处理13个霍尔传感器的数字输出。

基本定时器-TIM6和TIM7


2个定时器主要是用于产生DAC触发信号,也可当成通用的16位时基计数器。

独立看门狗


独立的看门狗是基于一个12位的递减计数器和一个8位的预分频器,它由一个内部独立的40kHzRC振荡器提供时钟;因为这个RC振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。

窗口看门狗


窗口看门狗内有一个7位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能;在调试模式下,计数器可以被冻结。

系统时基定时器


这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
● 24位的递减计数器
● 自动重加载功能
● 当计数器为0时能产生一个可屏蔽系统中断
● 可编程时钟源
 

高级控制定时器框图

STM32F103RCT6开发板M3单片机教程06--定时器中断,嵌入式开发,单片机,嵌入式硬件



了解基本概念后,今天用通用定时器(TIM2), 写一个定时中断的程序
 

编写代码

建工程写代码


复制上节工程文件夹打开(这个方法比较方便)
 

  • 新建源文件,编辑代码
    编辑main.c, 在上节基础上增加TIM配置及中断服务函数。
    /**********************************************************************************
    
    * Sun STM32 mini Demo
    
    *   Description  
    
        TIM2 Interrupt Demo
    
       
    
    * Version    Date       Auther      Reversed History
      ----------------------------------------------------------------------------
    
      V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    
      
    
    * (C) Sunshine Silicon Corporation
    
    *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    
    *  E-Mail : fan@sunsili.com
    
    **********************************************************************************/
    
    
    
    #include "stm32f10x.h"
    #include "usart.h"
    #include "SysTick.h"
    #include "led.h"
    #include "key.h"
    #include <stdio.h>
    
    static u8 flag;
    static u8 tim2_tick;
    
    void Timer2_Init_Config(void);
    void RCC_Configuration(void);
    
    
    /*******************************************************************************
    * 函数名  : main
    * 描述    : 主函数,用户程序从main函数开始运行
    
    * 输入    : 无
    * 输出    : 无
    
    * 返回值  : int:返回值为一个16位整形数
    
    * 说明    : 无
    
    *******************************************************************************/
    
    int main(void)
    {
        u8 keyVal;
    
        RCC_Configuration();
        SysTick_Init_Config();
            USART1_Init_Config(115200);//USART1初始化配置
        LED_GPIO_Config();
        Key_GPIO_Config();
        Timer2_Init_Config();        //Timer2初始化配置
    
        printf ("*===================================================*\n");
        printf ("*  *  Name: Sun STM32 mini Demo Code.    *************\n");
        printf ("*  * (C) Sunshine Silicon Corporation    *************\n");
        printf ("*  *  Website: http://www.sunsili.com    *************\n");
        printf ("*  *   E-Mail : fan@sunsili.com          *************\n");
        printf ("*===================================================*\n");
        printf ("* Sun STM32 mini TIM2 Interrupt Demo code .*\n");
    
       
    
            while (1)
            {
            if(tim2_tick)
            {
    
                tim2_tick = 0;
    
                if(flag)
                {
                    printf("LED ON\n");               
    
                }
                else
                {
                    printf("LED OFF\n");
                }
    
            }
            }
    }
    
    
    
    /*******************************************************************************
    
    * 函数名  : Timer2_Init_Config
    * 描述    : Timer2初始化配置
    
    * 输入    : 无
    * 输出    : 无
    
    * 返回    : 无
    
    * 说明    : 无
    
    *******************************************************************************/
    
    void Timer2_Init_Config(void)
    {
    
            TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
            NVIC_InitTypeDef NVIC_InitStructure;       
    
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                //使能Timer2时钟      
    
            TIM_TimeBaseStructure.TIM_Period = 4999;                                        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到5000为500ms)
            TIM_TimeBaseStructure.TIM_Prescaler = 7199;                                        //设置用来作为TIMx时钟频率除数的预分频值(10KHz的计数频率)
            TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //设置时钟分割:TDTS = TIM_CKD_DIV1
            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
            TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                                //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    
            /*中断优先级NVIC设置*/
            NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                                //TIM2中断
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //先占优先级1级
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //从优先级1级
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能IRQ通道
            NVIC_Init(&NVIC_InitStructure);                                                         //初始化NVIC寄存器         
    
            TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE );                                 //使能TIM2指定的中断      
    
            TIM_Cmd(TIM2, ENABLE);                                                                          //使能TIMx外设
    }         
    
    
    
    /*******************************************************************************
    * 函数名  : TIM2_IRQHandler
    * 描述    : 定时器2中断服务函数
    * 输入    : 无
    * 输出    : 无
    
    * 返回    : 无
    
    * 说明    : 无
    
    *******************************************************************************/
    
    void TIM2_IRQHandler(void)   //TIM2中断服务函数
    {
        tim2_tick = 1;
    
            if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
            {
                    TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中断标志
    
                    if(flag)
                    {
                            LED4_ON();
                            flag=0;
    
                    }
                    else
                    {
                            LED4_OFF();
                            flag=1;
    
                    }
            }
    }
    
    
    
    /*******************************************************************************
    * 函数名  : RCC_Configuration
    * 描述    : 设置系统时钟为72MHZ(这个可以根据需要改)
    
    * 输入    : 无
    * 输出    : 无
    
    * 返回值  : 无
    
    * 说明    : STM32F107x和STM32F105x系列MCU与STM32F103x系列MCU时钟配置有所不同
    
    *******************************************************************************/
    
    void RCC_Configuration(void)
    {
      ErrorStatus HSEStartUpStatus;               //外部高速时钟(HSE)的工作状态变量  
    
      RCC_DeInit();                               //将所有与时钟相关的寄存器设置为默认值
      RCC_HSEConfig(RCC_HSE_ON);                  //启动外部高速时钟HSE
      HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟(HSE)稳定
    
      if(SUCCESS == HSEStartUpStatus)             //如果外部高速时钟已经稳定
      {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Flash设置
    
        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);  
    
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟等于系统时钟(1分频)/72MHZ
        RCC_PCLK2Config(RCC_HCLK_Div1);  //设置APB2时钟和HCLK时钟相等/72MHz(最大为72MHz)
        RCC_PCLK1Config(RCC_HCLK_Div2);  //设置APB1时钟是HCLK时钟的2分频/36MHz(最大为36MHz)
    
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz
    
        RCC_PLLCmd(ENABLE); //使能PLL
    
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定
    
    
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //设置系统时钟的时钟源为PLL
    
        while(RCC_GetSYSCLKSource() != 0x08);               //检查系统的时钟源是否是PLL
    
        RCC_ClockSecuritySystemCmd(ENABLE);                 //使能系统安全时钟
    
       
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);
    
      }
    }
    
    
    
    
    /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    
    ********************        END OF FILE main.c        *******************/

    编译调试程序

编译调试


保存直接编译,发现编译出错, 因为未添加tim库。解决方法添加库文件stm32f10x_tim.c
重新编译,通过。

调试


方法不再重复,经过前两节练习,大家应该是会了.
看到效果是, LED 1s闪烁一次,  uart1 定时打印LED状态

总结课后练习
改变TIM定时中断频率

工程源码

查看原文,可下载工程源码文章来源地址https://www.toymoban.com/news/detail-766254.html

到了这里,关于STM32F103RCT6开发板M3单片机教程06--定时器中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32f103rct6引脚功能表格

    脚号 引脚名称 主功能 默认复用 重定义 备注 1             VBAT VBAT -- -- 说明1 2             PC13-TAMPER-RTC PC13 TAMPER-RTC -- 说明3 3             PC14-OSC32_IN PC14 OSC32_IN -- 说明3 4             PC15-OSC32_OUT PC15 OSC32_OUT -- 说明3 5             OSC_IN OSC_IN -- CAN_RX 晶振

    2024年02月06日
    浏览(48)
  • STM32F103RCT6——定时器简单用法

    STM32F10xx参考手册英文和中文版 百度网盘:https://pan.baidu.com/s/1Z2nB0WVJIxvm3VOI9MQiiw 提取码:lxlx STM32F103RCT6数据手册 链接:https://pan.baidu.com/s/1tRchgf-5C1MN4W58vQ9zPg 提取码:lxlx STM32F103RCT6包括,高级控制定时器TIM1和TIM8,通用定时器TIM2-5,基本定时器TIM6和TIM7. 高级控制定时器TIM1,TI

    2024年02月08日
    浏览(61)
  • 从零开始制作STM32F103RCT6小车(一)

            仅以此系列给实验室的学弟学妹作为小车制作教程来使用,后续的内容我会在这个暑假陆续更新出来,本篇的内容是新建一个适用于STM32F103RCT6的工程         接下来的操作几乎是基于STM32F1xx系列的固件库,这里我给大家列出链接 STM32F1xx系列固件库               

    2023年04月08日
    浏览(63)
  • stm32f103rct6使用内部晶振作为时钟源

    stm32f103rct6(库函数版例程)使用内部晶振8M,倍频64M 参考 https://blog.csdn.net/oHuanCheng/article/details/105112884 http://www.openedv.com/forum.php?mod=viewthreadtid=286233 https://blog.csdn.net/ll148305879/article/details/106138302 修改system_stm32f10x.c文件中的void SystemInit(void)函数 内部时钟用到了FLASH,需要添加s

    2024年02月07日
    浏览(186)
  • stm32F103RCT6使用FFT运算分析波形详解(细致教学)

    最近学校电赛队伍招新,出的招新题就是低频示波器的。之前一直没有弄懂FFT,借着这次机会实现了一下,做了一个小示波器 FFT原理简述 FFT,就是快速傅里叶变换,这个操作能够将时域信号转化成频域信号,然后对信号进行分析 这样说可能有点抽象。讲细点就是指能够直观

    2024年02月14日
    浏览(52)
  • STM32F103RCT6驱动SG90舵机-完成正反转角度控制

    SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。 SG90舵机通常用于

    2024年02月03日
    浏览(66)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通讯

    使用 FreeRTOS 提供的队列(Queue)机制来实现数据的接收和发送 TX - PA9 RX - PA10 波特率:9600 数据位:8bit 校验位:无 停止位:1bit 数据格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 帧头 06 - 数据字节数,不包括帧头,不包括校验位 00 06 – 模块 31 02 24

    2024年02月16日
    浏览(48)
  • STM32F103RCT6电路设计及绘制方法和学习体会

    目录 1电路图各部分原理分析 1.1通信-下载板块接口电路 1.1.1 通信模块 1.1.2 显示灯 1.2电源转化电路 1.2.1 电源转化 1.3晶振电路 1.4 OLED显示屏接口电路 1.5 独立按键电路 1.6 JTAG/SWD调试接口电路 1.7 STM32微控制器电路 1.7.1 副芯片原理 1.7.2 主芯片原理 1.8 外扩引脚 1.9 显示灯 2图纸的

    2024年02月14日
    浏览(62)
  • 设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

    https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a86e13f421741aefd08cedb169708309c79566ab1ftoken=1923877603lang=zh_CN#rd https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a8

    2023年04月17日
    浏览(58)
  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包