stm32定时器参考资料

2020-06-21 15:10

一、 本课内容概述

这一课的主要内容是STM32系统时钟定时器systick的配置以及如何产生精

确延时。

通常实现Delay(N)函数的方法为: for(i = 0; i <= x; i ++);

x --- 对应于 对应于N 毫秒的循环值

对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

注: 全局变量TimingDelay 必须定义为volatile

二、 SysTick的配置使用方法

外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9,将SysTick 时钟设置为9MHz, 就能够产生1us的时间基值,即SysTick产生1us的中断。 使用ST的函数库使用systick的方法

1、调用SysTick_CounterCmd() 失能SysTick计数器 2、调用SysTick_ITConfig () 失能SysTick中断

3、调用SysTick_CLKSourceConfig() 设置SysTick时钟源。 4、调用SysTick_SetReload() 设置SysTick重装载值。 5、调用SysTick_ITConfig () 使能SysTick中断 6、调用SysTick_CounterCmd() 开启SysTick计数器

7、去掉stem32f10x_conf.c文件里面关于SysTick的注释,包含编译相关文件

8、在FWLIB里面加入stm32f10x_systick.c

9、修改工程设置,把中断向量表指向FLASH空间:

project-option-C/C++ Complier-Processor-Defined symbols改为VECT_TAB_FLASH

相关程序

1. (1)建立systick.c文件

2. 新建systick.c文件,作为systick相关函数的子函数,子函数里面应包括:

SysTick_Init,SysTickDelayUs, TimingDelayMs_Decrement三个函数,由于程序用到一个存放中断计数值的全局变量,而我们将次变量与main.c文件中定义,因此还要在这个文件中做外部引用定义:extern vu32 TimingDelay;,再把系统初始化头文件包括,就完成了此文件的建立:#include \。 3. (2)修改systemInit.h文件

4. 由于在其他C文件中要用到systick.c定义的一些函数,因此我们在systemInit.h中进行外部

函数声明:

5. extern void SysTick_Init(void); 6. extern void SysTickDelayUs(u32);

7. extern void TimingDelay_Decrement(void); 8. (3)修改中断文件stm32f10x_it.c

9. 由于我们用到了systick系统时钟计数器中断计数的方法来产生延时,因此,我们必须在此文件

中修改相应的中断函数,打开stm32f10x_it.c找到相应的函数,加入中断计数函数。 10.

11. void SysTickHandler(void) 12. {

13. TimingDelay_Decrement(); //中断计数函数 14. }

15. 由于在此文件中调用了TimingDelay_Decrement()函数,因此必须将对此函数进行了外部声明

的头文件systemIni.h包括进来: 16.

17. #include \ 18. #include \ 19. (3)修改main.c文件

20. 由于使用了全局变量TimingDelay,因此要进行定义:vu32 TimingDelay;,而要完成sistick

的初始化,我们要在系统初始化总程序System_Init()里引用SysTick_Init();函数。 21. 根据需要编写我们的应用主程序,给出一个实现流水灯的例程: 22.

23. int main(void) 24. {

25. System_Init(); 26. while (1) 27. {

28. LED1_H;

29. SysTickDelayUs(500000);

30. LED1_L;

31. SysTickDelayUs(500000); 32. LED2_H;

33. SysTickDelayUs(500000); 34. LED2_L;

35. SysTickDelayUs(500000); 36. LED3_H;

37. SysTickDelayUs(500000); 38. LED3_L;

39. SysTickDelayUs(500000); 40. LED4_H;

41. SysTickDelayUs(500000); 42. LED4_L;

43. SysTickDelayUs(500000); 44. } 45. }

46. #include \ 47. extern vu32 TimingDelay; 48. SysTick 初始化函数 49.

50. //SysTick设置

51. void SysTick_Init(void) 52. { 53.

54. SysTick_CounterCmd(SysTick_Counter_Disable); 55. 56.

57. SysTick_ITConfig(DISABLE); 58. 59.

60. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 61.

62. SysTick_SetReload(9); 63.

64. SysTick_ITConfig(ENABLE); 65. }

66. SysTickDelayMs 延迟一微秒函数 67.

68. void SysTickDelayUs(u32 nTime) 69. { 70.

71. SysTick_CounterCmd(SysTick_Counter_Enable); 72.

73. TimingDelay = nTime;

74. while(TimingDelay != 0); 75.

76. SysTick_CounterCmd(SysTick_Counter_Disable); 77.

78. SysTick_CounterCmd(SysTick_Counter_Clear); 79. }

80. TimingDelayMs_Decrement 中断调用函数 81.

82. void TimingDelay_Decrement(void) 83. {

84. if (TimingDelay != 0x00) 85. {

86. TimingDelay--; 87. } 88. }

89. SysTickHandler 中断进入函数 90.

91. void SysTickHandler(void) 92. {

93. TimingDelay_Decrement(); 94. }

95. NVIC_Configuration 中断向量表配置 96.

97. void NVIC_Configuration(void) 98. {

99. #ifdef VECT_TAB_RAM 100. 101. 102. 103. 104. 105. 106.

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }

对定时器的基本配置

TIM_TimeBaseStructure.TIM_Period = 1000; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 35999; //分频计数

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_Cmd(TIM2, ENABLE); //是能定时器 始能定时器的中断:

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

在开启时钟里一定要打开TIM2的时钟,函数表达式如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 4:中断向量函数的编写: void NVIC_Configuration(void) {

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM //如果程序在ram中调试那么定义中断向量表在Ram中否则在Flash中

/* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif

/* Enable the TIM2 global Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


stm32定时器参考资料.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:5 检验医学专业高级职称考试试卷1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: