STM32:定时器外部时钟软件代码部分(内含:1.实验现象如下+2.代码部分+3.注意事项)

简介: STM32:定时器外部时钟软件代码部分(内含:1.实验现象如下+2.代码部分+3.注意事项)

1.实验现象如下:


不设置预分频前提下,遮挡一次,CNT+1,遮挡几次就加几。+9后,再+,NUM++,CNT==0。


aebebdc7798b4fd4869f8d94dac15ac2.png

6545c6c943074de3be50ff769263eef2.png



2.代码部分:


主函数部分:


#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
int main(void)
{
OLED_Init();
Timer_Init();
OLED_ShowString(1, 1, "Num:");
OLED_ShowString(2, 1, "CNT:");
while(1)
{
OLED_ShowNum(1,5,Num,5);
OLED_ShowNum(2,5,Timer_GetCounter(),5);
//不设置预分频前提下,遮挡一次,CNT+1,遮挡几次就加几。+9后,再+,NUM++,CNT==0
}
}
//中断函数:当进入中断,自动执行该函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//获取中断标志位
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
}
}

6116547750ea4e4ab22b5908cb4ee58b.png

定时器外部函数(源文件部分):

#include "stm32f10x.h" // Device header
void Timer_Init(void)//初始化定时器---过程查看定时器中断基本结构.
//在Library中tim.h定义许多库函数,需要充分学习和使用,此处写几个用到的,重要的
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//第一步:开启APB1时钟,因为TIM2是APB1总线的外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启,配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//第二步:选择时基单元的时钟(外部时钟)
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
//参数2:外部触发预分频器,可以是TIM_ExtTRGPSC_OFF,不分频;TIM_ExtTRGPSC_DIV2二分频...此处选择不分频即可
//参数3:外部触发极性,可以是TIM_ExtTRGPolarity_Inverted反向,即低电平或下降沿有效。
// 可以是TIM_ExtTRGPolarity_NonInverted不反向,高电平或上升沿有效。选择不反向即可。
//参数4:外部触发滤波器,必须是0x00到0x0f直接。决定f和N,参考手册有。不需要滤波器选择0x00。
//第三步:配置时基单元----TIM_TimeBaseInit的第二个参数是结构体,配置结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//TIM_CKD_DIV1,1分频,不分配;TIM_CKD_DIV2,2分频;TIM_CKD_DIV4,4分频----要求不高时,随意选择
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
//TIM_CounterMode_Up向上计数;TIM_CounterMode_Down向下计数;TIM_CounterMode_CenterAligned1等为中央对齐
TIM_TimeBaseInitStructure.TIM_Period=10-1;//手动模拟自动重装值要小
TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//预分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//高级定时器用到,通用定时器选0
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//结构体
//第四步:使能中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//第五步:NVIC中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);
//第六部分:启动定时器
TIM_Cmd(TIM2,ENABLE);
}
//实时观看CNT计数器的值
uint16_t Timer_GetCounter(void)
{
return TIM_GetCounter(TIM2);
}

b256d6163e094acb87988394e3408590.png


3ce39b874fb74519ad06ac8258b72357.png

e044ca164cef475db70b8abdcadcc204.png

定时器外部函数(头文件部分):

#ifndef __TIMER_H
#define __TIMER_H
void Timer_Init(void);
uint16_t Timer_GetCounter(void);
#endif

f677d7fdf65d4cf5af28ca0e3f91c540.png


3.注意事项:

定时器外部中断函数和定时器定时中断类似,只是将内部中断函数换为了外部中断,如图:


c0a41bc41c4340f28ae1aa90badcbff3.png


且外部时钟使用时,需要配置GPIO,如下:


12a3c60f37a5477e8b88a312dad4c712.png


CNT是用来反馈外部时钟被使用情况,需要如下设置:


6cc187cbeea2471d84007c3b9afb35a9.png


其他部分基本与定时器中断一致。

相关文章
|
2月前
【STM32】基于HAL库的360度编码器、摇杆代码编写
【STM32】基于HAL库的360度编码器、摇杆代码编写
|
18天前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
63 2
|
13天前
|
芯片
【STM32】STM32简述定时器
【STM32】STM32简述定时器
|
13天前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解独立看门狗的本质和使用步骤&代码
【STM32】详解独立看门狗的本质和使用步骤&代码
|
13天前
|
芯片
【STM32】详解RTC实时时钟的概念和配置&示例代码
【STM32】详解RTC实时时钟的概念和配置&示例代码
|
13天前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
2月前
|
传感器
STM32标准库外部中断和定时器知识点总结-2
STM32标准库外部中断和定时器知识点总结
|
2月前
|
传感器
STM32标准库外部中断和定时器知识点总结-1
STM32标准库外部中断和定时器知识点总结