Proteus8.9 仿真STM32407ZGT6系列004_独立看门狗

合集下载

什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析

什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析

什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析独立看门狗是限制喂狗时间在0-x内,x由你的相关窗口看门狗,所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。

喂狗的时间不能过早也不能过晚。

窗口看门狗的上窗口就是配置寄存器WWDG->CFR里设定的W[6:0];下窗口是固定的0x40;WWDG_SetPrescaler(WWDG_Prescaler_8);void NVIC_Configuration(void)void EXTI_Configuration(void)在Stm32f10x_it.c文件中:void WWDG_IRQHandler(void)void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
/* Turn off led connected to PC.07 */
GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);
/* As EXTI line9 pending bit is not cleared, the CPU will execute indefinitely
this ISR and when the WWDG counter falls to 3Fh the WWDG reset occurs */
}
}。

Proteus8.9 仿真STM32407ZGT6系列009_PWM多路可调占空比输出

Proteus8.9 仿真STM32407ZGT6系列009_PWM多路可调占空比输出
所示)
图6 五,Main.c 代码: /* Main.c file generated by New Project wizard
* Author: Ziegler Yin * Created: 周四 一月 16 2020 * Processor: STM32F407ZGT6ZGT6 * Compiler: GCC for ARM */ #include "mfuncs.h"
while(1) {
wd[0]=lnslt[status]; wd[1]= 0; uprint("Arm 运行时......占空比"); uprint(wd); uprint("线路可调整状态:\r\n"); if(1==ReadKey(GPIOC, 0x0080)) {
status++; delay_ms(20); if(status> 4) status= 0; wd[0]=lnslt[status]; wd[1]= 0; uprint("线路调整状态......占空比"); uprint(wd); uprint("线路可调整状态:\r\n"); } if(1==ReadKey(GPIOC, 0x0010)) { LED0= 1; pwmval= gt_fig(status); gtln= nmtoa(wds, 10, pwmval);
timer.c 代码:
#include "mfuncs.h" #include "timer.h" #include "led.h"
void PWM_GPIO(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

如何设计STM32单片机独立看门狗程序?

如何设计STM32单片机独立看门狗程序?

如何设计STM32单片机独立看门狗程序?[导读]今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O 引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。

即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。

即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

1.1独立看门狗简介看门狗定时器 (WDT,Watch Dog Timer)是单片机的组成部分,它实际上是一个计数器,一般给看门狗一个数值,程序开始运行后看门狗开始倒计时。

如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始计数,也就是所谓的“喂狗”。

如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。

独立看门狗由专用低速时钟(LSI)驱动,计时主时钟发生故障它也仍然有效。

看门狗主要是用于在发生系统软件故障时,将系统复位。

也可以用于将系统从休眠或空闲模式唤醒。

PROTEUS仿真教程

PROTEUS仿真教程

PROTEUS仿真教程第一步:安装PROTEUS软件第二步:创建新项目在PROTEUS软件中,您可以创建新项目来开始您的电路仿真工作。

点击菜单栏中的“File”选项,选择“New Project”来创建一个新项目。

然后输入项目的名称并选择保存路径。

第三步:添加元件在PROTEUS软件中,您可以通过“Library”选项来选择各种电子元件,包括电阻、电容、电压源等。

点击“Library”选项,选择您需要的元件并将其拖动到工作区中。

连接元件之间的引脚以搭建电路。

第四步:设置仿真参数在搭建完电路后,您需要设置仿真参数。

点击菜单栏中的“Graph”选项,选择“Set Simulator Parameters”来设置仿真参数,包括仿真时间、步长等。

您还可以设置输出波形的显示格式和范围。

第五步:运行仿真设置好仿真参数后,点击菜单栏中的“Simulate”选项,选择“Run”来运行仿真。

PROTEUS将模拟您搭建的电路,并显示仿真结果。

您可以查看电压、电流等参数,并分析电路的工作情况。

第六步:调试电路在仿真过程中,您可能会发现电路存在问题,比如输出波形不符合预期,电流过大等。

您可以通过调试电路来解决这些问题。

尝试更改元件参数、连接方式等,并重新运行仿真来检查效果。

第七步:保存和导出仿真结果在完成仿真后,您可以保存仿真结果并导出到其他格式。

点击菜单栏中的“File”选项,选择“Save As”来保存仿真文件。

您还可以导出波形图、数据表等结果,以便后续分析和报告。

总结:本教程介绍了PROTEUS的基本功能和使用方法,帮助您快速上手该软件进行电路仿真工作。

通过创建新项目、添加元件、设置仿真参数、运行仿真、调试电路和保存结果,您可以轻松完成电路仿真工作。

希望本教程对您有所帮助,祝您在PROTEUS软件中取得成功!。

独立看门狗

独立看门狗
独立看门狗
广州星翼电子
官方淘宝店:
技术支持论坛:
看门狗
在微型计算机系统中,由于处理器的工作常常会 受到来自外界电磁场的干扰,造成程序的跑飞,而陷 入死循环,程序的正常运行被打断,由处理器所控制 的系统无法继续工作,会造成整个系统的陷入停滞状 态,发生不可预料的后果,所以出于对处理器运行状 态进行实时监测的考虑,便产生了一种专门用于监测 处理器程序运行状态的模块或者芯片,俗称“看门 狗”(watchdog) 。
比如我们设定 prer 值为 4,rlr值为 625 ,那么就可以得到, Tout=64×625/40=1000ms
(3)重载计数值喂狗 IWDG_ReloadCounter(); (4)启动看门狗 IWDG_Enable一个倒计数计数器,启动看门狗之后,计数器从其 复位初值0xFFF递减计数,当计数到末尾0x000的时候,便产生一个 复位信号,使处理器复位。 独立看门狗是时钟源是低速内部时钟,时钟频率是40KHz。在STM32 系统时钟发生故障的时候,它仍然有效。独立看门狗的溢出时间是 由预分频寄存器(IWDG_PR)和计数值重载寄存器(IWDG_RLR)决定 的。 STM32里面有一个预分频寄存器(IWDG_PR),用来设置看门狗时钟 的分频系数。 STM32有一个计数值重载寄存器IWDG_RLR,可以用来为倒计数计数 器加载初值。 STM32有一个键值寄存器(IWDG_KR) ,无论何时,只要往键值寄存 器写入0xAAAA,重载寄存器IWDG_RLR的值就会被重新加载到计数器, 从而避免看门狗复位。 这也就是我们常说的喂狗。
编程步骤:
(1)IWDG_PR和IWDG_RLR寄存器具有写保护功能。要想对这两个寄存器执 行写操作,必须先取消写保护。 IWDG_WriteAccessCmd(WriteAccess_Enable); (2)设置独立看门狗的预分频系数和重装载值; 设置看门狗的分频系数函数是: void IWDG_SetPrescaler(uint8_t Prescaler) 设置看门狗的重装载值函数是: void IWDG_SetReload(uint16_t Reload)

stm32独立看门狗操作寄存器 库函数

stm32独立看门狗操作寄存器 库函数

stm32 独立看门狗[操作寄存器+库函数]以单片机为核心的微型计算机系统中,单片机经常会受到来自外界电磁场的干扰。

造成程序跑飞,只是程序的正常运行状态被打断而进入死循环,从而使单片机控制的系统无法正常工作。

看门狗就是一种专门用于检测单片机程序运行状态的硬件结构。

stm32也是如此。

stm32 的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障时,它也仍然有效。

这里需要注意的是独立看门狗的时钟是一个内部时钟,所以不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,看门狗的时钟对时间的要求不是很精确,所以时钟有偏差可以接受。

本例直接操作寄存器实现验证独立看门狗的复位功能,设定一个800ms的喂狗时间,在主函数中实现LED闪烁,如果设定一个1s的延时,则触发独立看门狗复位,LED常亮。

库函数实现当外部中断发生(按下PA0按键),长时间不喂狗,引发独立看门狗复位时,向外用串口输出复位提示。

直接操作寄存器使用独立看门狗,需要了解一下寄存器:键值寄存器:(IWDG_KR)低16位有效的寄存器,只写寄存器,读出值恒为0x0000. 软件必须以一定的间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位。

写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器。

写入0xCCCC,启动看门狗工作。

预分频寄存器:(IWDG_PR)第三位有效寄存器,用于设置看门狗的分频系数,最低为4,最高位256.通过设置PR[2:0]:位来选择计数器时钟的预分频因子。

要改变预分频因子,IWDG_SR寄存器的PVU位必须为0。

000: 预分频因子=4100: 预分频因子=64001: 预分频因子=8101: 预分频因子=128010: 预分频因子=16110: 预分频因子=256011: 预分频因子=32111: 预分频因子=256重装载寄存器:(IWDG_RLR)低12位有效,RL[11:0]。

stm32f407zgt6中文资料

stm32f407zgt6中文资料

STM32程序设计案例教程:《STM32程序设计案例教程》是2019年电子工业出版社出版的图书,作者是欧启标。

内容简介:本书系统介绍了STM32程序设计的基础知识和实战技巧。

本书案例丰富、结构清晰、实用性强。

本书可作为高职高专院校电类专业学生的教材使用,也可供相关工程技术人员作为参考用书。

目录:项目1 STM32的开发步骤及STM32的GPIO端口的输出功能(1)任务1-1 控制一颗LED发光二极管闪烁(1)1.1 初步认识STM32的GPIO端口的输出功能(10)1.2 寄存器及其地址信息(15)1.3 volatile修饰符的使用及寄存器定义(17)习题1 (18)项目2 认识模块化编程(19)任务2-1 控制一颗LED发光二极管闪烁(19)2.1 模块化编程(24)2.2 其他C语言注意事项(25)2.2.1 用#define和typedef定义类型别名(25)2.2.2 一些常见的运算符问题(25)2.2.3 文件包含(26)2.2.4 关于注释(27)习题2 (28)项目3 认识STM32的存储器结构(29)任务3-1 LED0闪烁控制(29)3.1 存储器基础知识(30)3.2 Cortex-M4内核和STM32的存储器结构(31)3.2.1 Cortex-M4内核的存储器结构(31)3.2.2 STM32的存储器结构(33)3.2.3 位带(Bit Band)及位带别名区(Bit Band Alias)的关系(37)3.3 结构体在STM32中的应用(40)3.4 通用的I/O端口功能设置函数的设计(42)任务3-2 跑马灯的实现(44)习题3 (47)项目4 精确延时的实现—SysTick 定时器的原理及其应用(48)任务4-1 蜂鸣器发声控制(48)4.1 SysTick定时器介绍(52)4.2 嘀嗒定时器的延时应用(55)习题4 (57)项目5 机械按键的识别——初步认识GPIO端口的输入功能(58)任务5-1 识别机械按键的按下与弹起(58)5.1 STM32的GPIO端口的数据输入功能(65)5.1.1 GPIO端口位的数据输入通道(65)5.1.2 GPIO端口位的输入配置及上/下拉电阻使能(66)5.2 按键状态的判断(67)习题5 (68)项目6 深入了解STM32F407的时钟系统(69)6.1 STM32F4的时钟系统简介(69)6.2 STM32F4的时钟系统(69)6.3 STM32F4的系统时钟和各模块时钟(72)6.3.1 系统时钟SYSCLK (72)6.3.2 由SYSCLK模块提供时钟源的时钟(73)6.3.3 RCC模块的相关寄存器及其作用(75)习题6 (77)项目7 认识STM32的串口结构(78)任务7-1 使用STM32的串口向PC端发送字符串(78)7.1 串口基础知识(83)7.2 STM32的串口结构(84)7.3 引脚复用(90)7.4 端口初始化函数的重新组织(93)习题7 (95)项目8 STM32F407的中断管理(96)任务8-1 使用STM32的外部中断(96)8.1 内嵌中断向量控制器NVIC对中断的控制(102)8.1.1 STM32的中断源(102)8.1.2 STM32的中断使能控制(105)8.1.3 STM32的中断优先级(106)8.1.4 中断函数接口及中断函数的实现(112)8.2 外部中断(113)8.2.1 外部中断的中断源(113)8.2.2 外部中断的设置(114)习题8 (116)项目9 认识STM32的定时器(118)任务9-1 使用定时器中断控制LED0的闪烁(118)9.1 STM32的定时器概述(122)9.2 TIM3内部结构及其计数原理(122)9.2.1 TIM3的内部结构(122)9.2.2 STM32定时器的定时原理(124)9.3 定时器中断的实现(127)9.4 应用定时器产生PWM调制信号(128)9.4.1 TIM14的PWM调制原理(130)9.4.2 TIM14产生PWM信号涉及的寄存器(132)9.4.3 TIM14产生PWM信号的实现流程(133)任务9-2 使用TIM14产生周期为500s、占空比为80%的脉冲信号(134)习题9 (136)项目10 认识STM32的独立看门狗(137)任务10-1 认识STM32的独立看门狗的工作原理(137)10.1 看门狗电路概述(140)10.2 STM32F407的看门狗电路(140)10.3 独立看门狗相关的寄存器(141)10.4 独立看门狗的设置、启动及工作流程(142)习题10 (143)项目11 认识STM32F407的实时时钟(144)任务11-1 认识STM32的RTC (144)11.1 RTC实时时钟介绍(149)11.2 STM32的RTC的工作原理(149)11.3 STM32的RTC的操作步骤(153)习题11 (155)项目12 STM32迷你开发板电路设计(156)项目13 认识ARM处理器(161)13.1 架构简介(161)13.2 Cortex-M4的操作状态、工作模式和访问等级(161)13.3 数据长度(162)13.4 存储器大小端(162)13.5 Cortex-M4的寄存器(163)13.6 堆和栈的概念(166)13.7 内存分配(167)习题13 (170)项目14 汇编语言基础和Cortex-M4指令集(172)14.1 汇编语言基础(172)14.2 Cortex-M4的指令集(174)14.3 Cortex-M4的伪操作和伪指令(180)14.3.1 伪操作(180)14.3.2 伪指令(186)习题14 (187)项目15 认识启动文件startup_stm32f40_41xxx.s (188)习题15 (191)附录A STM32F407ZGT6的引脚结构与功能(192)附录B STM32F407ZGT6核心电路设计(203)附录C STM32F407ZGT6外围电路设计(204)附录D 关于编译信息的解释(205)参考文献(207)。

Proteus8.9 仿真STM32407ZGT6系列006_中断

Proteus8.9 仿真STM32407ZGT6系列006_中断

#endif
key.c 代码:
include "key.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能 GPIOB 时钟
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_DOWN ;//下拉
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化
}
key.h 代码:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0
图 10
九, 系列的 001-003 虚拟仿真与开发板对应已证明:虚拟仿真程序对于开发板有效,之后不再➕上 下载到开发板的介绍。
附件 Proteus8.9 仿真 STM32407ZGT6 系列 006_中断在已安装 Proteus8.9 的计算机文件夹中打开即可
PBin(3)
//PB3
void KEY_Init(void);
//IO 初始化
#endif
六,点击构建工程按钮,编译工程。(如下图 6 所示)
图6
七,点击窗口左下方仿真按钮,可见黄灯点亮仿真,按下按钮,中断仿真。 (如下图 7,8,9 所示)
ቤተ መጻሕፍቲ ባይዱ图7
图8
图9
八,选择 release,点击构建工程按钮,编译工程生成 Hex 文件。(如下图 10 所示)

Proteus8.9 仿真STM32407ZGT6系列008_PWM输出

Proteus8.9 仿真STM32407ZGT6系列008_PWM输出
timer.c 代码:
#include "mfuncs.h" #include "timer.h" #include "led.h"
void TIM4_PWM_Init(u32 arr,u32 psc) {
//此部分需手动修改 IO 口设置
GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能 TIM4 在 CCR1 上的预装载寄存器
TIM_ARRPreloadConfig(TIM4, ENABLE); //ARPE 使能
TIM_Cmd(TIM4, ENABLE); //使能 TIM4
图7
七,点击窗口左下方仿真按钮,可见红,黄,绿灯点亮后一会灭,仿真开始,按下 KEY_ADD 按钮,占空比增加;按下 KEY_MINUS 按钮, 占空比减少;按下 KEY_ZERO 按钮,占空比清零。虚拟串口,示波器将的状态变化显示在屏。 (如下图 8,9,10 所示)
图8
图9
图 10
八,选择 release,点击构建工程按钮,编译工程生成 Hex 文件。(如下图 11 所示)
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能 TIM4 在 CCR1 上的预装载寄存器
TIM_TimeBaseStructure.TIM_Prescaler= psc; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period= arr/ 2; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1;

Proteus8.9 仿真STM32407ZGT6系列001_走马灯

Proteus8.9 仿真STM32407ZGT6系列001_走马灯

while(1)
{
LED0=1;
//先点亮灯 LED0
delay_ms(500);
LED0=0;
LED1=1;
//先点亮灯 LED1
delay_ms(500);
LED1=0;
LED2=1;
//先点亮灯 LED2
delay_ms(500);
LED2=0;
}
}
Led.c 代码:
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//使能 GPIOF 时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;//LED 对应引脚
图5
五,Main.c 代码:
#include "stm32f4xx_conf.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
u8 t=0, str[]="Angela loves baby..\n";
int main (void)
一, 打开模板文件(可以随文下载放置在文档中打开)。(如下图 1 所示)
图1
二,点击 Source Code 标签。(如下图 2,3 所示)

Proteus8.9 仿真STM32407ZGT6系列005_窗口看门狗

Proteus8.9 仿真STM32407ZGT6系列005_窗口看门狗

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(6) // LED0
#define LED1 PBout(8) // LED1
void LED_Init(void);//初始化
#endif
key.c 代码:
//LED0=~LED0;
//先点亮灯
WWDG_IRQHandler();
LED1=~LED1;
//先点亮灯
delay_ms(500);
LED1=~LED1;
//先点亮灯
delay_ms(500);
}
}
}
wwdg.c 代码:
#include "wwdg.h"
#include "led.h"
#include "delay.h"
一, 打开文件(可以随文下载放置在文档中打开)。(如下图 1 所示)
图1
二,调整虚拟器件,另存工程文件。(如下图 2,3 所示)
图2
图3
三,点击 Source Code 标签。(如下图 4 所示)
图4
四,编辑 main.c, wwdg.c,wwdg.h, key.c,key.h, led.c,led.h 代码如 Proteus8.9 仿真 STM32407ZGT6 系列 001(如下图 5 所示)
图 10
九, 系列的 001-003 虚拟仿真与开发板对应已证明:虚拟仿真程序对于开发板有效,之后不再➕上 下载到开发板的介绍。
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2

