总结独立看门狗与窗口看门狗的区别:
1)独立看门狗没有中断,窗口看门狗有中断
2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制
3)独立看门狗只有下限,窗口看门狗又下限和上限
4)独立看门狗是12位递减的。窗口看门狗是7位递减的
5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR
(七) 系统滴答定时器SYSTICK
这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。
作用:
在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).
因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。
(八) 利用定时器3产生PWM
编程步骤
1. 配置系统时钟;
2. 配置NVIC;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
3. 配置GPIO;
voidPWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7; //
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; // GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
4. 配置TIMER;
*****************
通用定时器3初始化
arr:自动装载值
psc:时钟预分频数
定时器时间溢出的计算方法:Tout=((arr+1)*(psc+1))/ Ft us
Ft定时器的工作频率,单位MHz
*****************
*/
voidTIM3_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period=arr;//自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上技术模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化定时器3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许定时器3更新中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
TIM_Cmd(TIM3,ENABLE);//使能定时器3
}
5. 主函数:
intmain(void)
{
PWM_GPIO_Config();
TIM3_Init(99,99); // 5Khz定时器时间溢出的计算方法:Tout=((arr+1)*(psc+1))/ Ft us
while (1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);// LED
}
}
这里我通过直接控制寄存器的方法来控制IO口输出,设置输出的IO口为PA7.
(九) 测试结果:
将代码下载到板子上后搭线连接示波器。如图示,示波器测得频率为5.076KHz。占空比49.75%,与设定的值几乎一致。