stm32F103C8T6裸机如何提高响应速度

思路就是:将主函数的程序分为几块,不使用死延时函数,利用定时器中断,每1MS中断一次,然后中断1000次之后,过去了一秒钟,将1S标志位置1,然后主函数接收到之后,运行1S任务 

#include "stm32f10x.h"               
#include "usart.h"
#include "delay.h"

int Time1ms;
int Time50ms;
int Time1s;

unsigned char TIMER_1MS_EN_FLAG=1; 
unsigned char TIMER_50MS_EN_FLAG=1; 
unsigned char TIMER_1S_EN_FLAG =1; 
			
void TIM2_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef         NVIC_InitStructure;
    //使能TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 

	TIM_DeInit(TIM2);//将TIMx外围寄存器初始化为其默认重置值

	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道被使能
	
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
	
    //定时器定时时间T计算公式:T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK
    TIM_TimeBaseStructure.TIM_Period = 1000;//自动重装载值1000
    TIM_TimeBaseStructure.TIM_Prescaler =(72 - 1);//预分频值,+1为分频系数  72M/72 1ms定时
    TIM_TimeBaseStructure.TIM_ClockDivision =0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  	TIM_ClearFlag(TIM2, TIM_FLAG_Update);	// 清除溢出中断标志 
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);	//使能TIM2中断源
    TIM_Cmd(TIM2, ENABLE);  	//使能TIMx外设	
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);	//先关闭等待使用  		
}

void TIM2_IRQHandler(void)
{	
    if ( TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET ) //是否发生中断
    {	
        TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);    //清除中断待处理位
		Time1ms++;
		if(Time1ms>=1)
		{
			TIMER_1MS_EN_FLAG=1; Time1ms=0;
		}
		
		Time50ms++;
		if(Time50ms>=50)
		{
			TIMER_50MS_EN_FLAG=1; Time50ms=0;
		}
		
		Time1s++;
		if(Time1s >= 1000)
		{
			TIMER_1S_EN_FLAG =1; Time1s=0;
		}
    }		 
}

int main(void)
{	
	delay_init();	    	 			//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 				//串口初始化为115200
	TIM2_Config();
	
	while(1)
	{
		if(TIMER_1MS_EN_FLAG==1)
		{
			TIMER_1MS_EN_FLAG=0;
		}
		if(TIMER_50MS_EN_FLAG == 1)
		{
			
			TIMER_50MS_EN_FLAG=0;
		}
		if(TIMER_1S_EN_FLAG == 1)
		{
			printf("1s\r\n");
			TIMER_1S_EN_FLAG=0;
		}
	}

 }


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值