STM32F429的定时器的使用方法

发布者:光明2599最新更新时间:2019-08-06 来源: eefocus关键字:STM32F429  定时器  使用方法 手机看文章 扫描二维码
随时随地手机看文章

        电子时代,硬件在突飞猛进的发展,频率不断上升,目前的STM32系列,Cortex M系列,Cortex-M4的频率已经为:180MHz了,基本上与之前的ARM7/9频率差不多了,还有Cortex-M7,频率更高,出现了BGA封装与SDRAM DDR等。看来处理器越来越大众化了,物联网上的电子设备联网,也越来越普及了,硬件成本不断降低是大势所趋,因此,作为一个电子设计人员,还是要不断的学习掌握更多的技术知识与基础,从而不会被社会很快淘汰。

      最近买了一个现成的STM32F429 Discovery 的开发板,想尝试一下较大点的嵌入式操作系统如RTEMS的移植与应用。因为有了STM32F103/107的基础,熟悉了硬件与固件库,STM32F429其实很容易入手。下面就先定时器中断点个LED试下吧,主要是要组织好工程目录。


      我是根据之前一直使用STM32F103的工程目录改了一下,使用STM32F4XX的最新固件库V1.6.1,至于为何不去直接操作寄存器,我想,虽然自己是硬件出身,搞寄存器更深入的了解处理器,但是,毕竟寄存器过多,有了库,可以封装一下,这样更可以快速的上手。如果需要查看寄存器,也是可以查的。用固件库可以少一些错误,毕竟我们是做应用的,首先要学会使用CPU来实现我们要的功能。


       工程目录如下:这里使用最新的Keil MDK V5.17版本的,STM32F4XX的器件库等还需要进一步下载。这里使用的是自带的ST-Link下载程序,当然使用Jlink也是可以的。

        STM32F429的系统定时器,原来是系统时钟180MHz的8分频,这个可以看一下STM32F4XX的参考手册,里面时钟RCC部分的框架介绍。我这里为了定时为1S,因此计算了一下。


以下为Tim2.c的主程序。Tim2.h 只是函数声明。




/********************     (C) COPYRIGHT 2016     **************************

 * 文件名  :Tim2.c

 * 描述    :定时器timer2 测试例程       

 * 实验平台:STM32F429ZIT6

 * 库版本  :V1.6.1

 *

 * 编写日期:2016-05-02

 * 修改日期:

 * 作者    :

****************************************************************************/

#include "Tim2.h"

 

/*

 * 函数名:TIM2_NVIC_Configuration

 * 描述  :TIM2中断优先级配置

 * 输入  :无

 * 输出  :无

 */

void TIM2_NVIC_Configuration(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); 

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;   

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

 

 

/*TIM_Period--1000   TIM_Prescaler--(22500-1) -->中断周期为

  ((1/180000000)*8)*22500*1000=1S    1秒定时器 */

void TIM2_Configuration(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

    TIM_DeInit(TIM2);

    TIM_TimeBaseStructure.TIM_Period=1000; /* 自动重装载寄存器周期的值(计数值) */

    /* 累计 TIM_Period个频率后产生一个更新或者中断 */

    TIM_TimeBaseStructure.TIM_Prescaler= (22500 - 1); /* 时钟预分频数 (180M/8)/22500 */

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_ClearFlag(TIM2, TIM_FLAG_Update); /* 清除溢出中断标志 */

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

    TIM_Cmd(TIM2, ENABLE); /* 开启时钟 */    

    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /* 先关闭等待使用 */    

}

 

/*

 * 函数名:TIM2_Config

 * 描述  :TIM2配置

 * 输入  :无

 * 输出  :无

 */

void TIM2_Config(void)

{

  TIM2_Configuration();

TIM2_NVIC_Configuration();

}

 

 

/*******************      (C) COPYRIGHT 2016        *END OF FILE************/





以下为:led.c的文件。



/********************       (C) COPYRIGHT 2014  ***************************

 * 文件名  :led.c

 * 描述    :led 应用函数库         

 * 实验平台:

 * 硬件连接:-----------------------

 *          |   PG14 - LED1(RUN)     |   

 *           ----------------------- 

 * 库版本  :ST3.5.0

 * 编写日期:2014-11-04

 * 修改日期:

 * 作者    :

****************************************************************************/

