当前位置:   article > 正文

stm32f407VET6 系统学习 day05 复位, 时钟,看门狗, 滴答定时器_stm32f407vet6的时钟

stm32f407vet6的时钟

1. 复位

1.三种类型的复位,系统复位,电源复位,备份复位;

2.复位作用:让程序从头开始运行,恢复到一开始运行的状态



2.stm32 时钟源

1. 5个是时钟源

1.HSI高速内部时钟:RC振荡器,频率为16MHz,精度不高。可以作为系统钟或PLL时钟输入

2.HSE高速外部时钟:可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz
3.LSI低速内部时钟,RC振荡器(电阻+电容),频率32kHz,提供低功耗时钟。主要供独立看门狗。4.LSE是低速外部时钟,接频率为32.768kHz的石英晶体。可以作为RTC时钟源
5.PLL为锁相环倍频输出。


2.系统时钟


3.ppL


4.

5.

6.代码:

  1. #include "myrcc.h"
  2. #include "stm32f4xx_rcc.h"
  3. void Myrccconfig(void)
  4. {
  5. //第一步:复位RCC时钟树
  6. RCC_DeInit();
  7. //第二步:使能HSE时钟作为STM32输入时钟源
  8. RCC_HSEConfig(RCC_HSE_ON);
  9. //第三步:等待HSE就绪,未就绪一直等待,就绪跳出循环
  10. while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != SET);
  11. //第四步:设置flash,所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
  12. FLASH_PrefetchBufferCmd(ENABLE);//开启FLASH预读缓冲功能
  13. FLASH_InstructionCacheCmd(ENABLE); //使能指令缓冲
  14. FLASH_DataCacheCmd(ENABLE); //使能数据缓冲
  15. FLASH_SetLatency(FLASH_Latency_5); //延时5个时钟
  16. //第五步:配置生成HCLK时钟的分频系数(1)、配置生成PCLK1和PCLK2的分频系数(42
  17. RCC_HCLKConfig(RCC_SYSCLK_Div2); // AHB
  18. RCC_PCLK1Config(RCC_HCLK_Div4);
  19. RCC_PCLK2Config(RCC_HCLK_Div2);
  20. //第六步:配置PLL的输入时钟源为HSE,以及PLLM、PLLN、PLLP、PLLQ等分频系数
  21. RCC_PLLConfig(RCC_PLLSource_HSE,8,336,2,7);
  22. RCC_PLLCmd(ENABLE);//pll使能;
  23. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET);
  24. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  25. while(RCC_GetSYSCLKSource() != 0x08);
  26. }

 



3.stm32  滴答 定时器

1.定时器工作模式
定时模式:对内部周期性脉冲进行计数

计数模式∶对外部脉冲进行计数
计数方式分为︰递增计数和递减计数2种


2. 定时器分类

按核内、核外分类
核内定时器:   systick
外设定时器:   常规定时器(基本、通用和高级定时器)            特定应用定时器(低功耗定时器、看门狗、实时时钟)


按计数器位宽分
16位定时器:     通用定时器(GPTIM)、   高级定时器(ATIM)

24位定时器:   systick
32位定时器:    STM32的TIM2和TIM5


3.systick滴答定时器概念
系统节拍时钟(SysTick)是一个简单的系统时钟节拍计数器。通常用作嵌入式操作系统的系统节拍定时。当单片机程序设计中不需要操作系统时,SysTick通常作为普通定时器,或延时函数来使用。


Systick定时器,是一个简单的定时器,对于CM4内核芯片,都有Systick定时器。

SysTick定时器被捆绑在NVIC(中断)中,用于产生SYSTICK异常(异常号:15)。
使用AHB总线时钟作为输入时钟源 

—般使用sYSTICK系统定时器实现系统延时函数


4.系统定时器工作方式
Systick是24位的系统定时器,是递减计数模式,计数初始值由STK_LOAD寄存器设置。
换言之∶系统定时器Systick从 STK_LOAD寄存器设置的计数初始值开始递减计数,每经过1个systick工作时钟周期就递减1,直到递减到0,产生系统定时器中断,同时将STK_LOAD寄
存器的值重新装载,继续递减计数。

