首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DSP滴答时钟

DSP滴答时钟

本帖最后由 look_w 于 2017-9-23 15:40 编辑

操作平台和环境
  • DSP型号:TMS320C6713
  • 仿真器:XDS510PLUS
  • Flash型号:AM29LV800BT或AM29LV800BT都试过(一般接口一样,差别不大)
  • RAM型号:MT48LC16M16A2P(注意16位数据线接口)
  • DSP/BIOS库:V5.31.02
  • CSL库:(假定读者已经会使用了)
边写LED程序,边聊聊操作系统的滴答时钟在上篇文章的基础上,这里用用DSP/BIOS操作系统的CLK和PRD模块,这两个模块涉及到硬件定时器,我们使用仿真器先在RAM上将LED闪烁灯的程序调通。
CLK作用:片上定时器管理,学过ARM的都知道滴答时钟,CLK就是DSP操作系统的滴答时钟!
学过操作系统的也都知道(当然,像在现在的学校,学过操作系统都不知道的不在少数):操作系统必须要提供时基,才能实现调度!这个时基就是滴答时钟提供的(PC也不例外,也有时基)。
但C6713上没有专门的滴答时钟模块,因此是通过DSP上的通用定时器触发,其中断函数也就是Timer的中断函数,比如要设置滴答时钟为1ms,则其属性可以设置如下:

上面配置Timer0滴答时钟,注意哦,Microseconds表示us,Millisecond才表示ms!
从上面配置也可以看到,Timer0的CPU中断号(CPU Interrupt)是HWI_INT14,我们到HWI(硬件中断模块)下看看是不是,

在CLK中配置为滴答时钟的Timer,滴答中断函数(也是Timer0中断函数)也固定了,这里是CLK_F_isr,不可修改!
练习:试试在CLK中配置其它的Timer,再看看HWI中对应的硬件中断的变化?答案:CLK中配置的Timer与HWI中对应的Timer中断是关联的。好了,我们说回写LED程序,就写一个最简单的吧——让一个LED灯闪烁,使用滴答时钟定时,时间间隔为1s。
滴答时钟不是1ms吗?怎么实现1s的定时呢?这就还得了解一个模块——周期函数PDR。PDR的触发是基于滴答时钟周期的倍数,PRD是一种特殊的软件中断(可以查看SWI模块下,有一个PDR_swi的软中断),这点与CLK不同,CLK是硬件Timer中断实现的。

如上图所示,勾选上Use CLK Manager to drive PDR后,就是用CLK周期计数来触发PDR。我们插入一个PDR对象LedLink_PDR,配置属性如下,

滴答时钟CLK既然是1ms,Period表示经过的滴答时钟次数(ticks),因此LedLink_PDR的周期为1ms*1000 = 1000ms = 1s,这就达到了定时1s的目的。我们接着在.c文件中实现上面的(软)中断函数LedLink,
#include "bios_firstcfg.h"#include <csl.h>          // CSL 库头文件#include <csl_gpio.h>     // CSL 库的GPIO头文件static GPIO_Handle hGpio;int main(void){    CSL_init();    hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);    GPIO_reset(hGpio);    GPIO_pinEnable(hGpio,GPIO_PIN3);    GPIO_pinDirection(hGpio,GPIO_PIN3,GPIO_OUTPUT);    GPIO_pinWrite(hGpio,GPIO_PIN3,0);    LOG_enable(&trace);    LOG_printf(&trace, "Hello DSP/BIOS %d.", 0);     return 0;} void LedLink(void){    static Uint16 i =0;    i = (i + 1) & 0x01;    GPIO_pinWrite(hGpio,GPIO_PIN3, i);}搭建基本的BIOS工程基于上篇文章DSP-BIOS使用入门,func_task0、func_task1和swi_adc都是上篇文章中的在DSP/BIOS中使用任务和软中断的例程,这里其实没什么用,暂且不管。
要在硬件上跑,一定要在Global Setting中设置好,

另外硬件上——我的板子上GPIO_PIN3连接着LED,低电平点亮!cmd文件都是DSP/BIOS配置文件自动配置好了,不用管了暂时。挂上仿真器,下载到板子的RAM上运行!OK,成功!
DSP/BIOS操作系统启动过程其实在上一篇中已经讲过DSP/BIOS的启动过程,这里不妨再唠叨一下:
  • 系统上电复位,从Flash装载完程序后,首先从C/C++环境入口_c_int00开始执行
  • 利用.cinit记录初始化.bss段
  • 调用BIOS_init初始化用到的各个模块
  • 处理.pinit表,如C++中的全局对象的构造函数就在这个时候执行
  • 进入main函数执行
  • main函数返回,调用BIOS_start启动DSP/BIOS操作系统
其实除了其中第1步对我们烧写Flash有指导意义外,其它各步骤都是无关紧要的(当然,仅就这里讨论的问题而言)。基于此,这里烧写Flash的思路就是:在系统复位后,程序跳转到_c_init00之前,写一段从Flash拷贝应用程序到内存的代码就好了!
返回列表