• [嵌入式系统开发]利用系统节拍定时器实现LED灯闪烁详细教程及完整代码


          🔥《嵌入式系统开发》系列专栏主要以LPC1100系列微控制器为硬件平台,详细介绍Cortex—-M0微控制器的原理与开发技术,基于keil仿真软件平台设计最小应用系统板和具有在板仿真器的口袋开发板以及相关例程。

          🔥本文已收录于嵌入式系统开发系列专栏:嵌入式系统开发 欢迎订阅,持续更新。

          [嵌入式系统开发]利用系统节拍定时器实现LED灯闪烁详细教程及完整代码

    本文目录

         1.要求

    参考子程序:

    1.1初始化:

    1.2LED灯状态翻转:

          2.完整代码

    2.1主程序

    2.2SysTick中断服务子程序

    2.3Blinky.c文件

    2.4IRQ.c文件

         3.编译通过图片

          4. 调试运行结果的图片

    4.1LED 灭

    4.2LED亮

    4.3波形图

           5.总结


         1.要求

           在Keil MDK 4.74上编写一段程序,利用系统节拍定时器SysTick实现定时1s,控制LPC1114微控制器的GPIO引脚PIO1_9状态反转(BLINKY指示灯闪烁,周期为2s),比较一下与Delay_1s()函数实现1s的定时的异同点,尝试用不同的方法(改变中断次数或者每次中断的时间)改变LED灯闪烁的频率,观察LED灯的闪烁情况。

    参考子程序:

    1.1初始化:

    1. void LED_Init(void) {
    2. LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 6); /*enable clock for GPIO*/
    3. LPC_GPIO1->DIR |= (1UL << 9); /*configure GPIO1_9 as output*/
    4. }

    1.2LED灯状态翻转:

    1. void LED_Toggle(void) {
    2. LPC_GPIO1->DATA ^= (1UL <<9); /* Toggle the BLINKY LED */
    3. }

          2.完整代码

    2.1主程序

    1. /*----------------------------------------------------------------------------
    2. MAIN function
    3. *----------------------------------------------------------------------------*/
    4. int main (void) { /* 主程序 */
    5. SysTick_Config(SystemCoreClock/100); /* 定时10ms */
    6. LED_Init(); /* LED初始化 */
    7. while (1) { /*循环 */
    8. if(clock_1s){ /*判断*/
    9. clock_1s = 0; /*标志*/
    10. LED_Toggle(); /*状态翻转*/
    11. }
    12. }
    13. }

    2.2SysTick中断服务子程序

    1. void SysTick_Handler (void) { /*定义中断函数的入口地址·*/
    2. static unsigned long ticks; /*定义变量*/
    3. if (ticks++ >= 99) { /* 定时10ms循环100次 */
    4. ticks = 0;
    5. clock_1s = 1; /*设置标志 */
    6. }
    7. }

    2.3Blinky.c文件

    1. /*Blinky.c文件*/
    2. #include "LPC11xx.h" /* LPC11xx definitions */
    3. extern volatile unsigned char clock_1s;
    4. void SysTick_Handler (void) { /*定义中断函数的入口地址·*/
    5. static unsigned long ticks;
    6. if (ticks++ >= 99) { /* Set Clock1s to 1 every 1 second 定时10ms循环100次 */
    7. ticks = 0;
    8. clock_1s = 1; /*设置标志 */
    9. }
    10. }
    11. void LED_Init(void) {
    12. LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 6); /*enable clock for GPIO*/
    13. LPC_GPIO1->DIR |= (1UL << 9); /*configure GPIO1_9 as output*/
    14. }
    15. void LED_Toggle(void) {
    16. LPC_GPIO1->DATA ^= (1UL <<9); /* Toggle the BLINKY LED */
    17. }
    18. /*----------------------------------------------------------------------------
    19. MAIN function
    20. *----------------------------------------------------------------------------*/
    21. int main (void) { /* Main Program */
    22. SysTick_Config(SystemCoreClock/100); /* Generate IRQ each ~10 ms
    23. 定时10ms */
    24. LED_Init(); /* LED Initialization */
    25. while (1) { /* Loop forever */
    26. if(clock_1s){
    27. clock_1s = 0; /*标志*/
    28. LED_Toggle();
    29. }
    30. }
    31. }

    2.4IRQ.c文件

    1. /*----------------------------------------------------------------------------
    2. * Name: IRQ.C
    3. * Purpose: IRQ Handler
    4. * Note(s):
    5. *----------------------------------------------------------------------------
    6. * This file is part of the uVision/ARM development tools.
    7. * This software may only be used under the terms of a valid, current,
    8. * end user licence from KEIL for a compatible version of KEIL software
    9. * development tools. Nothing else gives you the right to use this software.
    10. *
    11. * This software is supplied "AS IS" without warranties of any kind.
    12. *
    13. * Copyright (c) 2010 Keil - An ARM Company. All rights reserved.
    14. *----------------------------------------------------------------------------*/
    15. #include "LPC11xx.h" /* LPC11xx definitions */
    16. volatile unsigned short AD_last; /* Last converted value */
    17. volatile unsigned char clock_1s; /* Flag activated each second */
    18. /* Import function for turning LEDs on or off */
    19. extern void LED_Out (unsigned int num);
    20. /*----------------------------------------------------------------------------
    21. A/D IRQ: Executed when A/D Conversion is done
    22. *----------------------------------------------------------------------------*/
    23. void ADC_IRQHandler(void) {
    24. unsigned int ADC_reg;
    25. ADC_reg = LPC_ADC->STAT; /* Read ADC status clears interrupt */
    26. ADC_reg = LPC_ADC->GDR; /* Read conversion result */
    27. AD_last = (ADC_reg >> 6) & 0x3FF; /* Store converted value */
    28. }

         3.编译通过图片

          4. 调试运行结果的图片

    4.1LED 灭

    2b5444a0379b46c2ac77ab2ad006626c.png

    4.2LED亮

     de9f16a3e059418e9bda545917334e52.png

    4.3波形图

           5.总结

           此实验利用系统节拍定时器SysTick实现定时1s,控制LPC1114微控制器的GPIO引脚PIO1_9状态反转(BLINKY指示灯闪烁,周期为2s)如此一直循环,实现LED灯闪烁

          🔥《嵌入式系统开发》系列专栏主要以LPC1100系列微控制器为硬件平台,详细介绍Cortex—-M0微控制器的原理与开发技术,基于keil仿真软件平台设计最小应用系统板和具有在板仿真器的口袋开发板以及相关例程。

          🔥本文已收录于嵌入式系统开发系列专栏:嵌入式系统开发 欢迎订阅,持续更新。

  • 相关阅读:
    Linux | 磁盘结构 | 文件系统认识 | inode | 软硬链接
    es 存储文档得大小_Elasticsearch的用例:文档存储
    Python的requests上传post数据块json
    为什么在使用PageHelper插件时,指定的每页记录数大小失效?显示所有的记录数
    Fastjson反序列化漏洞
    ESD静电电压监控系统的作用是什么
    Nmap(端口扫描工具)在Windows上的安装和使用,so easy
    三维跨孔电磁波CT数据可视化框架搭建
    发票查验API如何打破传统发票管理难题?
    Linux 利用 /proc 目录恢复误删除的文件
  • 原文地址:https://blog.csdn.net/m0_52474147/article/details/126691634