#include "led.h"

 

/*

 * 函数名:LED_GPIO_Config

 * 描述  :配置LED用到的I/O口

 * 输入  :无

 * 输出  :无

 */

void LED_GPIO_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDef GPIO_InitStructure;

 

/*开启 LED1 的GPIOx的外设时钟*/

RCC_AHB1PeriphClockCmd( RCC_LED1, ENABLE); 

/*选择要控制的LED1 GPIOx引脚*/    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_LED1;

/*设置引脚模式为通用推挽输出*/

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

/*设置引脚速率为50MHz */   

  GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed; 

/* 设置为推挽输出模式 */

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

/* 设置为上拉 */

GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;

/*调用库函数,初始化LED1 的GPIOx*/

  GPIO_Init(GPIO_LED1_PORT, &GPIO_InitStructure);   

 

/*开启 LED2 的GPIOx的外设时钟*/

RCC_AHB1PeriphClockCmd( RCC_LED2, ENABLE); 

/*选择要控制的LED2 GPIOx引脚*/    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_LED2;

/*设置引脚模式为通用推挽输出*/

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

/*设置引脚速率为50MHz */   

  GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed; 

/* 设置为推挽输出模式 */

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

/* 设置为上拉 */

GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;

/*调用库函数,初始化LED1 的GPIOx*/

  GPIO_Init(GPIO_LED2_PORT, &GPIO_InitStructure);

/* 关闭LED1 */

//GPIO_ResetBits(GPIO_LED1_PORT, GPIO_Pin_LED1);

//GPIO_ResetBits(GPIO_LED2_PORT, GPIO_Pin_LED2);

}

 

 

 

 

/******************* (C) COPYRIGHT  2014 *****END OF FILE************/





以下为LED的引脚定义:led.h




/********************       (C) COPYRIGHT 2014  ***************************

 * 文件名  :led.h

 * 描述    :led 应用函数库         

 * 实验平台:

 * 硬件连接:-----------------------

 *          |   PG14 - LED1(RUN)     |   

 *           ----------------------- 

 * 库版本  :V1.6.1

 * 编写日期:2016-04-30

 * 修改日期:

 * 作者    :

****************************************************************************/

#ifndef __LED_H

#define __LED_H

 

#include "stm32f4xx.h"

 

/* the macro definition to trigger the led on or off 

 * 1 - off

 - 0 - on

 */

#define ON  1

#define OFF 0

 

#define RCC_LED1 RCC_AHB1Periph_GPIOG

#define GPIO_LED1_PORT GPIOG

#define GPIO_Pin_LED1 GPIO_Pin_13

 

#define RCC_LED2 RCC_AHB1Periph_GPIOG

#define GPIO_LED2_PORT GPIOG

#define GPIO_Pin_LED2 GPIO_Pin_14

 

//带参宏,可以像内联函数一样使用

#define LED1(a) if (a)

GPIO_SetBits(GPIO_LED1_PORT,GPIO_Pin_LED1);

else

GPIO_ResetBits(GPIO_LED1_PORT,GPIO_Pin_LED1)

 

#define LED2(a) if (a)

GPIO_SetBits(GPIO_LED2_PORT,GPIO_Pin_LED2);

else

GPIO_ResetBits(GPIO_LED2_PORT,GPIO_Pin_LED2)

 

void LED_GPIO_Config(void);

 

#endif /* __LED_H */




主程序:硬件的初始化。




/********************        (C) COPYRIGHT 2016        **************************

 * 文件名  :main.c

 * 描述    :STM32F429 LED测试    

 * 实验平台: STM32F429ZIT6

 * 库版本  :V1.6.1

 * 编写日期:2016-05-02

 * 修改日期:

 * 作者    :

**********************************************************************************/

 

#include "stm32f4xx.h"

//#include "usart1.h"

#include "led.h"

#include "Tim2.h"

 

void Delay(__IO uint32_t nTime)

 

  while(--nTime != 0);

}

 

 

