IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32基础(2) -> 正文阅读

[嵌入式]STM32基础(2)

目录

四.独立看门狗

独立看门狗配置步骤及代码

五.PWM输出

PWM输出步骤及代码


?

四.独立看门狗

独立看门狗原理

????????看门狗( 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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:56:09  更:2021-09-09 11:56:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:21:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码