STM32F103系列单片机最实用看门狗的详细资料概述

STM32F103系列单片机最实用看门狗的详细资料概述

STM32F103系列单片机最实用看门狗的详细资料概述为什么使用看门狗事情很简单先前做的一款采集数据的产品不知道为何异常,陷入死循环然后“死机”,分析了很多次,没发现原因,但是每次重新上点后就能正常采集到数据。

后来找到了解决方法:看门狗!目的是当程序走入死循环或者硬件异常时,可以自动复位,这样就可以得到跟重新上电后差不多的效果了。

使用的平台:stm32f103系列单片机使用的烧写调试模式:Jlink SWD 模式。

使用STM32官方模板库。

ST系列单片机看门狗分为两种:1.独立看门狗,2.窗口看门狗。

独立看门狗:可参看RM(reference Manual)的Independent watchdog (IWDG)当然,只是简要查看下RM中的介绍(至于寄存器的操作,我们可以略过,因为我们使用库的开发,但是基本流程一定要了解!)。

在这里我们要抓住几个关键点:a、stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位,或者触发一个中断(窗口看门狗才有)。

b、独立看门狗的时钟源为LSI,尽管主时钟出错,它还是能保持激活状态。

窗口看门狗的时钟源为APB1时钟,并且可以修改分频值。

