stm32计数器向上计数和向下计数有什么区别

stm32计数器向上计数和向下计数有什么区别,第1张

一个是从某个数减到零,另一个是从零加到某个数,实质性的差别不大,只是说人家设计芯片正好两种方式都能实现,有在具体的应用环境下可能会有各自的方便,就提供出来了,没有必要太纠结,具体用到的时候你自然会区分出来的

实现10ms定时需要使用STM32的定时器模块,并且要将系统时钟频率设置为足够高的值。以下是实现10ms定时的步骤:

设置系统时钟:使用RCC寄存器设置PLL倍频系数,将系统时钟频率设置为72 MHz。

选择合适的定时器:在STM32中有多个定时器可供选择,根据需要选取合适的定时器。假设在这里我们选用TIM2定时器。

配置定时器:使用TIM2的相关寄存器配置定时器的时钟源、分频系数和计数周期等参数。可以将定时器的时钟源设置为内部时钟,将分频系数设置为7200,则每秒钟定时器计数器会自增100次。

启动定时器:将TIM2的控制寄存器使能,并设置定时器计数器初值为0。

编写中断服务程序:在定时器溢出时会产生中断请求,在中断服务程序中可以进行相应的 *** 作。例如,可以使用GPIO输出引脚控制LED闪烁。

启用全局中断:调用__enable_irq();函数启用全局中断

在以上代码中,使用了TIM2定时器,并将计数周期设置为100,即每秒钟会产生10次溢出中断。在中断服务程序中,控制LED引脚状态的改变,从而实现了10ms的定时效果。

#include "stm32f10xh"

void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)

{

//定时器中断执行的内容

GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

}

}

int main(void)

{

//开启GPIOC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//配置LED引脚为推挽输出模式

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructureGPIO_Pin = GPIO_Pin_13;

GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//开启TIM2时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

//设置定时器参数

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

TIM_TimeBaseInitStructTIM_Prescaler = 7200-1; //预分频系数

TIM_TimeBaseInitStructTIM_Period = 100-1; //自动重载计数值

TIM_TimeBaseInitStructTIM_ClockDivision = TIM_CKD_DIV1; //时钟分割

TIM_TimeBaseInitStructTIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

//使能TIM2中断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

//启动TIM2定时器

TIM_Cmd(TIM2, ENABLE);

//注册中断服务程序

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructureNVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructureNVIC_IRQChannelSubPriority = 0;

NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//启用全局中断

__enable_irq();

while(1)

{

//主循环程序

}

}

如果你要用30路计数的话 我倒不推荐部用计数器去做 因为STM32只有2-4路计数器。

STM32所有的IO管脚都可以作为中断口使用、那你完全可以把所有信号接入到IO上 在外部中断处理程序中去做计数功能,当然不清楚你检测的是什么信号,频率不是特别高的话 理论上是没有问题的

15V电压要经过分压的,因为STM32的AD不能超过33V。送进AD后,有一个自动监测功能,低于33V时发生一次中断,你在中断服务程序里计数就好了。

2如果你有电压比较器的话也好弄了。其实就是个运放,低于3V输出一个负脉冲,接到你的计数器输入引脚,对它进行计数就行了。

以上就是关于stm32计数器向上计数和向下计数有什么区别全部的内容,包括:stm32计数器向上计数和向下计数有什么区别、3.已知STM32系统时钟频率为72 MHz,如何设置相关寄存器,实现10ms定时、stm32的计时器,到底同时计数的可以有多少路我需要对外部的30路信号进行同时计数,请问stm32可以多少IO入等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9875960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存