TD工程介绍
我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展,可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容,只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可,主要修我以为都是在FD工程进行修改即可。
FD工程介绍
这个工程我们主要演示了如何使用UART及UART中断,如何使用定时器中断,以及如何使用GPIO和GPIO中断。
FD工程导入
打开FD选择workspace为 demo_riscv\wkspace 就会自动导入该workspace下的所有项目。
由于你的FD的目录与我的FD目录不在同一个位置,会导致编译器工具链的找不着,我们需要在工程上右键选择Reset Project Toolchain,
执行完这个操作就FD会重新修正工程的工具链配置。
FD工程源代码分析
头文件、宏定义及全局变量介绍
头文件
#include "core.h" // 核心头文件
//#define USE_MTIME // 不使用MTIME
#include "uart.h" // UART 头文件
#include "gpio.h" // GPIO 头文件
#include "anl_printf.h" // 打印库头文件
#include "interrupt.h" // 中断库头文件
#ifdef USE_MTIME
#include "mtime.h" // 如果使用 MTIME,则引入 MTIME 头文件
#else
#include "systick.h" // 否则引入 SysTick 头文件
#endif
-
#include "core.h"
:这个头文件是系统的核心头文件,通常包含了与硬件相关的低级别配置和宏定义。它可能包含了处理器寄存器的定义、中断控制器配置等内容。 -
#include "uart.h"
:这个头文件包含了 UART(通用异步收发传输)相关的函数声明和宏定义。 -
#include "gpio.h"
:这个头文件包含了 GPIO(通用输入输出)相关的函数声明和宏定义。 -
#include "anl_printf.h"
:这个头文件包含了打印函数的声明和定义。 -
#include "interrupt.h"
:这个头文件包含了中断控制器相关的函数声明和宏定义。 -
#ifdef USE_MTIME
:这是一个条件编译指令,用于根据是否定义了USE_MTIME
宏来选择性地包含不同的头文件内容。 -
#include "mtime.h"
:如果定义了USE_MTIME
宏,就会包含这个头文件。它可能包含了 MTIME(Machine Timer)相关的函数声明和宏定义,用于配置和操作处理器的计时器。 -
#include "systick.h"
:如果没有定义USE_MTIME
宏,就会包含这个头文件。它可能包含了 SysTick 定时器相关的函数声明和宏定义,用于配置和操作 SysTick 定时器。 - Systick 和 MTIME 定时器的区别主要是其资源占用和操作模式。 Systick 是一个自动重装的 30bit 定时器,用户需要使用 SetSystickCfg()函数启用定时器,并在定时器中断处理程序中使用 ClrSystickInt()函数清除掉挂起的定时器状态对于 MTIME 定时器而言,它的初始化和中断响应都是使用 SetMtimeCmp()函数将下一时钟节拍的计数值装入定时器比较值中。
全局变量sys_banner
static char sys_banner[] = {"- Anlogic eMCU buildtime [" __TIME__" " __DATE__ "] " "rev 1.0 \r\n"};
这行代码定义了一个静态字符数组 sys_banner
,用于存储系统的横幅信息。该信息包含了编译时间和日期,以及版本号。
__TIME__
&#x