蜂鸟E203系列——定时器中断设计
时间:2022-07-22
本文章向大家介绍蜂鸟E203系列——定时器中断设计,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原理图
LED 原理图如下图所示,连接GPIO19,GPIO21,GPIO22。
源码
// 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 灯闪烁一次。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈PHP匿名函数和闭包
- Ubuntu 18.04上安装Apache、MySQL、PHP、LAMP的完整教程
- ubuntu18.04获取root权限并用root用户登录的实现
- Linux云服务器安装JDK和Tomcat的详细步骤(推荐)
- 浅析Linux下利用coredump技术追查进程崩溃原因
- Linux下rpm、yum和源码三种安装方式详细介绍
- linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境
- 帮助你排序文本文件的 Awk 命令行或脚本(推荐)
- Centos7备份文件时备份文件加入备件日期
- Linux traceroute命令使用详解
- Linux 添加开机启动方法(服务/脚本)
- 概述Linux TTY/PTS的区别
- 在 Linux 命令行发送邮件的 5 种方法(推荐)
- Linux下Jenkins忘记密码的操作步骤
- Linux系统下Tomcat使用80端口的方法