前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蜂鸟E203系列——定时器中断设计

蜂鸟E203系列——定时器中断设计

作者头像
瓜大三哥
发布2020-07-20 15:45:13
1K0
发布2020-07-20 15:45:13
举报
文章被收录于专栏:瓜大三哥瓜大三哥

原理图

LED 原理图如下图所示,连接GPIO19,GPIO21,GPIO22。

源码

代码语言:javascript
复制
// See LICENSE for license details.

#include <stdio.h>
#include <stdlib.h>
#include "platform.h"
#include <string.h>
#include "plic/plic_driver.h"
#include "encoding.h"
#include <unistd.h>
#include "stdatomic.h"

//计时器中断处理函数
void handle_m_time_interrupt(){

  clear_csr(mie, MIE_MTIE);

  // Reset the timer for 3s in the future.
  // This also clears the existing timer interrupt.

  volatile uint64_t * mtime       = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME);
  volatile uint64_t * mtimecmp    = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP);
  uint64_t now = *mtime;
  uint64_t then = now + 1 * RTC_FREQ;
  *mtimecmp = then;


  GPIO_REG(GPIO_OUTPUT_VAL) ^= (0x1 << RED_LED_GPIO_OFFSET);
  GPIO_REG(GPIO_OUTPUT_VAL) ^= (0x1 << GREEN_LED_GPIO_OFFSET);
  GPIO_REG(GPIO_OUTPUT_VAL) ^= (0x1 << BLUE_LED_GPIO_OFFSET);

  // Re-enable the timer interrupt.
  set_csr(mie, MIE_MTIE);

}


//计时器初始化

void setup_mtime (){

    // Set the machine timer to go off in 3 seconds.
    // The
    volatile uint64_t * mtime       = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME);
    volatile uint64_t * mtimecmp    = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP);
    uint64_t now = *mtime;
    uint64_t then = now + 10 * RTC_FREQ;
    *mtimecmp = then;

}

int main(int argc, char **argv)
{

//关闭GPIO的输入使能
  GPIO_REG(GPIO_INPUT_EN)    &= ~((0x1<< RED_LED_GPIO_OFFSET) | (0x1<< GREEN_LED_GPIO_OFFSET) | (0x1 << BLUE_LED_GPIO_OFFSET)) ;

  //打开GPIO的输出使能:三个颜色的LED灯
  GPIO_REG(GPIO_OUTPUT_EN)   |=  ((0x1<< RED_LED_GPIO_OFFSET)| (0x1<< GREEN_LED_GPIO_OFFSET) | (0x1 << BLUE_LED_GPIO_OFFSET)) ;


  //设置GPIO的输出值
  GPIO_REG(GPIO_OUTPUT_VAL)  |=   (0x1 << RED_LED_GPIO_OFFSET) ;
  GPIO_REG(GPIO_OUTPUT_VAL)  |=   (0x1 << GREEN_LED_GPIO_OFFSET) ;
  GPIO_REG(GPIO_OUTPUT_VAL)  |=   (0x1 << BLUE_LED_GPIO_OFFSET) ;



//关闭计时器中断局部使能
  clear_csr(mie, MIE_MTIE);

//计时器初始化
  setup_mtime();

  //打开计时器中断局部使能
  set_csr(mie, MIE_MTIE);
  //打开中断的全局使能
  set_csr(mstatus, MSTATUS_MIE);



  return 0;

}

实验结果

每间隔 1 秒,可以看到 LED 灯闪烁一次。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理图
  • 源码
  • 实验结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档