c、独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。

主要用于监视硬件错误。

精确度要求比较低。

d、窗口看门狗:时钟与系统相同。

如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。

精确度要求更高。

看门狗原理简介:有某个寄存器按照时钟源不断的递减(有只狗,不断的消耗能量),当该。

Proteus8.9 仿真STM32407ZGT6系列007_定时器中断

Proteus8.9 仿真STM32407ZGT6系列007_定时器中断

一,打开文件(可以随文下载放置在文档中打开)。

(如下图1所示)图1 二,调整虚拟器件,另存工程文件。

(如下图2,3,4所示)图2图3三,点击Source Code标签。

(如下图5所示)图5四,编辑main.c,timer.c,timer.h,key.c,key.h,led.c,led.h 代码如Proteus8.9 仿真STM32407ZGT6系列001(如下图6所示)图6 五,Main.c 代码:/* Main.c file generated by New Project wizard* Author: Ziegler Yin* Created: 周四一月 16 2020* Compiler: GCC for ARM*/#include "mfuncs.h"#include "delay.h"#include "usart.h"#include "led.h"#include "key.h"#include "timer.h"char *dstr[5] = { "系统启动...\r\n","定时器又清零...\r\n","\r\n定时器进行中...\r\n","Test!\r\n","\r\n"};u16 w,md;u32 rd;u8 s;char *bt;char ntr[]= "1234";int main(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数uart_init(9600); //串口初始化LED_Init(); //初始化LED端口LED1= 1; //先点亮灯u8print(dstr[0]); //系统启动TIM3_Int_Init(5000-1,8400-1); //定时器时钟84M,分频系数8400,所以84M/84000=10Khz的计数频率,计数5000次为0.5while(1){for(w= 0; w< 600; w++){if(1==ReadKey(GPIOC, GPIO_Pin_4)){w=0;u8print(dstr[1]);TIM_SetCounter(TIM3, 2);rd= TIM_GetCounter(TIM3);md=(u16) rd;u16toa(bt, md);u8print("\r\n定时器清零后计数器的值: ");u8print(bt);u8print(dstr[4]);delay_ms(100);}else{u8print(dstr[2]);rd= TIM_GetCounter(TIM3);md=(u16) rd;u16toa(bt, md);u8print("\r\n定时器计数器的值: ");u8print(bt);delay_ms(100);}}timer.c代码:#include "mfuncs.h"#include "timer.h"#include "delay.h"#include "led.h"void TIM3_Int_Init(u16 rear,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_TimeBaseInitStructure.TIM_Period = rear;TIM_TimeBaseInitStructure.TIM_Prescaler= psc;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//TIM_ClearFlag(TIM1,TIM_FLAG_Update); //清除中断,以免一启用就中断TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);TIM_Cmd(TIM3, ENABLE);NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0x01;NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x03;NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;NVIC_Init(& NVIC_InitStructure);void TIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3, TIM_IT_Update)== SET){LED1= !LED1;u8print("定时器时间中断黄灯暂停...\r\n");u8print(".......................\r\n");delay_ms(1000);LED1= !LED1;}TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}timer.h代码#ifndef _TIMER_H#define _TIMER_H#include "sys.h"void TIM3_Int_Init(u16 arr,u16 psc);#endifkey.c,key.h, led.c led.h之前的代码都可借鉴,不在多列,以后不再一一罗列,只列main.c 与相关功能的.c, .h代码。

