<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F10x 學(xué)習(xí)筆記 2 (SysTick 定時(shí)器)

          STM32F10x 學(xué)習(xí)筆記 2 (SysTick 定時(shí)器)

          作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          SysTick定時(shí)器被集成在NVIC中。因此,只要是Cortex-M3內(nèi)核的單片機(jī),就都有它。這個(gè)學(xué)習(xí)筆記就用SysTick定時(shí)器來實(shí)現(xiàn)走馬燈的功能。

          本文引用地址:http://www.ex-cimer.com/article/201611/318837.htm

          SysTick定時(shí)器非常簡答,只有四個(gè)寄存器。這四個(gè)寄存器的含義在《Cortex-M3權(quán)威指南》那本書中講的非常的清楚,這里不復(fù)述了,下面只講講在STM32上SysTick有什么特殊之處。按照CMSIS標(biāo)準(zhǔn),用C語言訪問這四個(gè)寄存器時(shí)使用的寄存器名稱分別如下:

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

          SysTick->CALIB的值固定為9000,因此,只有當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9MHz(HCLK/8的最大值),產(chǎn)生1ms時(shí)間基準(zhǔn)。

          STM32提供了2個(gè)時(shí)鐘源:

          0:AHB/8

          1:Processorclock(AHB)

          因此,SysTick->CTRL=7表示使用處理器時(shí)鐘作為時(shí)鐘源,使能SysTick,并且使能SysTick中斷。SysTick->CTRL=3時(shí)頻率降為原來的1/8。

          我的開發(fā)板上有四個(gè)LED,分別對(duì)應(yīng)的GPIO端口D的PD2、PD3、PD4和PD7。

          下面是例子程序,仍然先是直接設(shè)置寄存器。

          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 固件函數(shù)庫提供的函數(shù)的例子。

          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 函數(shù)來設(shè)置SysTick的中斷頻率,時(shí)鐘源就不能人為的指定了,這時(shí)使用的時(shí)鐘源就是內(nèi)核的頻率。

          SystemCoreClock 是個(gè)全局變量,它的值就是內(nèi)核的運(yùn)行頻率,不過前提要調(diào)用 SystemInit() 函數(shù)來設(shè)置內(nèi)核的頻率。如果內(nèi)核的頻率是字節(jié)寫寄存器來設(shè)置的,SystemCoreClock 的值就不一定對(duì)了。



          關(guān)鍵詞: STM32F10xSysTick定時(shí)

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();