历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2019年08月12日 | STM32-(23):定时器TIM(实验)

2019-08-12 来源:eefocus

定时器实验:

透过配置定时器相关寄存器的配置,实现定时器2每1S中断一次,通过数码管将时间实时的显示出来。

用到的函数功能如下:
(1) 利用TIM_Delnit()函数将Timer设置为默认缺省值;
(2) TIM_InternalClockConfig()选择TIMx来设置内部时钟源;
(3) TIM_Perscaler来设置预分频系数;
(4) TlM_CIockDivision来设置时钟分割;
(5) TIM_CounterMode来设置计数器模式;
(6) TIM_Period来设置自动装入的值;
(7) TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器;
(8) TIM_ITConfig()来开启 TIMx 的中断.

注:时钟源一般分三种:内部时钟、外部脉冲、其他定时器形成级联。

库函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
跟输入相关(输入捕获)
在这里插入图片描述
程序待添加

代码(主要几个函数)

main.c

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

* 文件 :main.c

* 描述 :定时器2的中断配置

* 说明 :通过配置定时器相关寄存器的配置,实现定时器2每1S中断一次通过数码管将时间实时的显示出来

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

#include"stm32f10x_lib.h"

#include


/*--------------函数的声明---------------*/

void Delay_Ms(u16 time); //延时函数

void RCC_Configuration(void);//RCC时钟配置函数

void NVIC_Configuration(void); //NVIC中断向量表



/*------------外部函数的声明--------------*/

extern void SMG_Init(void); //数码管的初始化

//extern void SMG_Display(u32 data,u8 dot);  //数码管的显示函数

extern NumbTube_Display(u32 data,u8 radix_point); //数码管的现实函数 

extern void TIM_Configuration(void);   //TIM2的配置函数

extern u8 CountValue;  //全局变量   定时器每1S发生一次中断,此变量就加1,


/* Private functions ---------------------------------------------------------*/ 

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

* Function Name  : main

* Description    : Main program.

* Input          : None

* Output         : None

* Return         : None

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

int main(void)

{

#ifdef DEBUG

debug();

#endif

/*----------初始化-------------*/

RCC_Configuration(); //时钟

NVIC_Configuration(); //中断

TIM_Configuration(); //定时器

SMG_Init(); //数码管

while(1)

{

// SMG_Display(CountValue,1);

NumbTube_Display(CountValue,3); //显示时间,3代表小数点的位置

}

}


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

* Function Name  : Delay_Ms

* Description    : delay 1 ms.

* Input          : time (ms)

* Output         : None

* Return         : None

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

void Delay_Ms(u16 time)  //延时函数

u16 i,j;

for(i=0;i  for(j=10000;j>0;j--);

}


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

* Function Name  : RCC_Configuration

* Description    : Configures the different system clocks.

* Input          : None

* Output         : None

* Return         : None

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

void RCC_Configuration(void)

{

/*------使用外部RC晶振----------*/

RCC_DeInit(); //时钟默认初始化

RCC_HSEConfig(RCC_HSE_ON);//使能外部的高速时钟

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待外部的高速时钟就绪


FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预存取

FLASH_SetLatency(FLASH_Latency_2); //等待两个周期


RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟

RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟为AHB时钟

RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟为AHB/2时钟

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //设置PLL时钟为外部高速时钟的9倍频

RCC_PLLCmd(ENABLE); //使能PLL时钟

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL时钟使能就绪


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置PLL时钟为系统时钟

while(RCC_GetSYSCLKSource()!=0x08); //等待PLL时钟作为系统时钟

}


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

* Function Name  : void NVIC_Configuration(void)

* Description    : 

* Input          : None

* Output         : None

* Return         : None

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

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); //向量表存放在RAM中

#else

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //向量表存放在FLASH中

#endif


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择向量优先级组


NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //选择中断向量通道为定时器2的通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先优先级为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //亚优先级为0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    //使能中断向量

NVIC_Init(&NVIC_InitStructure); //完成初始化



timer.c

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

* 文件 :timer.c

* 说明 :通过配置定时器相关寄存器的配置,实现定时器2每1S中断一次通过数码管将时间实时的显示出来

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

#include"stm32f10x_lib.h"


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

* 函数名称 :void TIM_Configuration(void)

* 函数功能 :定时器的相关配置

* 入口参数 : 无

* 出口参数 :无

* 返回值   :无

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

void TIM_Configuration(void)

