DSP283x系列,裸机程序移植到SYS/BIOS系统中操作流程、注意点、中断配置

8 篇文章 1 订阅
8 篇文章 24 订阅

DSP裸机程序以及SYS/BIOS操作系统

所谓裸机程序:
当我们在进行DSP开发的时候,比如在买开发板时所提供的一些例程。比如FLASH、ram配置GPIO使用,
各种总线中断的使用等等。一般提供的例程都差不多如下所示:

void main(void)
{
    InitSysCtrl();
    InitGpio();
    GPIO_SetupPinMux(0, GPIO_MUX_CPU1, 0);
    GPIO_SetupPinOptions(0, GPIO_OUTPUT, GPIO_PUSHPULL);
    GPIO_SetupPinMux(1, GPIO_MUX_CPU1, 0);
    GPIO_SetupPinOptions(1, GPIO_OUTPUT, GPIO_PUSHPULL);
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    EINT;  // Enable Global interrupt INTM
    ERTM;  // Enable Global realtime interrupt DBGM
    for(;;)
    {
    	GPIO_WritePin(0, 0);
    	GPIO_WritePin(1, 1);
    	DELAY_US(1000*500);
    	GPIO_WritePin(0, 1);
    	GPIO_WritePin(1, 0);
    	DELAY_US(1000*500);
    }
}

主函数就基本上是上面的这个样子,首先系统进行初始化,pll、看门狗,外设时钟、flash等。接下来就是一些GPIO的配置上拉、下拉、推挽等。
DINT 关中断 EINT 使能中断,两者之间的代码就是对整个程序所要用到的中断进行初始化以及配置,包括中断寄存器的状态,中断向量表的配置,并且将我们定义的中断函数与中断触发链接在一起。以保证在外部中断触发时,程序能够进入到我们所希望的中断函数当中。当所有的初始化完成之后,系统就会一直去运行这个 for 循环了。这是比较典型的一个点亮LED的裸机的例程。

所谓的 SYS/BIOS :
类似于现在的freeRTOS ,UCOS2|3 等等。就是操作系统提供了一个框架,在框架下可以创建多线程,

void main()
{
	Task_Handle task;
    Error_Block eb;
    Error_init(&eb);
	task = Task_create(taskFxn1, NULL, &eb);
	task = Task_create(taskFxn2, NULL, &eb);
	BIOS_start();
}
void taskFxn1(){
	int a=0;
	while(1){
		a++;
		Task_sleep(1000);
	}
}
void taskFxn2(){
	int b=0;
	while(1){
		b++;
		Task_sleep(2);
	}
}

代码在运行之后就会在 taskFxn1 和taskFxn2 的两个while{ 。。}之间来回运行, taskFxn1 每1秒运行一次,
taskFxn2每2ms运行一次,其他时间都在运行空闲函数。当然这只是一个间的例子,两个函数我们可以按照自己的意愿进行配置。
比如我们原先的裸机程序需要不停接收外界数据并进行计算,并且需要实时检测一个外设当前状态(例如温度)是否正常。这个时候我们按照自己的需要比如计算的频率很快,但是检测状态的话每0.5s检测一次就足够了。这个时候我们就可以利用BIOS来进行处理。当然裸机完成这些功能也是绰绰有余。不过BIOS还提供了很多其他的功能,而且SYSBIOS所占的代码量资源很小。因而还是大有其可取之处。

代码的移植

首先我们以 TMSF28377S为例,先创建一个 SYSBIOS的工程。打开ti resource explore 。
我们需要安装ti的sysbios ware(类似于c2000 ware),上面提供一些例程;该软件包可以从官网下载;
一般在安装较高版本的ccs的时候,默认都是直接安装的;
打开resource explore
选择我们需要的型号,我这里是 TMSF28377S
搜
然后创建一个taskmutex的例程。
在这里插入图片描述

至此我们一个 BIOS的例程已经创建好了。
我们将裸机中的程序移植到BIOS中时,需要执行一些系统的初始化,底层的配置。比如:
InitSysCtrl();
InitGpio();
这些函数。但是需要我们注意的是 ti 提供的BIOS对于一些底层的配置是已经做过处理的,有的配置不需要我们去处理。我们首先看一下bios工程中的 .cfg 静态配置文件。
在这里插入图片描述

点击system OVERVIEW -->boot

在这里插入图片描述

点击如下图所示的add F2837x Boot Management to my config,并且需要配置PLL。根据自己的板子型号配置。至此我们看出,SYS/BIOS操作系统帮我们将 PLL是已经配置好了的,当然我们也可以将 Config PLL and CPU clock drivers 选框取消,自己配置。

