This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/MSP432P401R:Hwi 创建错误。

Guru**** 2524460 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/593923/rtos-msp432p401r-hwi-create-error

器件型号:MSP432P401R
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我正在与 TI RTOS 合作以实现以下目标、启动 ADC 转换、将结果转换为50到90之间、并使用 printf 进行显示。  我想使用 ADC14的中断来触发 hwi1Fxn、但我不断得到错误。

[Cortex_M4_0]正在初始化
TI.SYSBIOS.family.ARM.m3/Hwi:第143行:E_ALREADYDefinited:Hwi 已定义:INTR# 24
Hwi 创建失败

当首次开始调试时、在 main 暂停之后、查看 ROV 中的 Hwi 模块、函数 ti_sysbios_family_arm_msp432_Timer_periodicStub__E 已经具有 intNum 24。  我在主题 e2e.ti.com/.../1604590中看到了类似的问题 、但 这无法解决我的问题。

代码如下所示。  Hwi_create 发生错误。  我的问题是、MSP432P401R 上的 ADC14的中断编号是什么?已经用中断编号24创建了什么 hwi?

//
*版权所有(c) 2015,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//

/*
=== empty.c ======
//
//* XDCtools 头文件*/
#include 
#include 
#include 
#include "msp.h"
#include "Nokia5110.h"

/* BIOS 头文件*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/* TI-RTOS 头文件*/
#include 
#include 
//#include 
//#include 
//#include 
//#include 
//#include 
//#include 

/*板头文件*/
#include "Board.h"

#define TASKSTACKSIZE 568
#define TIMEOUT 1000

//全局变量*/
uint16_t RAW;
uint16_t tempf;
uint16_t newtempf;

Timer_handle 计时器;
Swi_handle swi;
Task_handle Task1、task2;
Event_handle EVENT1、event2;
Clock_handle clk;
Clock_Structt clkStruct;
Hwi_handle hwi;
ADC_Handle ADC;


//此处为计时器中断*/
void hwiFxn (UArg arg)
{
GPIO_TOGGLE (Board_LED1);
Swi_post (swi);
}

//此处为 ADC 中断*
/ void hwi1Fxn (UArg arg)
{
RAW = ADC14->MEM[0];
}//* Swi

