您的位置 首页 发布

STM32F10x 学习笔记 2 (SysTick 定时器)

SysTick定时器被集成在NVIC中。因此,只要是Cortex-M3内核的单片机,就都有它。这个学习笔记就用SysTick定时器来实现走马灯的功能。SysTick…

SysTick定时器被集成在NVIC中。因而,只要是Cortex-M3内核的单片机,就都有它。这个学习笔记就用SysTick定时器来完成走马灯的功用。

SysTick定时器十分简答,只要四个寄存器。这四个寄存器的意义在《Cortex-M3威望攻略》那本书中讲的十分的清楚,这儿不复述了,下面只讲讲在STM32上SysTick有什么特别之处。依照CMSIS规范,用C言语拜访这四个寄存器时运用的寄存器称号别离如下:

SysTick->CTRL
SysTick->LOAD
SysTick->VAL
SysTick->CALIB

SysTick->CALIB的值固定为9000,因而,只要当体系嘀嗒时钟设定为9MHz(HCLK/8的最大值),发生1ms时刻基准。

STM32供给了2个时钟源:

0:AHB/8

1:Processorclock(AHB)

因而,SysTick->CTRL=7一共运用处理器时钟作为时钟源,使能SysTick,而且使能SysTick中止。SysTick->CTRL=3时频率降为本来的1/8。

我的开发板上有四个LED,别离对应的GPIO端口D的PD2、PD3、PD4和PD7。

下面是比如程序,依然先是直接设置寄存器。

  1. #include”stm32f10x.h”
  2. #defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
  3. #defineGPIO_LED_PORTGPIOD
  4. #defineGPIO_LED1GPIO_Pin_2
  5. #defineGPIO_LED2GPIO_Pin_3
  6. #defineGPIO_LED3GPIO_Pin_4
  7. #defineGPIO_LED4GPIO_Pin_7
  8. #defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
  9. voidLED_Spark(void)
  10. {
  11. staticintstate=0;
  12. switch(state)
  13. {
  14. case0:
  15. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  16. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
  17. state++;
  18. break;
  19. case1:
  20. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  21. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
  22. state++;
  23. break;
  24. case2:
  25. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  26. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED3);
  27. state++;
  28. break;
  29. case3:
  30. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  31. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED4);
  32. state=0;
  33. break;
  34. default:
  35. state=0;
  36. break;
  37. }
  38. }
  39. intmain(void)
  40. {
  41. SystemInit();
  42. RCC->APB2ENR|=0x00000020;
  43. GPIOD->CRL=0x24422244;//PD2PD3PD4PD7SettoOutputmode
  44. SysTick->LOAD=24000000/200;
  45. SysTick->CTRL=3;
  46. for(;;)
  47. {
  48. }
  49. }
  50. /**
  51. *@briefThisfunctionhandlesSysTickHandler.
  52. *@paramNone
  53. *@retvalNone
  54. */
  55. voidSysTick_Handler(void)
  56. {
  57. staticintcount=0;
  58. count++;
  59. if(count==100)
  60. {
  61. LED_Spark();
  62. count=0;
  63. }
  64. }

然后是运用STM32 固件函数库供给的函数的比如。

  1. #include”stm32f10x.h”
  2. #defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
  3. #defineGPIO_LED_PORTGPIOD
  4. #defineGPIO_LED1GPIO_Pin_2
  5. #defineGPIO_LED2GPIO_Pin_3
  6. #defineGPIO_LED3GPIO_Pin_4
  7. #defineGPIO_LED4GPIO_Pin_7
  8. #defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
  9. voidLED_Spark(void)
  10. {
  11. staticintstate=0;
  12. switch(state)
  13. {
  14. case0:
  15. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  16. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
  17. state++;
  18. break;
  19. case1:
  20. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  21. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
  22. state++;
  23. break;
  24. case2:
  25. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  26. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED3);
  27. state++;
  28. break;
  29. case3:
  30. GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
  31. GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED4);
  32. state=0;
  33. break;
  34. default:
  35. state=0;
  36. break;
  37. }
  38. }
  39. intmain(void)
  40. {
  41. GPIO_InitTypeDefGPIO_InitStructure;
  42. SystemInit();
  43. SysTick_Config(SystemCoreClock/100);
  44. /*EnableGPIOB,GPIOCandAFIOclock*/
  45. RCC_APB2PeriphClockCmd(RCC_GPIO_LED,ENABLE);//RCC_APB2Periph_AFIO
  46. /*LEDspinsconfiguration*/
  47. GPIO_InitStructure.GPIO_Pin=GPIO_LED_ALL;
  48. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
  49. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  50. GPIO_Init(GPIO_LED_PORT,&GPIO_InitStructure);
  51. for(;;)
  52. {
  53. }
  54. }
  55. /**
  56. *@briefThisfunctionhandlesSysTickHandler.
  57. *@paramNone
  58. *@retvalNone
  59. */
  60. voidSysTick_Handler(void)
  61. {
  62. staticintcount=0;
  63. count++;
  64. if(count==100)
  65. {
  66. LED_Spark();
  67. count=0;
  68. }
  69. }

需求阐明的是,若是用 SysTick_Config 函数来设置SysTick的中止频率,时钟源就不能人为的指定了,这时运用的时钟源便是内核的频率。

SystemCoreClock 是个全局变量,它的值便是内核的运转频率,不过前概要调用 SystemInit() 函数来设置内核的频率。假如内核的频率是字节写寄存器来设置的,SystemCoreClock 的值就不必定对了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/264201.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部