目录
四.独立看门狗
独立看门狗原理
看门狗( watchdog timer),是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给WDT清零,如果超过规定的时间不喂狗,(一般在程序跑飞时,不在程序正常的状态),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
独立看门狗配置步骤及代码
-
取消写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
-
设置独立看门狗的预分频系数和重装载值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //
设置
IWDG
预分频值
void IWDG_SetReload(uint16_t Reload); //
设置
IWDG
重装载值
-
重载计数值喂狗
IWDG_ReloadCounter(); //
按照
IWDG
重装载寄存器的值重装载
IWDG
计数器
- 启动看门狗
IWDG_Enable(); //使能 IWDG
iwdg.c
void Iwdg_Init(void)
{
//1、 取消寄存器写保护:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//2、设置独立看门狗的预分频系数,确定时钟:125HZ
IWDG_SetPrescaler(IWDG_Prescaler_256);
//3、设置看门狗重装载值,确定溢出时间:2s
IWDG_SetReload(250);
//4、使能看门狗
IWDG_Enable();
IWDG_ReloadCounter();
main.c
#include "delay.h"
#include "led.h"
#include "key.h"
#include "iwdg.h"
#include "stm32f4xx.h"
int main()
{
delay_init(128);
delay_ms(500);
LED_Init();
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
KEY_INIT ();
IWDG_INIT(4, 100);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
{
IWDG_ReloadCounter();
}
}
}
五.PWM输出
PWM概述
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图:
STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。
PWM输出步骤及代码
- 使能定时器14和相关IO口时钟。
使能定时器14时钟:RCC_APB1PeriphClockCmd();
使能GPIOF时钟:RCC_AHB1PeriphClockCmd (); - 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 - GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); - 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
- 初始化输出比较参数:TIM_OC1Init();
- 使能预装载寄存器: TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
- 使能自动重装载的预装载寄存器允许位 TIM_ARRPreloadConfig(TIM14,ENABLE);
- 使能定时器。TIM_Cmd();
- 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();
pwm.c
#include "pwm.h"
/*
引脚说明:
LED0灯连接PF9,TIM14通道1
TIM14 -- APB1,定时器频率:84MHZ
*/
void Pwm_Led0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct; //定时一个该结构体
//开启 TIM14 和 和 GPIO时钟,配置 PF9选择复用功能 AF9 (TIM14)输出。
//库函数使能 TIM14 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
//还需要使用到GPIOF9,所以也要使能该引脚
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//由于使用到PF9的复用功能,利用库函数使其引脚与TIM14定时器
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //配置引脚为复用功能
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStruct); //初始化 PF9,用库函数寄存器
TIM_TimeBaseStruct.TIM_Prescaler = 84-1 ; //设置定时器的分频值 1MHZ
TIM_TimeBaseStruct.TIM_Period = 500-1; //设置定时器的的自动重装载的值 周期为500us
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器为向上计数模式
TIM_TimeBaseStruct.TIM_ClockDivision= TIM_CKD_DIV1;//设置定时器的时钟分频因子
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStruct);//初始化定时器 14
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM的模式,选择PWM模式1
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //输出的极性,输出是高电平还是低电平,这里选择低电平
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //用于设置输出的使能,使能PWM输出到端口
//根据设定信息配置TIM14 OC1 -- 通道1
TIM_OC1Init(TIM14, &TIM_OCInitStruct);
//使能预装载寄存器:
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
//使能自动重装载的预装载寄存器允许位
TIM_ARRPreloadConfig(TIM14,ENABLE);
//使能定时器。
TIM_Cmd(TIM14, ENABLE);
}
原文链接:https://blog.csdn.net/wprpr/article/details/108034494