中科昊芯DSP_RISC-V笔记(1)_点亮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灯亮起。
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢谢~谢先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值