我是靠谱客的博主 俏皮龙猫,最近开发中收集的这篇文章主要介绍stm32f103c8t6定时器3实现延时,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、请添加图片描述
NVIC是内核外设
core_cm3相关文件实现了内核的寄存器映射
misc相关文件也是和内核相关的
请添加图片描述
二、f103的中断包括内核中断和外部中断

三、
(1)NVIC是嵌套向量中断控制器。不管是内核中断还是外部中断,只要有中断就要配置NVIC相关函数。
(2)NVIC是内核里的一个外设,与core_cm3.c core_cm3.h misc.c misc.h密切相关。NVIC的使用需要参考《编程手册》《权威指南》
(3)芯片厂商会对cortex-m3内核里的NVIC进行裁剪,所以不同型号的mcu,其NVIC有所区别。
请添加图片描述
请添加图片描述
(4)抢占优先级与响应优先级的分配(原理+如何分配+单片机如何处理不同级别的中断)
抢占优先级与响应优先级的分配是最终配置IPbit[7:4]来实现的,4到7位一共是4位,那么可实现16种排列组合的结果(这4个位,每一个位都有两种选择:抢占/响应)。这16种结果可分为5类
请添加图片描述
请添加图片描述

抢占优先级与响应优先级的分配可分为五类:
0:4
1:3
2:2
3:1
4:0
AIRCR[10:8]决定IPbit[7:4],进而决定抢占优先级与响应优先级的分组情况。
请添加图片描述
(5)几个重要的配置中断的寄存器
请添加图片描述

NVIC_ISER是中断使能寄存器在这里插入图片描述
请添加图片描述
ICER
请添加图片描述
ISPR
请添加图片描述
IABR
请添加图片描述
(6)库函数配置中断
例如:使用UART4和UART5两个中断,
想要配置2个中断,首先要分组。(一个工程只能分1次组)
在这里插入图片描述
分成组2:2位抢占优先级,2位响应优先级
NVIC分组,然后是定时器初始化,在定时器服务函数中实现500ms电平跳变一次。这就是51中的状态法,把任务交给定时器,不占用mcu资源。

int main(void)
{
	delay_init();
	GPIO_Configuration();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组:组2,2位抢占优先级,2位响应优先级(一个项目中中断分组只能分1次)
	TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms 


    while (1)
		{
		}
}









#include "timer3.h"
#include "sys.h" 
#include "stm32f10x.h" 
#include "stm32f10x_tim.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}


void TIM3_IRQHandler(void)   //TIM3中断
{
	static u8 i;
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
		{
			switch(i)
			{
				case 0 :PCout(13)=0;i++;break;
				case 1 :PCout(13)=1;i=0;break;
			}
			
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		
		}
}

最后

以上就是俏皮龙猫为你收集整理的stm32f103c8t6定时器3实现延时的全部内容,希望文章能够帮你解决stm32f103c8t6定时器3实现延时所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部