在ARDUINO中使用定时器中断

[复制链接]
 楼主| gaoyang9992006 发表于 2023-6-30 22:15 | 显示全部楼层 |阅读模式

  1. #define LED_D4 12
  2. #define LED_D5 13
  3. #define BUTTON_BOOT 9
  4. volatile bool ledState =false;
  5. void timerISR()
  6. {
  7.   ledState = !ledState;
  8.   digitalWrite(LED_D4, ledState);
  9. }
  10. hw_timer_t* timer = NULL;
  11. // the setup function runs once when you press reset or power the board
  12. void setup()
  13. {
  14.   // initialize digital pin LED_BUILTIN as an output.
  15.   pinMode(LED_D4, OUTPUT);
  16.   pinMode(LED_D5, OUTPUT);
  17.   digitalWrite(LED_D4, 0);  
  18.   digitalWrite(LED_D5, 0);
  19. //  pinMode(BUTTON_BOOT, INPUT);

  20.   timer = timerBegin(0, 80, true);
  21.   timerAttachInterrupt(timer, &timerISR, true);
  22.   timerAlarmWrite(timer, 1000000, true);
  23.   timerAlarmEnable(timer);
  24. }

  25. // the loop function runs over and over again forever
  26. void loop()
  27. {
  28.   // digitalWrite(LED_D4, HIGH);  // turn the LED on (HIGH is the voltage level)
  29.   // delay(1000);                 // wait for a second
  30.   // digitalWrite(LED_D4, LOW);   // turn the LED off by making the voltage LOW
  31.   // delay(1000);                 // wait for a second

  32.   // if(digitalRead(BUTTON_BOOT)==0)
  33.   // {
  34.   //   digitalWrite(LED_D5, 0);
  35.   // }
  36.   // else
  37.   // {
  38.   //   digitalWrite(LED_D5, 1);
  39.   // }
  40. }


 楼主| gaoyang9992006 发表于 2023-6-30 22:16 | 显示全部楼层
  1. #include <Arduino.h>

  2. #define LED_D4 12

  3. volatile bool ledState = false; // LED状态标志

  4. // 中断服务程序
  5. void timerISR()
  6. {
  7.   ledState = !ledState; // 切换LED状态
  8.   digitalWrite(LED_D4, ledState); // 设置LED状态
  9. }

  10. // 将定时器中断服务程序注册到中断向量表
  11. hw_timer_t* timer = NULL;
  12. void setupInterrupt()
  13. {
  14.   timer = timerBegin(0, 80, true); // 使用定时器0,预分频器为80,计数上升沿触发
  15.   timerAttachInterrupt(timer, &timerISR, true); // 将中断服务程序绑定到定时器
  16.   timerAlarmWrite(timer, 1000000, true); // 设置定时器报警值为1000000,对应1秒的计时周期
  17.   timerAlarmEnable(timer); // 启用定时器报警
  18. }

  19. void setup()
  20. {
  21.   pinMode(LED_D4, OUTPUT); // 设置LED引脚为输出模式
  22.   setupInterrupt(); // 配置定时器中断
  23. }

  24. void loop()
  25. {
  26.   // 主程序代码
  27. }
定时器中断服务程序timerISR()被定义为独立的函数,并在setupInterrupt()中将其注册到定时器中断向量表中。这样,在定时器中断触发时,会自动执行timerISR()函数切换LED状态。
田舍郎 发表于 2023-6-30 23:08 来自手机 | 显示全部楼层
学习一下
 楼主| gaoyang9992006 发表于 2023-7-1 19:35 | 显示全部楼层

我了个去,我自己写的学习笔记藏这么深的板块还有人看?
那我改天写个Aruduino I2C和SPI通信接口的教程。
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部