历史上的今天
返回首页

历史上的今天

今天是:2025年08月06日(星期三)

正在发生

2019年08月06日 | STM32F429的定时器的使用方法

2019-08-06 来源:eefocus

        电子时代,硬件在突飞猛进的发展,频率不断上升,目前的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 的定时器基本时钟去计算。

推荐阅读

史海拾趣

COILCRAFT公司的发展小趣事

为了更好地服务全球客户,COILCRAFT公司在北美、亚洲和欧洲等地建立了制造、分销和工程设施。这一全球布局使得公司能够快速地响应客户需求,提供高效的服务和运输。同时,COILCRAFT还拥有丰富的网络工具库和免费评估样品政策,这些措施简化了部件选择过程,提高了客户的满意度。

ETL semiconductor公司的发展小趣事

三星(Samsung)原本是一家以家电和电子产品为主的综合性企业。然而,在半导体行业快速发展的背景下,三星决定加大在半导体领域的投入。经过数十年的努力,三星不仅在存储芯片领域取得了显著成就,还在逻辑芯片和代工业务方面取得了重要进展。如今,三星已成为全球领先的半导体企业之一。

Anatech Electronics Inc公司的发展小趣事

三星(Samsung)原本是一家以家电和电子产品为主的综合性企业。然而,在半导体行业快速发展的背景下,三星决定加大在半导体领域的投入。经过数十年的努力,三星不仅在存储芯片领域取得了显著成就,还在逻辑芯片和代工业务方面取得了重要进展。如今,三星已成为全球领先的半导体企业之一。

ELPIDA公司的发展小趣事

在成立初期,ELPIDA凭借其强大的技术实力和规模效应,迅速在全球DRAM市场中占据了重要地位。公司不断推出创新产品,扩大市场份额,成为行业内的重要参与者。然而,随着市场竞争的加剧和技术的快速变化,ELPIDA也面临着巨大的挑战。

BENCENT公司的发展小趣事

BENCENT公司在成立之初,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。创始人带领团队夜以继日地研发,通过不断尝试和改进,终于成功开发出了一款具有竞争力的电子产品。这款产品凭借其高性能和创新性,在市场上获得了初步认可,为公司的后续发展奠定了基础。

Design Gateway公司的发展小趣事

随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。

(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)

由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。

问答坊 | AI 解惑

PID算法

本帖最后由 paulhyde 于 2014-9-15 03:27 编辑 PID算法,愿大伙在今年全国赛取得好成绩  …

查看全部问答>

有关PROTEL原理图的一些问题

在画原理图的时候,怎么查找具有相同文本的标号(暂且叫标号吧)。 比如说:在一个原理图中,MCU芯片上有一个TXD,又另一部分也有TXD(表示这两端是相连的),我怎么找出来这两个TXD? 用快捷方式,或着菜单栏?…

查看全部问答>

09年中国汽车电子发展

几十年来,许多模拟IC制造商一直在为汽车制造厂家提供电源管理和功率转换IC。它们的产品在诸多汽车电子系统中得到了广泛的应用,包括传动系统、车身和便利设施、安全、车内网络、信息娱乐系统、用于车前灯和化妆灯的LED照明、引擎控制单元、废气消 ...…

查看全部问答>

U盘过滤驱动win2000下的安装问题

最近在做一个U盘,移动硬盘等移动存储设备的过滤驱动。功能大致如下:1)当插入经过处理的加密U盘时,会提示输入密码,在密码验证正确之前不可以用;2)当插入的是一个未经处理过的普通U盘时会禁止使用,双击打开时会提示未格式化无法打开,该U盘在 ...…

查看全部问答>

如何在wince系统中实现sd卡的热插拔

在wince系统启动之前sd卡可以认得到,但是拔掉之后,系统好像还是认为sd卡仍然存在,但是却读不到数据的。再把sd卡插进去,再也无法读写sd卡了,请教各位大侠,感激不尽。 使用的wince 4.2版本的平台,cpu是三星2440a芯片,bsp包是smdk2440…

查看全部问答>

找一起学习的同学

我的QQ是1286997688.我是电子信息工程专业的本科生。同时也十分热爱英语。希望能有也在学习电子的同学加我,一起学习一起进步。…

查看全部问答>

寻LED显示屏供应商(不知贴在这边合适不合适)

有朋友最近想做LED广告屏,让帮忙找找有没有合适的供应商。 有意向的可以留下联系方式和公司产品介绍相关链接,谢谢~…

查看全部问答>

电话电压

最近在做一个和电话有关的东东 我测量电话电压是50V 可是在网上查的却是待机时12V或者20V 谁知道这是为什么吗?…

查看全部问答>

【为C2000做贡献】重量级资料:DSP教程-手把手教你

此资料来源于网络 是对于初学者绝对好的教程,如果想快速学习DSP,大家可以去网上搜《手把手学DSP》 资料下载: 详细内容如下: [ 本帖最后由 fxw451 于 2011-4-7 20:47 编辑 ]…

查看全部问答>

LSD-S2E21-01 嵌入式串口转以太网控制器入手简评

在利尔达淘宝店拿到了一个LSD-S2E21-01 。上开包展示图。很严谨的盒子:封条,做的很TI  :产品表,少许有点山寨感:…

查看全部问答>