用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6

用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6

}
key.h 代码:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0
PAin(14) //PA14
#define KEY1
PAin(15) //PA15
void KEY_Init(void); //IO 初始化
#endif
timer.c 代码:
TIM_ARRPreloadConfig(TIM1,ENABLE); TIM_CtrlPWMOutputs(TIM1,ENABLE); TIM_Cmd(TIM1,ENABLE); } void TIM1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
一,目前得到的 Proteus8.9 版本软件能够支持的 Cortex-M4 固件库项目,只能到达 STM32F401VE (如下图 1 所示)。
(图 1) 作为 ST 公司 Cortex-M4 更为广泛应用的 F407,F429 系列芯片;现在的 Proteus8.9 版本软件还没有固件库支持,不能对 F407,F429 系列芯片进 行仿真实验。 但 STM32F401VE 的固件库基于 Cortex-M4,笔者就想利用 Proteus8.9 版本软件现有的 STM32F401VE 的固件库,对 F407,F429 系列芯片通过 Proteus VSM Studio 进行仿真实验应用。 首先生成 STM32F401VE 的固件库项目,选取 STM32F401VE 的芯片和其他组件(如下图 2 所示)。

STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)

STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)

STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。

看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。

看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。

看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。

具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU 复位,此时本来运行的程序终止重新启动单片机(发生了故障)。