{

  /*-----------定义结构体变量----------------*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef      TIM_OCInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟

TIM_DeInit(TIM2);

TIM_InternalClockConfig(TIM2);

/*-----------Configures TIM2 -------------*/

TIM_TimeBaseStructure.TIM_Period = 2000;      //下个更新事件发生时自动装载的周期值

TIM_TimeBaseStructure.TIM_Prescaler = 35999;   //时钟的分频值为35999,则时钟分频36000

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   //设置时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //输出比较时间模式

// TIM_OCInitStructure.TIM_Pulse = 0x0; //脉冲值  设置待转入捕获寄存器的脉冲值(定时器模式配置为输出比较模式)

TIM_OC1Init(TIM2,&TIM_OCInitStructure);


TIM_Cmd(TIM2,ENABLE);//使能TIM2


TIM_PrescalerConfig(TIM2,35999,TIM_PSCReloadMode_Immediate);//让定时器预分频值立即装入


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


TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能定时器中断

}



SMG_Display.c

#include"stm32f10x_lib.h"


/*---数码管从左至右为SMG1,SMG2,SMG3,SMG4,分别对应的GPIO引脚为PC8,PB15,PC9,PE8 --*/



/*-----------------数码管显示的数据(0~9)的段码-------------------*/

 u8 const Display_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


/*-----------------外部函数的声明----------------------*/

 extern void SPI_74HC595_Init(void);

 extern void SPI_74HC595_SendData(u8 data);


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

* Function Name  : void SMG_Init(void))

* Description    : 对数码管的初始化

* Input          : None

* Output         : None

* Return         : None

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

void SMG_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量

SPI_74HC595_Init(); //初始化595

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOE,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC,&GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}


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

* Function Name  : void SMG_Bit(u8 data)

* Description    : 选择数码管的位选

* Input          : u8 data --------0x01:选择左边第一个数码管

0x02:第二个数码管

0x04:第三个数码管

0x08:第四个数码管

* Output         : None

* Return         : None

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

void SMG_Bit(u8 data)

{

if((data & 0x01)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_8);

else GPIO_SetBits(GPIOC,GPIO_Pin_8);

if((data & 0x02)!= 0) GPIO_ResetBits(GPIOB,GPIO_Pin_15);

else GPIO_SetBits(GPIOB,GPIO_Pin_15);


if((data & 0x04)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_9);

else GPIO_SetBits(GPIOC,GPIO_Pin_9);


if((data & 0x08)!= 0) GPIO_ResetBits(GPIOE,GPIO_Pin_8);

else GPIO_ResetBits(GPIOE,GPIO_Pin_8);

}


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

* Function Name  : void SMG_Display(u32 data,u8 dot)

* Description    : 

* Input          : data:

要显示的数据 

dot:

显示小数点的位置

* Output         : None

* Return         : None

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

void SMG_Display(u32 data,u8 dot)

