请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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);
}