中科昊芯DSP_RISC-V笔记_点亮LED灯
1.功能描述:(1-2分)(1)系统时钟 系统时间不变是因为内部无倍频器电路
(2)DELAY_US(1000000)周期延时循环闪灯D401-GPATOGGLE
(3)按健控制亮灯D400
2.结合手册,说明GPIO寄存器控制原理P65图4-16(10分)
3.电路图:(5分)(1)D400一GPIO6D401-GPIO7(2)IO复用,方向控制0输入1输出
(3)按键输入GPIO34接地(5)LED低电平有效
4.程序逐句讲解,结合手册P62-P64(20分)手把手讲解,边写程序边讲解思路,
(1)gplo.c按键、LED的GPIO配置(5分)
(2)main.c系统时钟,中断,LED、按健的GPIO配置调用(15分)
while循环内执行:a.循环翻转闪灯D401 b.按键输入控制亮灯D400
5.测试LED闪灯15ms按键输入亮灯(5分)
介绍一下电路板
A组的GPIO寄存器
有数据寄存器和控制寄存器两类组成
GPAQSEL控制着噪声的滤波和采样周期的限制
GPAMUX控制着功能的复用
GPADIR控制着输入与输出
GPAPUD可以控制它的上拉翻转
GPADAT 控制一组引脚的置高或置低 或读取引脚数据
GPASET、GPACLEAR 强制制高和制低的指令
GPATOGGLE 强制翻转指令
GPAMUX1=00 普通的I/O口功能、GPAMUX1=01 EPWM功能 GPAMUX1=10 在O6和O7是 同步脉冲信号、SCI-A 信号
GPAMUX1=11 O1、O3 ADC 转换启动、O5捕获信号 O6同步脉冲信号 还有其他组可查阅手册的GPIOA MUX选择
通过这个表可以查看不同的GPIO MUX配置来实现不同的外设功能
使用采样窗口(GPxQSEL1/2=0,1 和 1,0)进行确认:在这种模式下,输入信号在与系 统时钟(SYSCLKOUT)同步后,在允许更改输入之前,通过指定的周期数进行确认。
采样周期由 GPxCTRL 寄存器中的 QUALPRD 位指定,可配置为 8 个信号组。它指定用于对
DSC2802x-DS-2021 年 1 月-修订-2021 年 11 月 62 / 79 输入信号进行采样的 SYSCLKOUT 周期的倍数。采样窗口为 3 个采样或 6 个采样宽,只有 当所有采样相同(所有 0 或所有 1)时,输出才会更改,如图 6-42 所示(对于 6 采样 模式)。
无同步(GPxQSEL1/2=1,1):此模式用于不需要同步的外设(同步在外设内执行)。 由于设备上需要多级复用,可能存在外围输入信号可以映射到多于一个 GPIO 管脚的情 况。另外,当没有选择输入信号时,根据外围设备的不同,输入信号将默认为 0 或 1 状态。
比如接flash或者接一些EEROM的不同步信号 外部器件传播速率慢,而内部的是传输速度很快的一个功能呢,只能是通过无同步去实现。
GPIO 复用模块连接示意图
电路原理图
LED部分
按键部分
Haawking-IDE软件打开,创建新工程
后面直接Next 直到完成加载即可
include "F2802x_Device.h"代码段介绍
包括CPU和其它外设的寄存器起始地址等信息,代码直到127行
中断服务函数,开启与关闭。还有包括中断的一些格式
包括所有外设头文件
#include "f2802x_examples.h"
工程文件的调用 代码介绍
主要是 CPU的倍频与分频的代码还有的是CPU的速率。目前该款芯片不支持倍频。
该工程设置的频率为
代码部分
通过配置,三个寄存器
GPAMUX1 0xD800 GPIO A MUX 1 寄存器(GPIO0 到 15)
GPADIR 0xD824 GPIOA 方向寄存器(GPIO0 到 31)
GPAPUD 0xD830 GPIO A 上拉禁用寄存器(GPIO0 到 31)
#include "dsc_config.h"
/******************************************************************
*函数名:void InitKEY()
*参 数:无
*返回值:无
*作 用:初始化独立IO口按键 SW-SPST
******************************************************************/
void InitKEY(void)
{
/*允许访问受保护的空间*/
EALLOW;
/*将GPIO12配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
/* //使能GPIO12内部上拉*/
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;
/*将GPIO12配置为输入*/
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
/*禁止访问受保护的空间*/
EDIS;
}
/******************************************************************
*函数名:void InitLED()
*参 数:无
*返回值:无
*作 用:初始化LED
******************************************************************/
void InitLED(void)
{
/*允许访问受保护的空间*/
EALLOW;
/*将GPIO16配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
/*将GPIO6配置为输出*/
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
/*将GPIO7配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;
/*将GPIO7配置为输出*/
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
/*禁止访问受保护的空间*/
EDIS;
}
EALLOW与EDIS究竟有什么含义呢?
通过跳转可以看到 两个定义的
#define EALLOW asm(“csrsi 0x7C1, 0x01”)
#define EDIS asm(“csrci 0x7C1, 0x01”)
DSP为了提高安全性能,将很多关键寄存器作了保护处理。允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等等。
DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行(“EALLOW”)在设置完寄存器之后,一定要注意执行(“EDIS”),来防止杂散代码或指针破坏寄存器内容。
IntOsc1Sel();//选择内部振荡器1作为时钟源(默认),关闭所有未使用的时钟
InitPll(DSP28_PLLCR,DSP28_DIVSEL);//设置倍频与分频信号
void IntOsc1Sel (void) {
EALLOW;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1; // Turn off XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1; // Turn off INTOSC2
EDIS;
}
GPADAT 0xD838 GPIO A 数据寄存器(GPIO0 到 31)
GPADAT 0xD838 GPIO A 数据寄存器(GPIO0 到 31)
GPACLEAR 0xD848 GPIO A 数据清除寄存器(GPIO0 到 31)
GPATOGGLE 0xD84C GPIO A 数据翻转寄存器(GPIO0 到 31)
#include "dsc_config.h"
#include <syscalls.h>
#include "IQmathLib.h"
extern void InitKEY(void);
extern void InitLED(void);
int main(void)
{
uint16_t cnt = 0;
/*初始化系统控制:PLL,WatchDog,使能外设时钟*/
InitSysCtrl();
/*将PIE控制寄存器初始化为默认状态,该状态禁止所有PIE中断并清除所有标志*/
InitPieCtrl();
/*禁止CPU中断并清除所有中断标志*/
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE向量表,为PIE向量表中的所有中断向量配置对应向量的入口地址*/
InitPieVectTable();
/*初始化KEY、LED*/
InitKEY();
InitLED();
while(1)
{
/*按键按下*/
if(GpioDataRegs.GPADAT.bit.GPIO12 == 0)
{
/*D400亮*/
GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;
}
else
{
/*松开按键D400灭*/
GpioDataRegs.GPASET.bit.GPIO7 = 1;
}
if(cnt == 500)
{
cnt = 0;
/*D401一直闪烁*/
GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1;
}
else
{
cnt++;
DELAY_US(1000);
}
}
return 0;
}
下载到开发版
由于这个下载器是免驱的
可以看到。 LED灯闪烁。
另外一个等待通过按键按下。 LED灯亮起。