Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4397706
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-06-19 19:21:42

库函数手册: 基于ARM的32位MCU STM32F101xx 和 STM32F103xx固件库.rar  
整个工程:  2_SysTick.rar  
SysTick延时: delay.rar  


  1. /*
  2. * author: yuweixian
  3. * date : 2011.6.19
  4. *
  5. * STM32F10x 使用SysTick的延时函数
  6. *
  7. * 共4个延时函数,其中delay可以直接使用,其余3个需要先调用初始化函数delay_init
  8. *
  9. * 参数最大值:
  10. * delay : 0xffffffff
  11. * delay_us : 0xffffff / (HCLK / 8000000)
  12. * delay_ms : 0xffffff / (HCLK / 8000) 特别注意主频72M时为1864
  13. * delay_s : 0xffff
  14. */
  15. #ifndef __DELAY_H
  16. #define __DELAY_H

  17. #include "stm32f10x_type.h"
  18. #include "stm32f10x_systick.h"
  19. #include "stm32f10x_rcc.h"

  20. extern void delay(u32 i);
  21. extern void delay_init(void);
  22. extern void delay_us(u32 i);
  23. extern void delay_ms(u16 i);
  24. extern void delay_s(u16 n);

  25. #endif /* __DELAY_H */

  1. #include "delay.h"

  2. static u8 delay_fac_us = 0; // us延时倍乘数
  3. static u16 delay_fac_ms = 0; // ms延时倍乘数
  4. static FlagStatus Status;

  5. void delay(u32 i)
  6. {
  7.     while (--i);
  8. }

  9. void delay_init(void)
  10. {
  11.     RCC_ClocksTypeDef RCC_ClocksStatus;

  12.     RCC_GetClocksFreq(&RCC_ClocksStatus); //返回片上时钟不同频率
  13.   
  14.     //配置SysTick的时钟源HCLK/8     选择AHB时钟作为SysTick时钟源
  15.     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

  16.     //使能、取消SysTick中断
  17.     SysTick_ITConfig(DISABLE);
  18.                                     // 16MHZ /     8MHZ = 2
  19.     delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;
  20.      // 16MHZ / 8000 = 2000
  21.     delay_fac_ms = RCC_ClocksStatus.HCLK_Frequency / 8000;
  22. }
  23.             
  24. void delay_us(u32 n)
  25. {
  26.     // 设置SysTick的重载值
  27.     SysTick_SetReload(delay_fac_us * n);

  28.     //使能或取消SysTick计数
  29.     // Clear: 清零计数器
  30.     //Enable:使能计数器
  31.     //Disable: 关闭计数器
  32.     SysTick_CounterCmd(SysTick_Counter_Clear);
  33.     SysTick_CounterCmd(SysTick_Counter_Enable);

  34.     do
  35.     {
  36.      //检查特定的SysTick标记是否被设置
  37.         //#define SysTick_FLAG_COUNT ((u32)0x00000010)
  38.         //COUNT== 自从上次读取计数器到0
  39.         // 返回 SET     或 RESET
  40.         Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
  41.     }while (Status != SET);

  42.     // 关闭计数器
  43.     SysTick_CounterCmd(SysTick_Counter_Disable);
  44. }

  45. // 最大值 0xffffff / (HCLK / 8000)
  46. // 主频72M时,n最大值只能是1864
  47. void delay_ms(u16 n)
  48. {
  49.     u32 temp = delay_fac_ms * n;

  50.     if (temp > 0x00ffffff)
  51.     {
  52.         temp = 0x00ffffff;
  53.     }
  54.     SysTick_SetReload(temp);
  55.     SysTick_CounterCmd(SysTick_Counter_Clear);
  56.     SysTick_CounterCmd(SysTick_Counter_Enable);
  57.     do
  58.     {
  59.         Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
  60.     }while (Status != SET);

  61.     SysTick_CounterCmd(SysTick_Counter_Disable);
  62. }

  63. void delay_s(u16 n)
  64. {
  65.     while (n--)
  66.     {
  67.         delay_ms(1000);
  68.     }
  69. }
阅读(2001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~