/* 

 * 函数名:main

 * 描述  : "主机"的主函数

 * 输入  :无

 * 输出  : 无

 */

int main(void)

{  

LED_GPIO_Config();

TIM2_Config();

LED1(ON);

  LED2(ON);

while(1)

#if 0

Delay(0x2FFFFF);

LED1(OFF);

LED2(OFF);

Delay(0x2FFFFF);

LED1(ON);

LED2(ON);

#endif

}

}

/******************* (C) COPYRIGHT 2014 *****END OF FILE************/



以下为真正的实现函数:定时器2中断函数 stm32f4xx_it.c




/**

  * @brief  This function handles TIM2 Handler.

  * @param  None

  * @retval None

  */

void TIM2_IRQHandler(void)

{

if (TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)

{   

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);

GPIO_WriteBit(GPIO_LED1_PORT,GPIO_Pin_LED1,

(BitAction)(1-GPIO_ReadOutputDataBit(GPIO_LED1_PORT,GPIO_Pin_LED1)));

}

}



      编译并烧写,基本上可以看到LED 1S的亮,1S的灭,然后不断的循环下去,一般用于程序的运行指示灯。


重要的总结:


(1)GPIO的时钟,STM32F103的是APB时钟,STM32F429为:RCC_AHB1PeriphClockCmd,我开始弄错了,程序不运行!!


(2)STM32F429虽然180MHz的主频,但是系统定时器的时钟为其的8分频,STM32F103是直接使用的72MHz的主频,因此在计算分频与周期数时,要使用180MHz/8 的定时器基本时钟去计算。

关键字:STM32F429  定时器  使用方法 引用地址:STM32F429的定时器的使用方法

上一篇:STM32F4xx定时器
下一篇:stm32f407之基本定时器TIM6&TIM7(操作寄存器)

推荐阅读最新更新时间:2024-11-09 11:59

51单片机入门——定时器与外部中断
1. 定时器 1.1. 定时器的初步认识 在认识定时器之前我们先了解两个基本概念。 时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算方法就是 1 / 时钟源频率,一般情况下单片机的晶振都是 11.0592 MHz 的,对于这个单片机系统来说时钟周期就是 1 / 11059200 秒。 机器周期:我们的单片机完成一个操作的最短的时间。机器周期主要针对于汇编语言,在汇编语言下程序的每一条语句所使用的时间都是机器语言的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句所占用的时间是不确定的,受诸多因数的影响。51 单片机系列,在其标准架构下一个机器语言是 12 个时钟周期,也就是 12 / 11059200
[单片机]
51单片机入门——<font color='red'>定时器</font>与外部中断
STM32定时器(一)PWM输出
一、 STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器 1)核内定时器:Systick 2)外设定时器:特定应用定时器+常规定时器 3)特定应用定时器:LPTIM,RTC,WTD,HRTIM 4)常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2TIM5,TIM9TIM14)、高级定时器(TIM1&TIM8) 【常规定时器: 基本定时器:计划没有任何对外输入/输出,常用作时基,实现基本的计数和定时功能。 通用定时器:除了基本的定时器的时基功能外,还可以对外作输入捕获、输出比较以及连接其他传感器接口(除了编码器和霍尔传感器) 高级定时器:此类的定时器功能强大,除了具备通用的定时器的功
[单片机]
STM32<font color='red'>定时器</font>(一)PWM输出
MSP430学习笔记(五)--定时器实战
第一个Demo来自官方例程中的 msp430g2xx3_ta_01 ,该例中Timer_A工作在最典型的定时状态,按照 50000 个SMCLK周期的时间间隔产生中断。代码中SMCLK的频率为DOC默认工作频率,约为1MHz,每次定时中断都会翻转P1.0管脚的输出电平,所以P1.0管脚会出现10Hz左右的方波信号。可接LED1的跳线帽直接观察现象。 #include msp430.h int main(void) { //关闭看门狗 WDTCTL = WDTPW + WDTHOLD; // Stop WDT //设置 P1.0 管脚为输出 P1DIR |= 0x01; //
[单片机]
MSP430学习笔记(五)--<font color='red'>定时器</font>实战
指针式万用表工作原理和使用方法
对于电子爱好者来说,万用表是再熟悉不过的通用检测工具了,是必不可少也是最基础的检测测量工具。以前万用表也称之为“三用表”,这是因为当初的万用表只有测量电阻、电压、电流这三项功能。现在几乎听不到这样叫的了,因为现在的万用表功能越来越多,如测量电感量、电容量、频率、晶体管参数等,所以称其为“万用表”。 万用表分为指针式万用表和数字式万用表,本文向初学者介绍一下指针式万用表的工作原理和基本的使用方法,以测量电阻、电压和电流为例。 万用表的工作原理 万用表的基本工作原理是利用一只灵敏的磁电式直流电流表(微安表)做表头。当微小电流通过表头,就会有电流指示。但表头不能通过大电流,所以,必须在表头上并联与串联一些电阻进行分流或降压,从而
[测试测量]
tds1001b/tds2001c/tds2012b型数字双踪示波器的使用方法图解
一、面板结构 示波器面板如图一,包括显示屏、垂直控制、水平控制、触发控制、菜单及控制按钮。 图一 tds1001b示波器面板图 1、显示屏 图二 显示屏及屏幕按钮 a 1—〉:ch1的扫描基线基准。 b 2—〉:ch2的扫描基线基准。 c 信息显示区,有些信息仅显示3秒。信息显示区提供以下几种信息: ⑴ 访问另一菜单的方法,例如:按下trig menu(触发菜单)按钮时: for trigger holdoff, go to horizontal menu(请用水平菜单调整触发释抑)。 ⑵ 建议可能要进行的下一步操作,例如按下measure(测量)按钮时: 按显示屏按钮选择测量内容。 ⑶ 有关示波器执行操作的信息,例如按下
[测试测量]
tds1001b/tds2001c/tds2012b型数字双踪示波器的<font color='red'>使用方法</font>图解
电流表电压表的使用方法
电流表和电压表是初中电学实验中两种最基本最重要的测仪表,两表也是中考中常考的仪表,有一些学生由于没有掌握它们的正确使用方法因此而丢分,所以教会学生掌握电流表和电压表的使用方法是十分必要的。下面就谈谈电流表和电压表的教学中必须强调的几会: 1.会看表 例如图1 所示,表盘上标有字母“a”字样,该表就是测量电流强度的电流表。例如图2 pdm-801a, pdm-801a-c, pdm-801a-f48 所示,表盘上标有字母“v”字样,该表是测量电压的电压表。 2.会接表 电流表必须串联在待测电路中,电流表的“+”极必须跟的“+”极端靠近,电流表的“?”极必须跟电源的“?”极端靠近,电压表必须并联在待测电路的两端,注意正负极
[测试测量]
电流表电压表的<font color='red'>使用方法</font>
MSP430利用定时器捕获功能,计算脉冲间隔和频率
MSP430利用定时器捕获功能,计算脉冲间隔和频率: void TimrA1Init_captrue(void) { TA0CTL = TASSEL0+TACLR+TAIE+MC1; //时钟信号选择MCLK,计数模式为连续增计模式 TA0CCTL1 = CM1+SCS+CAP+CCIE; //输入下降沿捕获,CCI1A为捕获信号源 P1SEL |=BIT2; //设置P1.2端口为功能模块CCI1A输入捕获 } unsigned int TimeGap=0; #pragma vector=TIMER0_A1_VECTOR //定时器A中断处理 __interrupt void timer_a(void
[单片机]
[单片机框架] [app_led] [WS2812x] 利用软定时器实现WS2812x闪烁和呼吸等灯光模式
数据时序图 0,1码的高低电平时间: 利用单线协议来点亮WS2812X 模拟IO 兼容带OS /******************************************************************************** * @file led_ws2812x.c * @author jianqiang.xue * @version V1.0.0 * @date 2021-11-23 * @brief LED灯光,OneWire控制 * @example #include business_function.h #include app_led
[单片机]
[单片机框架] [app_led] [WS2812x] 利用软<font color='red'>定时器</font>实现WS2812x闪烁和呼吸等灯光模式
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved