最近在学习DSP28335芯片,然后在使用PSIM仿真软件时发现这个仿真软件也支持28335芯片,于是就想学习下如何在PSIM软件中使用DSP28335芯片。在PSIM自带的官方示例中有使用DSP28335芯片的相关例子。
工程下载链接 https://download.csdn.net/download/qq_20222919/88770386
PSIM仿真的官方示例在安装目录下examples文件夹中,其中28335芯片的相关示例在examples\Code Generation\F2833x Target 文件夹中。我这里PSIM的版本安装的是2022版。
不过官方的这些例子看起来有些复杂,对于初学者来说,要看懂很不容易。于是想在网上找一个简单一些的入门例子,结果找了一圈也没找到。看来只能靠自己了,经过一番摸索,终于成功点亮了LED灯。
下面将我的方法分享给大家。
开发板使用的是普中科技的
想要实现的功能就是让板子上的这几个LED灯闪烁。首先要确定LED灯的端口是哪几个IO口。
直接在开发板原理图中查看LED端口。
通过原理图可以看到LED使用的IO口是GPIO64/65/66/67/68,暂时先用这5个LED,最后两个先不用。
确定好IO口之后,下面开始使用PSIM仿真软件搭建仿真电路。新建一个PSIM仿真文件。
然后在菜单栏选择仿真—仿真控制
此时会出现一个钟表一样的图标,将这个图标放在仿真文件中。
双击这个图标,打开仿真设置。
第一个选项使用默认设置就行,点到第三个选项。
在SimCoder选项中设置硬件目标,这里设置为F28335。接下来设置时钟频率,菜单栏中选择 元件—SimCoder—F2833x目标—DSP时钟。这个选项在倒数第二个,选择的时候要用鼠标将选项页面一直往下拉才能看见。
将这个DSP时钟放置在页面上。
时钟的默认设置是外面晶振30MHz,DSP工作时钟为150MHz,和我的开发板设置一样,所以这里使用默认的就行。
接下来设置IO口,菜单栏中选择 元件—SimCoder—F2833x目标—硬件结构设置。
将硬件配置这个图标放在图纸上,然后双击打开。
这个模块就是配置每个IO口功能的,相当于IO口的初始化。
这里需要配置的IO口就是 GPIO64/65/66/67/68
将这个几个口设置为输出口,设置完成之后需要点击右上角的锁定按钮。
点击锁定之后,配置的IO口才能生效,此时锁定按钮就变成了解锁按钮。如果需要修改IO口,需要先解锁才能修改。
接下来好需要放置IO口输出模块。菜单栏中选择 元件—SimCoder—F2833x目标—数字输出。
将数字输出模块放置在界面上,然后双击打开模块,选择每个端口需要输出的IO口。
将端口D0–D4分别设置为GPIO64–GPIO68
接下来给IO口设置输出信号,想让LED按照10Hz的频率闪烁,要产生这个10Hz的信号,就需要使用一个方波发生器。
放置一个方波发生器,然后将一端接地,这个方波产生的信号不能直接北28335使用,还需要在方波发生器和IO模块之间接一个 零阶保持器。
菜单栏选择 元件—控制电路—数字控制模块— 零阶保持器
接下来开始连线,将方波的信号连接到零阶保持器输入端,然后零阶保持器输出端接F28335输出模块的左端。
然后将D1到D4口都连接到D0口上,让这几个口的信号一样,然后将没有用到的D5—D7接地,
接下来设置方波发生器的频率,双击方波发生器,将频率设置为10。
接下来就可以查看波形了,给输入输出信号分别放置电压探头。
下面点击仿真按钮,开始仿真。
将输入输出波形都添加进去
此时的波形中为什么看不到方波?
由于方波发生器的频率设置的非常低,只有10Hz,而仿真时间设置的比较短,只有10ms,所以看不到波形,将仿真文件中的钟表图标双击打开,将仿真时间修改为1秒。
接着继续仿真,查看波形。
这时候就能看到方波了,下面就剩最后一步了,开始生成代码。
保存仿真文件到指定的文件夹中,文件夹命名最好不要带中文,因为一会要通过CCS软件直接打开生成的工程。
然后再菜单栏点 仿真—生成代码
代码生成完之后,就会自动切换到生成的代码界面。
这时候在文件夹中就生成一个工程
打开这工程的文件夹,可以看到生成的文件。
下面就可以使用CCS直接打开这个工程了,打开CCS软件
菜单栏中选择 Project — Import Legacy SSCv3.3 Projects 使用3.3版本导入刚才新建的文件
再打开的界面中点Browse按钮,打开刚才生成工程。
工程的后缀名为*.pjt
单击Next
然后单击Finish
这时候工程就打开了
下面还需要对工程进行配置,在工程上右键,选择New—Target Configuration File
将配置文件名称修改为led
接下来设置仿真器型号和单片机型号,点右边的Save按钮保存。
下面编译工程
编译成功通过,最后就是见证奇迹的时刻了。直接点debug按钮,将代码下载到开发板RAM中运行。
在开发板上可以看到5个LED灯在闪
通过示波器查看LED波形
波形的频率为10Hz,和PSIM仿真软件里面设置的一样。
可以看看通过PSIM生成的代码
/*********************************************************************************
// This code is created by SimCoder Version 2022c0.16 for F2833x Hardware Target
//
// SimCoder is copyright by Powersim Inc., 2009-2021
//
// Date: January 22, 2024 17:31:39
**********************************************************************************/
#include <math.h>
#include "PS_bios.h"
typedef float DefaultType;
#define GetCurTime() PS_GetSysTimer()
#define iif(a, b, c) ((a) ? (b) : (c))
#define PWM_IN_CHECK // To lower PWM value setting time, comment out this line if PWM duty cycle values are strictly limited in the range.
interrupt void Task();
const Uint16 PSD_CpuClock = 150; // MHz
extern DefaultType fGblVin;
DefaultType fGblVin = 0;
interrupt void Task()
{
DefaultType fZOH1, fVSQ1;
PS_MaskIntr(M__INT13);
{
static DefaultType wt = 1.0 - ((-90) / 360.);
static DefaultType dwt = 10 * 1.0 / 1000;
fVSQ1 = (wt < 0.5) ? ((1) + (0)) : (0);
wt += dwt;
if (wt >= 1.0)
wt -= 1.0;
}
fZOH1 = fVSQ1;
#ifdef _DEBUG
fGblVin = fZOH1;
#endif
(fZOH1 == 0) ? PS_ClearDigitOutBitC((Uint32)1 << (64 - 64)) : PS_SetDigitOutBitC((Uint32)1 << (64 - 64));
(fZOH1 == 0) ? PS_ClearDigitOutBitC((Uint32)1 << (65 - 64)) : PS_SetDigitOutBitC((Uint32)1 << (65 - 64));
(fZOH1 == 0) ? PS_ClearDigitOutBitC((Uint32)1 << (66 - 64)) : PS_SetDigitOutBitC((Uint32)1 << (66 - 64));
(fZOH1 == 0) ? PS_ClearDigitOutBitC((Uint32)1 << (67 - 64)) : PS_SetDigitOutBitC((Uint32)1 << (67 - 64));
(fZOH1 == 0) ? PS_ClearDigitOutBitC((Uint32)1 << (68 - 64)) : PS_SetDigitOutBitC((Uint32)1 << (68 - 64));
PS_ExitTimer1Intr();
}
void Initialize(void)
{
PS_SysInit(30, 10);
PS_InitTimer(0, 0);
// Set initial states for those GPIO/AIO output ports.
PS_ClearDigitOutBitC((Uint32)1 << 0); // Reset GPIO64
PS_ClearDigitOutBitC((Uint32)1 << 1); // Reset GPIO65
PS_ClearDigitOutBitC((Uint32)1 << 2); // Reset GPIO66
PS_ClearDigitOutBitC((Uint32)1 << 3); // Reset GPIO67
PS_ClearDigitOutBitC((Uint32)1 << 4); // Reset GPIO68
PS_InitDigitOut(64);
PS_InitDigitOut(65);
PS_InitDigitOut(66);
PS_InitDigitOut(67);
PS_InitDigitOut(68);
PS_InitTimer(1,150000L);
PS_SetTimerIntrVector(1, Task);
PS_StartStopPwmClock(2); // start Timer1
}
void main()
{
Initialize();
PS_EnableIntr(); // Enable Global interrupt INTM
PS_EnableDbgm();
for (;;) {
}
}
通过定时器生成中断,然后再中断中对相应的IO口设置高低电平来控制LED闪烁。可以看出,通过PSIM生成的代码格式,和自己写的代码差别还是挺大的。