TIMX->CNT数值读取

为了实现脉冲测量有时候需要使用定时器计数,STM32的定时器计数精度不错,独立于程序之外。可以通过软件对其设定。当想要对信号进行测量时,只要设置好定期器就行。

举例说明:

例,如想要通过TIMER5定时器实现某信号周期测量。

void TIM5_IRQHandler(void)
{ 

if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1;    
}    
//TIM3->CNT &= 0x0;
TIM3->SR&=~(1<<0);//清除中断标志位 
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM5_Int_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;

RCC->APB1ENR|=1<<3;    //TIM5时钟使能 
TIM5->ARR=arr; //设定计数器自动重装值 
TIM5->PSC=psc; //预分频器设置
TIM5->DIER|=1<<0; //允许更新中断    
TIM5->CR1|=0x01; //使能定时器3

// 配置NVIC为优先级组1 /
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//配置中断源:按键1 
// NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
//配置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// 配置子优先级 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
// 使能中断通道 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); 
}
View Code

先进行时钟设置,开启时钟后,根据周期测量需要在测量地方获取TIMX->CNT数值并进行保存。本例是测量数据发送周期,每次数据完成32bit时获取计数器值进行保存,同时清空计数器值。

//串口任务的任务函数
void usart_task(void *pvParameters)
{
while(1)
{
if(dis_in_cnt == 32){ //第32位计数输入完成则进入串口传输
timer3_cnt = TIM5->CNT;
TIM5->CNT = 0;

//省略部分无关代码

}
vTaskDelay(10);
}

posted @ 2020-05-10 22:31  Qinzi123  阅读(6525)  评论(0编辑  收藏  举报