STM32 TIM TIM_ITConfig()设置参数

STM32 TIM TIM_ITConfig()设置参数,第1张

STM32有硬件PWM功能,但应用比较复杂,我也刚学,不知是否能产生1KHZ

用时器中断比较简单,但你要知道要添加哪些头文件

int main(void)

{

  LED_GPIO_Config();/ led 端口配置,也就是配置哪个管脚输出方波 这里以LED代替,这可是最基本 的 *** 作,方法略 /

TIM2_Configuration(); / TIM2 定时配置 /

TIM2_NVIC_Configuration();/ 定时器的中断优先级配置 /

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); / TIM2 重新开时钟,开始计时 /

while(1);

}

void TIM2_NVIC_Configuration(void)(); / 定时器的中断优先级配置 /

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructureNVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructureNVIC_IRQChannelSubPriority = 3;

NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

/

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/ 设置TIM2CLK 为 72MHZ /

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

//TIM_DeInit(TIM2);

/ 自动重装载寄存器周期的值(计数值) /

TIM_TimeBaseStructureTIM_Period=1000; //这里改成500就是05ms中断一次了

/ 累计 TIM_Period个频率后产生一个更新或者中断 /

/ 时钟预分频数为72 /

TIM_TimeBaseStructureTIM_Prescaler= 71;

/ 对外部时钟进行采样的时钟分频,这里没有用到 /

TIM_TimeBaseStructureTIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructureTIM_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); /先关闭等待使用/

中断程序:

void TIM2_IRQHandler(void)

{

if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )

{

LED1_TOGGLE; //对LED1管脚取反 05ms一次

TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

}

}

还是把GPIO配置也帖出来吧,这里是3个引脚接3个LED,你可以只设一个引脚就可以了

void LED_GPIO_Config(void)

{

/定义一个GPIO_InitTypeDef类型的结构体/

GPIO_InitTypeDef GPIO_InitStructure;

/开启LED的外设时钟/

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

/选择要控制的GPIOB引脚/

GPIO_InitStructureGPIO_Pin = GPIO_Pin_0;

/设置引脚模式为通用推挽输出/

GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP;

/设置引脚速率为50MHz /

GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;

/调用库函数,初始化GPIOB0/

GPIO_Init(GPIOB, &GPIO_InitStructure);

/选择要控制的引脚/

GPIO_InitStructureGPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/ 关闭所有led灯 /

GPIO_SetBits(GPIOB, GPIO_Pin_0);

/ 关闭所有led灯 /

GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);

}

STM32 定时器是16位的吧 按你的晶振 和分频 最大6553601ms=65536s 单个的话怎么整。。达到8s应该也是可以的,不过分频得增加,但是那样就没72的倍数啦 可能有点误差,你这思路很简单啊,开俩个定时器,第一个定时器在初始化的时候就给他使能,即开始计数,在该定时器的中断函数里面把该定时器关了 并对另一个定时器使能,在另一个定时器的中断函数里同样,对第一个定时器使能,并关闭自己,每个定时器的时间根据你要亮灭来调ARR寄存器的值,

void TIM4_IRQHandler(void)

{

if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET){

TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

LED1=~LED1;

TIM_Cmd(TIM4,DISABLE);

TIM_Cmd(TIM3,ENABLE);

}

}

中断函数大概就这么写,其他的初始化都是直接调库就是了 没必要贴了 主函数里面一开始直接给灯点亮,再吊用俩个初始化就可以了

库函数原文解释如下:

@arg TIM_EventSource_Update: Timer update Event source

@arg TIM_EventSource_Trigger: Timer Trigger Event source

TIM_IT_Update:触发事件(计数器向上溢出/向下溢出)

TIM_IT_Trigger:触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

//定时100毫秒,在定时中断中将LED的相应管脚依次拉低或置高就可以了,这里是定时器配置,

//中断函数应该会写吧_

void Timer_Config(void)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

TIM_DeInit(TIM2);

TIM_TimeBaseStructureTIM_Period=1000; //自动重装载寄存器周期的值(计数值)

TIM_TimeBaseStructureTIM_Prescaler= (7200 - 1); //时钟预分频数

TIM_TimeBaseStructureTIM_ClockDivision=TIM_CKD_DIV1; //采样分频

TIM_TimeBaseStructureTIM_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); //开启时钟

}

以上就是关于STM32单片机使用定时器中断产生1khz的方波全部的内容,包括:STM32单片机使用定时器中断产生1khz的方波、STM32定时器中断改成亮三秒灭八秒、STM32 TIM TIM_ITConfig()设置参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/langs/8868774.html

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

发表评论

登录后才能评论

评论列表(0条)

保存