线程处理计时器中断*/
void swifxn (UArg arg1、UArg arg2)
{
if (~(ADC14->CTL0 && ADC14_CTL0_BUSY)//检查是否不忙
{
RAW = ADC14->MEM[0];
EVENT_POST (EVENT1、EVENT_ID_01);
ADC14->CTL0 |= ADC14_CTL0_SC;
}

}

//任务待处理 EVENT1 */
空任务1Fxn (UARg arg1、UARg arg2)
{
for (;;)
{
UINT posted1;

posted1 = Event_pend (EVENT1、Event_ID_NONE、Event_ID_01、BIOS_WAIT_FOREVE);
if (posted1!= 0)
{
newtempf =((float) raw/0x3fff)*40+50;//scale value to 50-90 deg。 F
if (tempf!= newtempf)
{
tempf = newtempf;
EVENT_POST (event2、Event_ID_01);//通知可用的设定点值
}
}
system_flush();
}
}

//任务挂起事件2 */
空任务2Fxn (UARg arg1、UARg arg2)
{
for (;;)
{
UINT posted2;
UINT key1、key2;

posted2 = Event_pend (event2、Event_ID_none、Event_ID_01、BIOS_Wait_Forever);
if (posted2!= 1)
{
key1 = Swi_disable();
key2 = Hwi_disable();

System_printf ("SETPT.:%u F\n"、newtempf);
Nokia5110_SetCursor (7、1);
Nokia5110_OutUDec (tempf);

Swi_restore (key1);
Hwi_restore (key2);
}
system_flush();
}
}

void clkFxn (UArg_arg)
{

}

/*
==== main ====
*/
int main (void)
{
ADC14->CTL0 = ADC14_CTL0_ON |ADC14_CTL0_SHT0_2 | ADC14_CTL0_SHP;
ADC14->CTL1 = ADC14_CTL1_RES_14BIT; //14位分辨率
ADC14->MCTL[0]|= ADC14_MCTLN_INCH_0; //A0 MEM[0]
//ADC14->IER0 |= ADC14_IER0_IE1; //中断使能
ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC;

Timer_Params timerParams;
Task_Params taskParams;
Swi_Parswams Params;
Clock_Params clkParams;
Hwi_Params HwiParams;
ERROR_Block EB;
// adc_params adcparams;

ERROR_INIT (&EB);
Timer_Params_init (&timerParams);
Task_Params_init (&taskParams);

/*调用初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initadc();
Nokia5110_Init();

Nokia5110_clear();
Nokia5110_OutString ("SETPT.:F");

System_printf ("正在初始化\n");
system_flush();

/*创建 ADC 实例*/
/* adc_Params_init (&adcparams);
ADC = ADC_open (Board_ADC0、&adcparams);
if (ADC == NULL){
system_abort ("初始化 ADC 通道0\n"\n 时出错);
}
否则{
system_printf ("ADC 通道0已初始化\n");
}
*
/*创建 Swi、默认优先级为15 */
/* Swi 处理程序是'swiFxn'、作为 Swi 线程运行。 *
Swi_Params_init (&swiParams);
swiParams.arg0 = 0;
swiParams.arg1 = 0;
swiParams.priority = 1;
swiParams.trigger = 1;
Swi = Swi_create (&swiFxn、&swiParams、&EB);
如果(swi =NULL)
{
system_abort ("Swi 创建失败");
}

/*创建作为任务线程运行的任务1和任务2。 *
Task_Params_init (&taskParams);
taskParams.priority = 2;
任务1 = Task_create (&task1Fxn、&taskParams、&EB);
if (任务1 ==空)
{
System_abort ("任务1创建失败");
}
taskParams.priority = 1;
task2 = Task_create (&task2Fxn、&taskParams、&EB);
if (task2 ==空)
{
System_abort ("任务2创建失败");
}

/*为要在*/上挂起的任务创建 EVENT1和事件2
EVENT1 = Event_create (NULL、&EB);
if (EVENT1 ==空)
{
System_abort ("事件1创建失败");
}
event2 = Event_create (NULL、&EB);
if (event2 == NULL)
{
System_abort ("事件2创建失败");
}

/*将时钟设置为每2个计时器中断关闭一次*/
Clock_Params_init (clkParams);
clkParams.period = 2;
clkParams.startFlag = true;

CLK = Clock_create (&clkFxn、2、&clkParams、&EB);
if (clk == NULL){
system_abort ("时钟创建失败");
}

/*将计时器配置为0.5s 中断周期*/
timerParams.period = 50000;
定时器= Timer_create (Timer_any、&hwiFxn、&timerParams、&EB);
如果(定时器== NULL)
{
System_abort ("计时器创建失败");
}

/*配置 HWI */
Hwi_Params_init (hwiParams);
hwiParams.arg = 1;
hwiParams.EventID = 24;//ADC 中断编号
hwiParams.maskSetting = Hwi_MaskingOption_self;
Hwi = Hwi_create (24、Hwi1Fxn、HwiParams、&EB);
if (hwi ==空)
{
system_abort ("HWI create failed");
}
//此代码段不成功。 用户手册的 ADC 中断为24、但定时器或时钟节拍使用24

System_printf ("正在启动 Lab6v2\n");
system_flush();

/*启动 BIOS */
BIOS_start();

返回(0);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您发表您的问题。
    为了确保我们对齐您使用的软件包、您能告诉我源软件的位置以及您使用的 MSP432器件(版本 B 或版本 C)、板(评估硬件)的版本吗?

    从您的代码示例代码段中可以看到、这似乎是适用于 MSP432的独立 TI RTOS 软件包、已弃用。现在可通过 SimpleLink MSP432 SDK 获取对此器件的 TI RTOS 支持。 此 SDK 不仅包含 TI RTOS、还通过高级 ADC 驱动程序实现了易于使用的 ADC 功能。
    可从 以下网址获取:www.ti.com/.../simplelink-msp432-sdk

    您还可以在 dev.ti.com--> Resource Explorer --> simplelink MSP432 SDK 中查看 SDK 的云版本和相关示例。
    MSP432 Launchpad 套件的示例可在以下位置找到:
    示例-->开发工具--> MSP-EXP432P401R --> TI 驱动程序--> adcsinglechaple.

    强烈建议改用 SDK、因为它可以为您处理 HWI、ADC 配置等。

    此致、
    Priya
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 CCS v7.1.0.00016中工作。 我从 Resource Explorer> Software>TI_RTOS for MSP430导入了一个空项目- v:2.20.00.06> Development Tools> Driver Examples>空示例。
    MSP432P401R 版本 c、launchpad 版本2.1。 我将查看 SDK、很遗憾、我在过去几天一直使用 TI RTOS 软件包、因此我将研究切换。 最初我使用的是 ADC 驱动程序、但启用阻塞模式时遇到问题。 我需要在一个 swi 内调用 ADC start、这会产生一个 gatemutex 错误。 因此、我被迫放弃 ADC 驱动器。 这对我来说还是挺新的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我明白了。 强烈建议切换到 SDK、因为(a) ADC 驱动程序处理设置 HWI 之类的操作、因此您不必处理它;(b)我们在未来弃用对独立软件包的支持...因此、您越早越好切换就越好。

    我打开 interrupt.h 以检查中断编号、我看到您正在使用 TA0 1。 这是内核默认使用的计时器、因此它始终处于"使用中"状态。

    #define INT_TA0_0 (24)/* TA0_0 IRQ */

    ADC 1应使用数字40。 尝试将其更改为?

    #define INT_ADC14 (40)/* ADC14 IRQ */

    //示例代码片段
    Hwip_Params_init (&adcHwiParams);
    adcHwiParams.arg = 0;
    adcHwiParams.priority =~0;
    adcHwiParams.name ="ADC14";
    adcHwiHandle = Hwip_create (40、&Hwi_ADC、&adcHwiParams);


    -Priya
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、很好。 感谢您的跟进。