注意:systick工作时钟周期的生成;
SYSTICK定时器与TIMx定时器的不同点是:TIMx定时器处于M4核外部,使用APBx总线时钟作为输入时钟源;

而SYSTICK系统定时器在M4核内部,使用AHB总线时钟作为输入时钟源。
 


5.systick滴答定时器---寄存器(参考内核文件)


6.控制和状态寄存器CTRL


7. 控制和状态寄存器CTRL
1.ENABLE位被置1,表示SYSTICK计数使能或计数开始。此时STK_LOAD寄存器中的值将被加载到STK_VAL寄存器(即: SYSTICK定时器的计数寄存器),然后开始递减计数。


2.TICKINT位被置1,表示SYSTICK计数到0后,将产生SYTICK中断。

3.CLKSOURCE位设置SYSTICK的输入时钟源。
如果该位被置0,表示HCLK/8作为SYSTICK的输入时钟源;

如果该位被置1,表示HCLK作为SYSTICK的输入时钟源。

4.COUNTFLAG位。
当SYSTICK定时器计数到0时,COUNTFLAG位被硬件置1;当向STK_VAL寄存器写入任何值时,该位被自动清0。


8.编码流程

1、确定时钟源

2、重装数值

3、清空计数器

4、启动计时器

5、查询是否时间到

6、关闭计时器
(系统定时器使用有查询法和中断法,前者只可以用寄存器)


9.代码:

头文件:

  1. #ifndef __MYSYSTICK_H__
  2. #define __MYSYSTICK_H__
  3. #include "stm32f4xx_rcc.h"
  4. void delay_us(u8 us);
  5. void delay_ms(u8 ms);
  6. void sys_init(u8 syst);
  7. #endif


.cpp 文件

  1. #include "mysystick.h"
  2. /*
  3. 1、确定时钟源
  4. 2、重装数值
  5. 3、清空计数器
  6. 4、启动计时器
  7. 5、查询是否时间到
  8. 6、关闭计时器
  9. */
  10. int firstVal = 0;
  11. void sys_init(u8 syst)
  12. {
  13. //第三位设置成0 HCLK
  14. SysTick->CTRL &= ~(1<<2); //设置时钟源
  15. firstVal = syst/8; //设置1us延时的起始值。
  16. }
  17. // 初始值的计算方式:从初始值开始减1,减到0则溢出,时间到了。
  18. // 延时时间 =(每次滴答的时间*次数);
  19. // 如果需要延时1us ,请问需要设置多少的起始值呢:
  20. void delay_ms(u8 ms)
  21. {
  22. int count = 0;
  23. //1. 关闭定时器 (CTRL 最后一位设置成0
  24. SysTick->CTRL &= ~(1<<0) ;
  25. //2、重装数值 (load = ms?)
  26. SysTick->LOAD = ms*firstVal*1000;
  27. // 3、清空计数器 (val)
  28. SysTick->VAL = 0X00;
  29. //4、启动计时器
  30. SysTick->CTRL |= 1 ;
  31. //5、查询是否时间到 (ctrl寄存器最高位是1)没到时间一直查(while)
  32. do
  33. {
  34. count = SysTick->CTRL;
  35. }while(!(count & (1<<16))&&(count&&(1<<0)));
  36. //6、关闭计时器
  37. SysTick->CTRL &= ~(1<<0) ;
  38. SysTick->VAL = 0X00;
  39. //
  40. }
  41. void delay_us(u8 us)
  42. {
  43. int count = 0;
  44. //1. 关闭定时器 (CTRL 最后一位设置成0
  45. SysTick->CTRL &= ~(1<<0) ;
  46. //2、重装数值 (load = ms?)
  47. SysTick->LOAD = us*firstVal;
  48. // 3、清空计数器 (val)
  49. SysTick->VAL = 0X00;
  50. //4、启动计时器
  51. SysTick->CTRL |= 1 ;
  52. //5、查询是否时间到 (ctrl寄存器最高位是1)没到时间一直查(while)
  53. do
  54. {
  55. count = SysTick->CTRL;
  56. }while(!(count & (1<<16))&&(count&&(1<<0)));
  57. //6、关闭计时器
  58. SysTick->CTRL &= ~(1<<0) ;
  59. SysTick->VAL = 0X00;
  60. }


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/646724
推荐阅读
相关标签
  

闽ICP备14008679号