{

u32 one,ten,hundred,thousand; //个,十,百,千

u32 j,n;

thousand = data / 1000;

hundred = (data % 1000) / 100;

ten = (data % 100) / 10;

one = data % 10;

//----------------显示数据-------------------------

for(n=0;n<20;n++)

{

if(4==dot) SPI_74HC595_SendData(Display_TAB[thousand]&0x7f);

else SPI_74HC595_SendData(Display_TAB[thousand]);

SMG_Bit(0x01);

for(j=0;j<1500;j++);

SMG_Bit(0x00);


if(3==dot) SPI_74HC595_SendData(Display_TAB[hundred]&0x7f);

else SPI_74HC595_SendData(Display_TAB[hundred]);

SMG_Bit(0x02);

for(j=0;j<1500;j++);

SMG_Bit(0x00);

if(2==dot) SPI_74HC595_SendData(Display_TAB[ten]&0x7f);

else SPI_74HC595_SendData(Display_TAB[ten]);

SMG_Bit(0x04);

for(j=0;j<1500;j++);

SMG_Bit(0x00);

SPI_74HC595_SendData(Display_TAB[one]);

SMG_Bit(0x08);

for(j=0;j<1500;j++);

SMG_Bit(0x00);

}

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

* 名称:NumbTube_Bit(uint8 data)

* 功能:选择数码管的位选。

* 入口参数: data        选择码

推荐阅读

史海拾趣

明波通信(BWAVE)公司的发展小趣事

随着无线通信技术的快速发展,明波通信紧跟时代步伐,不断投入研发力量,在无线/移动通信领域取得了重大技术突破。公司成功开发出了一系列大规模集成电路(IP/ASIC)及相关控制软件,不仅提高了通信效率和质量,也赢得了国内外客户的广泛认可。这一时期的明波通信,已经成为国内通信行业的佼佼者。

扬州国芯(Gcore)公司的发展小趣事

随着汽车产业的快速发展,车载电子系统成为了新的增长点。明波通信凭借在通信领域的深厚积累,迅速拓展车载电子系统业务。公司成功开发了车载导航、车载音响系统等项目,并与多家知名汽车厂商建立了合作关系。这一举措不仅为明波通信带来了新的增长点,也进一步巩固了其在电子行业的地位。

Antiference公司的发展小趣事

Antiference公司最初以生产电磁屏蔽材料起家,但随着电子设备的普及和电磁干扰问题的日益严重,公司意识到单纯的材料生产已无法满足市场需求。于是,Antiference投入巨资研发新型电磁干扰抑制技术,成功开发出了一款能够显著降低电磁干扰的芯片。这款芯片迅速在市场上获得了广泛认可,Antiference也因此成为了电磁干扰抑制领域的领军企业。

Advanced Optoelectronic Technology Corp公司的发展小趣事

随着产品线的不断扩展,AOTC开始进军国际市场。公司积极与各大电子厂商合作,将光电转换器集成到各类电子产品中,从而实现了市场份额的快速增长。同时,公司还不断投入研发,对产品进行升级迭代,以满足市场不断变化的需求。

Ampire Co Ltd公司的发展小趣事

AOTC公司起源于一个由几位电子工程专家组成的小团队,他们共同研发出了一种新型的光电转换器,具有更高的转换效率和更小的体积。这一技术突破迅速吸引了风险投资家的注意,公司得到了初始的资金支持,并开始了正式的商业化进程。

Asian Best Components Co Ltd公司的发展小趣事

随着国内市场的日益饱和,Asian Best Components Co Ltd开始将目光投向了广阔的国际市场。公司积极参加国际电子展会,与全球各地的客户建立了广泛的联系。通过深入了解不同市场的需求和特点,Asian Best不断调整产品策略,优化产品设计,成功打入多个国际市场。同时,公司还加强与国际同行的合作,共同推动电子行业的发展。

问答坊 | AI 解惑

接地电阻测试方法

一、接地电阻测试要求: a. 交流工作接地,接地电阻不应大于4Ω; b. 安全工作接地,接地电阻不应大于4Ω; c. 直流工作接地,接地电阻应按计算机系统具体要求确定; d. 防雷保护地的接地电阻不应大于10Ω; e. 对于屏蔽系统如果采用联合接地时,接 ...…

查看全部问答>

高分求助 飞凌 TE2440或者TE2440-II WinCE4.2 BSP

项目突然上wince4.2,网上找了半天,好不容易看到飞凌TE2440-II支持WinCE4.2,电话和销售确认是有4.2的bsp。买了回来再去要的时候,被告知不支持4.2。唉..... 现求各位大侠,谁有他们的4.2的bsp。能否给我发一份!万万分感谢!邮箱dongy117@gmail. ...…

查看全部问答>

请问怎么能实现长按开关键实现唤醒?

休眠->唤醒都已经实现 现在想实现长按按键唤醒 请问怎么实现 各位兄弟提供个思路!谢谢…

查看全部问答>

读驱动源代码的遇到的问题

    最近一段时间,一直在看TI公司DM642的视频驱动的代码,是迷你驱动部分的源代码,其中涉及多个方面,包括驱动结构、内存管理、队列管理、EDMA和VP口配置等等多个方面,我准备从源代码入手,以此为线索同时学习个股方面的知识。但是现 ...…

查看全部问答>

上海专业单片机培训机构

    目前,电子技术、单片机技术已经深入人心,并且深入到我们生活的各个方面,比如白色家电,电动车,仪器仪表等等,我们已经深深地感觉到,我们离不开电子,而想进入这个行业的人也越来越多,我们为了让更多的人梦想成真,所以设立了各 ...…

查看全部问答>

NK 放在80200000还是8C200000?这两种方式有啥区别?

在\\Files路径下的config.bib文件中,见到有两种关于内存的分配方式: MEMORY     NK      80200000  01E00000  RAMIMAGE        ;30MB     RAM    ...…

查看全部问答>

[职场攻略]大学生怎么对待第一份工作

眼下,刚走出大学校园一个月的大学生,有的已 经顺利地走上了工作岗位,开始了自己的职业生涯;而有的还奔波于人才中心或是守候在电脑前关注网络上的招聘信息。对于毕业后的第一份工作,是满意还是失 望,或是有更多的期待?大学生如何看待自己的第 ...…

查看全部问答>

verilog一个表达式

    Adbus = { 3{4\'b1011} }= { 4\'b1011,4\'b1011,4\'b1011}么 不是应该这样么 为什么上面是那样呢 本人初学Verilog…

查看全部问答>

定时器和中断怎么关不掉啊

请问各位前辈       我想产生两相相位差90度的PWM,在中断中关掉定时器    我用了CCIE=0 ,TACCTL0 &= ~CCIE; 也不起作用 输出的波形 是同相位的 不知道为什么 请各位前辈指教     &nb ...…

查看全部问答>

IAR中memory怎么看,怎么和寄存器中的不一致?

IAR中memory怎么看,怎么和寄存器中的不一致?…

查看全部问答>