在使用了看门狗之后,在正常运行的程序中加入喂狗的程序,即采用定时器的方式每隔一段时间进行一次喂狗重置计数装载值,这样,只要程序正常运行,没有出现故障或软件错误,就会不断的定时喂狗,从而不会使计数值达到超时值产生复位。

一、独立看门狗IWDG:1、IWDG主要性能1)自由运行的递减计数器2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作)3)看门狗被激活后,则在计数器计数至0x000时产生复位2、IWDG功能描述在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。

当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。

无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。

void IWDG_ConfiguraTIon(void)。

Proteus8.9 仿真STM32407ZGT6系列010_PWM多路可变频率可调占空比输出

Proteus8.9 仿真STM32407ZGT6系列010_PWM多路可变频率可调占空比输出

status++; delay_ms(20); if(status> 6) status= 0; wd= lnslt[status]; ; uprint("线路调整状态......占空比"); uprint(wd); uprint("线路可调整状态:\r\n"); } if(1==ReadKey(GPIOC, 0x0010)) { LED0= 1; pwmval= gt_fig(status); gtln= nmtoa(wds, 10, pwmval); if(status>0){
图7
七,点击窗口左下方仿真按钮,可见红,黄,绿灯点亮后一会灭,仿真开始,按下 SELECT 按钮,选择"变频 1-A,B,C 倍频或初始状态
", "变频 2-D 四倍频或初始状态",按下按下 KEY_ZERO 按钮,倍频, 四倍频或初始状态。占空比的调试,参见:博主的 Proteus8.9 仿 真 STM32407ZGT6 系列 009_PWM 多路可调占空比输出文。虚拟串口,示波器将的状态变化显示在屏。 (如下图 8,9,10,11 所示)
Pwm_Init3(*(tmbuf+2), *(tmbuf+3)); TIM_SetCompare2(TIM3, mdc[1]); }
int main(void) {
u16 psc=840, per=600, idc[4]= {500, 200, 300, 400}; u16 umd, pwmval=0, tm43[2][2]= {840, 600, 1680, 1200}; u8 status= 0, dir= 1, chgFry[1]= {0, 0}; int gtln= 0; char *wd, *wds, *lnslt[7]={"未选", "A 线路", "B 线路", "C 线路", "D 线路", "变频 1-A,B,C 倍频或初始状态", "变频 2-D 四倍频或初始状态"}; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2 delay_init(168); //初始化延时函数 uart_init(9600);//初始化串口波特率为 115200 LED_Init(); KEY_Init(); uprint("大家好!!!\r\n"); uprint("大家来造呼吸机-----。\r\n");

6.4 STM32F407ZGT独立按键功能深入剖析(神舟王407)

6.4 STM32F407ZGT独立按键功能深入剖析(神舟王407)

6.4 独立按键 (2)6.1.1 按键的分类 (2)6.1.2 按键属性 (2)6.1.3 STM32的位带操作 (3)6.1.4 例程01 STM32芯片按键点灯(无防抖) (7)6.1.5 例程02 STM32芯片按键点灯-增加了防抖的代码 (12)6.4 独立按键6.1.1按键的分类目前,按键有多种形式。

有机械接触式,电容式,轻触式等。

1.按制作工艺分:硬板按键:带弹簧的按键焊接在印刷电路板上软板键盘:以导电橡胶作为接触材料放在以聚脂薄膜作为基底的印刷电路上所形成的按键。

2.按工艺原理分:可以将键盘分为编码键盘和非编码键盘,编码键盘的键盘电路内包含有硬件编码器,当按下某—个键后,键盘电路能直接提供与该键相对应的编码信息,例如ASCII码。

非编码键盘的键盘电路中只有较简单的硬件,采用软件来识别按下键的位置,并提供与按下键相对应的中间代码送主机,然后由软件将中间代码转换成相应的字符编码,例如ASCII码;非编码键盘主要靠软件编程来识别的,在单片机组成的各种系统中,用的较多的是非编码键盘。

非编码键盘又分为独立键盘和行列式(又称矩阵式)键盘。

6.1.2按键属性键盘实际上就是一组按键,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开,下图是几种单片机系统常见的按键:弹性小按键被按下时闭合,松手后自动断开;自锁式按键按下时闭合且会自动锁住,只有再次按下时才弹起断开。

单片机的外围输入控制用小弹性按键较好,单片机检测按键的原理是:单片机的I/O口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该I/O口赋一高电平,然后让单片机不断地检测该I/O口是否变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。

STM32看门狗实验

STM32看门狗实验
硬件分析:
看门狗原理:
看门狗又叫watchdog timer(WDT),是一个定时器电路。 一个输入端:叫喂狗引脚; 一个输出端:连接到MCU的RESET引脚;
在系统运行以后,启动了看门狗的计数器,看门狗就开始自动计数; MCU正常工作时,每隔一段时间输出一个信号到喂狗 端,将WDT清零;一旦单片机由于干扰造成程序跑飞后,而进入死循环状态时,在超过规定的时间内 “喂狗”程序不能被 执行,看门狗计数器就会溢出,从而引起看门狗中断,就会输出一个复位信号到MCU,造成系统复位。 在使用看门狗时,要注意适时喂狗。
注意:对此寄存器进行读操作,将从 VDD 电压域返回预分频值。如果写操作正在进行,则读回的值可能是无效的。因此,
只有当 IWDG_SR 寄存器的 PVU 位为 0 时,读出的值才有效。
预分频值的设定,在 stm32f10x.h 中有如下定义
#define IWDG_Prescaler_4
((uint8_t)0x00)
独立看门狗实验
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环, 程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于 对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"。 建议:看门狗是定时器的一种,学习看门狗对于理解定时器有着借鉴作用
位 31:12 保留,始终读为 0。 位 11:0 RL[11:0]: 看门狗计数器重装载值 (Watchdog counter reload value) 这些位具有写保护功能。 用于定义看门狗计数器的重装载值,每当向 IWDG_KR 寄存器写入 0xAAAA 时,重装载值会被传送到计数器中。随后计数 器从这个值开始递减计数。看门狗超时周期可通过此重装载值和时钟预分频值来计算 。只有当 IWDG_SR 寄存器中的 RVU 位为 0 时,才能对此寄存器进行修改。 注:对此寄存器进行读操作,将从 VDD 电压域返回预分频值。如果写操作正在进行,则读回的值可能是无效的。因此,只 有当 IWDG_SR 寄存器的 RVU 位为 0 时,读出的值才有效。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化 }
led.h 代码:
#ifndef __LED_H #define __LED_H #include "sys.h" //LED 端口定义 #define LED0 PBout(6) // LED0 #define LED1 PBout(8) // LED1 void LED_Init(void);//初始化
//GPIOF9,F10 初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_8;//LED 对应引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
led.c 代码:
#include "led.h" void LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能 GPIOB 时钟
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3; //KEY0 对应引脚
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;//100M
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prer); IWDG_SetReload(rlr); IWDG_ReloadCounter();//reload
IWDG_Enable(); } void IWDG_Feed(void) {
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_DOWN ;//下拉
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化 GPIOE4
}
key.h 代码:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
图5 五,Main.c 代码: #include "stm32f4xx_conf.h" #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" #include "iwdg.h" int main(void) {
#endif
key.c 代码:
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能 GPIOB 时钟
八,选择 release,点击构建工程按钮,编译工程生成 Hex 文件。(如下图 10 所示)
图 10
九, 系列的 001-003 虚拟仿真与开发板对应已证明:虚拟仿真程序对于开发板有效,之后不再➕上 下载到开发板的介绍。
一,打开文件(可以随文下载放置在文档中打开)。(如下图 1 所示)
图1
二,调整虚拟器件,另存工程文件。(如下图 2,3 所示)
图2
图3
三,点击 Source Code 标签。(如下图 4 所示)
图4
四,编辑 main.c,iwdg.c,iwdg.h,key.c,key.h,led.c,led.h 代码如 Proteus8.9 仿真 STM32407ZGT6 系列 001(如下图 5 所示)
LED0=~PBin(6); LED1=0;
IWDG_ReloadCounter();//reload }
iwdg.h 代码:
#ifndef _IWDG_H #define _IWDG_H #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// void IWDG_Init(u8 prer,u16 rlr); void IWDG_Feed(void); #endif
IWDG_Feed(); } delay_ms(10); }; }
iwdg.c 代码:
#include "iwdg.h" #include "led.h" ////////////////////////////////////////////////////////////////////////////////// void IWDG_Init(u8 prer,u16 rlr) {
#define KEY0
PBin(3)
//PB3
void KEY_Init(void); //IO 初始化
#endif
六,点击构建工程按钮,编译工程。(如下图 6 所示) Nhomakorabea图6
七,点击窗口左下方仿真按钮,可见黄灯点亮仿真,按下按钮,进行喂狗,开始跳闪仿真。(如下图 7,
8,9 所示)
图7 图8
图9
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); LED_Init(); KEY_Init(); delay_ms(500); IWDG_Init(4,1000); LED0=0; LED1=1; while(1) {
if(KEY0 ==1) {
相关文档
最新文档