概述
一、
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实现延时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复