新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32F10x 學習筆記 2 (SysTick 定時器)

        STM32F10x 學習筆記 2 (SysTick 定時器)

        作者: 時間:2016-11-20 來源:網絡 收藏
        SysTick定時器被集成在NVIC中。因此,只要是Cortex-M3內核的單片機,就都有它。這個學習筆記就用SysTick定時器來實現走馬燈的功能。

        本文引用地址:http://www.104case.com/article/201611/318837.htm

        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 的值就不一定對了。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 庄浪县| 茶陵县| 临洮县| 兰考县| 秭归县| 碌曲县| 仙游县| 黄陵县| 乌鲁木齐市| 堆龙德庆县| 芜湖县| 洪泽县| 无棣县| 淮阳县| 留坝县| 盈江县| 印江| 改则县| 礼泉县| 鹤山市| 虞城县| 洞头县| 扎鲁特旗| 化隆| 梅州市| 平原县| 乳源| 永兴县| 手游| 宁安市| 梓潼县| 临海市| 西藏| 新绛县| 阜城县| 綦江县| 娄底市| 尖扎县| 无锡市| 晋宁县| 阜新|