在这里插入图片描述

然后我们保存完,再对我们需要用到的外设中断进行配置。我们点击 SYS/BIOS中的 Hwi 配置外部中断。勾选住 Add 的选框。我们看红色圈中的描述。The Hwi module provides a portable interface to define and synchronize with hardware interrupt service routines. Application code that restricts itself to using this
module for hardware interrupt synchronization can be used without change in any SYS/BIOS supported system。 这告诉我们,为了能够让 SYS/BIOS正常运行。我们在编写应用层代码时,不允许去配置中断模块的代码。这部分 SYS/BIOS 也是已经帮我们配置好了的。

在这里插入图片描述

至此,我们在进行主函数编写时如下:
在这里插入图片描述

其中allSysInitial()函数如下,执行了裸机程序运行所需要处理的一些功能。对于PLL 以及中断的配置函数,我们直接将其删除即可。
在这里插入图片描述

SYS/BIOS中中断函数如何创建

void InterruptConfig_BIOS( void )
{
    // 动态创建硬件中断,PIE 外设中断
    Hwi_Handle hwiScia;
    Hwi_Handle hwiScic;
    Hwi_Handle hwiSpib;
    Hwi_Handle hwiXINT1;

    Hwi_Params hwiParams;
    Error_Block eb;
    Error_init(&eb);
    // 使用默认值初始化参数
    Hwi_Params_init(&hwiParams);
    // 中断事件参考  2837X 技术参考手册  PIE 中断映射
    //hwiParams.eventId = IDXXX;
    // 传递到中断服务函数的参数
    hwiParams.arg = 0;
    // 不允许该中断自身嵌套
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
    // 使能中断
    hwiParams.enableInt = true;
    // 可屏蔽中断 4
    // 中断服务函数 hwiMain
    hwiScia = Hwi_create(96, sciaRxFifoIsr_BIOS, &hwiParams, &eb);   //PIE映射表 9 行  1 列
    if (hwiScia == NULL)
    {
        System_abort("hwiScia create failed");
    }
    hwiScic = Hwi_create(92, scicRxFifoIsr_BIOS, &hwiParams, &eb);   //PIE映射表 8 行  5 列
    if (hwiScic == NULL)
    {
        System_abort("hwiScic create failed");
    }
    hwiSpib = Hwi_create(74, spibRxFifoIsr_BIOS, &hwiParams, &eb);   //PIE映射表 6 行  3 列
    if (hwiSpib == NULL)
    {
        System_abort("hwiSpib create failed");
    }
    hwiCanA0 = Hwi_create(100, cana_Isr_BIOS, &hwiParams, &eb);   //PIE映射表 9 行 5 列
    if (hwiCanA0 == NULL)
    {
        System_abort("hwiCanA0 create failed");
    }
    hwiXINT1 = Hwi_create(35, xint1_isr_BIOS, &hwiParams, &eb);   //PIE映射表 1 行 5 列
    if (hwiXINT1 == NULL)
    {
        System_abort("hwiXINT1 create failed");
    }
}

基本上创建的代码是如上所示。对于函数 Hwi_create(100, cana_Isr_BIOS, &hwiParams, &eb);其中第一个参数时中断编号,第二个参数是中断触发时进入的中断函数,第三第四个参数默认即可;其中需要注意的是当中
第一个参数的值的确定。 SYS/BIOS帮我们将中断配置好后。我们需要根据具体的芯片型号去查找用户参考手册。我们可以找到芯片对应的 PIE 外设中断通道映射。我猜想的话是TI应该有相关的头文件对这个编号参数的宏定义不过我暂时没有找到,因此这边的话我们是通过芯片手册查找,然后自己写;

在这里插入图片描述
在这里插入图片描述

比如上面的 Hwi_create(100, cana_Isr_BIOS, &hwiParams, &eb);我们使用到CAN总线中断,使用的是 CANA_0,a0号的can总线查表为第9组的第5分支。那么对应的中断号为 100.然后我们就在 Hwi_create(。。。)的第一个参数中设置 100。那么中断函数
void cana_Isr_BIOS(void)
{
。。。。
}
就和我外设的 CAN口链接起来了。当外设 CAN口发送数据起了中断时,就可以进入到我们的中断函数中执行。执行完之后不要忘记清除中断状态,以便下一次中断可以触发。

好了,零散就说这么多。网上相关资源较难找比较头大。我也是摸索了一段时间完成了工作上的程序移植。 希望可以为大家提供一些参考。有问题一起交流。

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ah_yl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值