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/TM4C1294NCPDT:SPI1:如何设置回调以便通过 SWI 运行

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/706863/rtos-tm4c1294ncpdt-spi1-how-to-setup-callback-to-operate-via-swi

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您是否有详细介绍如何在 SWI 配置下使用 SPI1的参考资料?

我让它工作、但不断崩溃。 我已尝试禁用 HWI/SWI、但未修复此问题。我还收到此警告、如何修复此问题?

说明资源路径位置类型
#515-D 无法将类型为"void (*)(void)"的值分配给类型为"SPI_CallbackFxn"的实体 TM4C_SPI_Master.c /RFDAQ-1J/070_SPIBus 第142条 C/C++问题

void TM4C_HWI_Timer4_Event (UArg 实例)
{
UINT HKEY_CLASS;

Hwi_disable(); //确保原子行为。 TI-RTOS 将其他 HWI 事件置于队列中。
GPIO_TOGGLE (EK_PL5_EXP5_TIMINPIN);
Hwi_clearInterrupt (INT_TIMER4A_TM4C129);
if (TimerIntStatus (TIMER4_base、false)!= 0)
{
///------------------ 使 DAC 指针递增。
DACPointer++;
如果(DACPointer>=16)
DACPointer=0;
///------------------
TimerIntClear (TIMER4_base、0x2FFF); //清除所有中断,包括 TIMER_TINA_TIMEOUT 等
// Swi_Parswams Params;
// Swi_getAttrs (RFD_SWI_DAC12Update_Handle、NULL、&swiParams);//从 SWI 模块复制参数
// swiParams.arg0 = DAC_SineTable[DACPointer]; //更新 DAC 指针
// //swiParams.arg1 = 0;
// Swi_setAttrs (RFD_SWI_DAC12Update_Handle、NULL、&swiParams);//将参数保存回 SWI 模块
Swi_post (RFD_SWI_DAC12Update_Handle); // SWI 之后(参见下文)
}
GPIO_TOGGLE (EK_PL5_EXP5_TIMINPIN);
HWI_RESTORE (HKEY_CLASSES_RESTORE);
}//===========================================================================================================

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ RFD_DAC12Update_SWI_Fxn
//用途:处理 SPI 操作以更新 DAC 电压电平。
//输入://
输出://
注释 :SPI 不能由 HWI 运行,因此我们使用 SWI。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void RFD_DAC12Update_SWI_Fxn (UARg arg0、UARg arg1)
{
UINT skey;
skey = swi_disable();
GPIO_WRITE (EK_PH0_DACTEST、PINLOW);
RFD_SPI1_DAQ12_16位(((UINT16)(arg0和0x00000FFF));
Swi_restore (skey);
}

void RFD_DAC12Update_test_Fxn (void)
{
GPIO_WRITE (EK_PH0_DACTEST、PINHICH);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的意思是"崩溃"、在这种情况下、SPI 在几分钟后停止工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Richard、

     我们没有任何使用 SWI 的 SPI 的特定示例。 我想您可能已经尝试过使用任务而非 SWI 的 TI-RTOS SPI 示例。 有关 SWI 的使用、请参阅 TI-RTOS 内核用户指南中的第3.5节"软件中断"、了解详细信息。  

     我不清楚您意味着 SPI 在一段时间后停止工作。  在您认为 SPI 停止工作后、SWI 是否仍然被调用? 尝试在 SPI 函数中放置一个断点、以查看是否正在调用该断点。

     我不是 TI-RTOS 专家、但如果您可以设置正确的优先级、以便 RFD_DAC12Update_SWI_Fxn 不会被其他 SWI 抢先、我认为没有必要禁用 SWI。 HWI 也是如此。

     查看您的代码、似乎您使用的 TI-RTOS 不提供 SPI 驱动程序、而是使用用于 SPI 的 TivaWare 驱动程序。 是这样吗? 从较高层次看、我不会看到在 HWI ISR 中使用 Swi_post ()的问题。 下面是使用 SWI 的示例代码、该代码与您拥有的代码类似。

    ///--------------------------------
    // BIOS 头文件
    //---------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API //needed 用于任何 Log_info()调用
    #include 用于静态定义的对象/句柄
    #include 的//头文件 
    #include 
    #include 
    
    
    ///----------------------
    // TivaWare 头文件
    //---------------
    #include 
    #include 
    
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "inc/hw_ints.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/timer.h"/----
    
    
    
    //原型
    ///----------------
    void hardware_init (void);
    void ledToggle (void);
    void Timer_ISR (void);
    
    
    //-----
    //全局
    //---------------
    volatile Int16_t i16ToggleCount = 0;
    
    
    //---------------
    // main()//-----------------
    
    void main (void)
    {
    Hwi_Params HwiParams;
    Hwi_handle myHwi;
    ERROR_Block EB;
    /*将错误块和 hwiParams 初始化为默认值*/
    ERROR_INIT (&EB);
    Hwi_Params_init (hwiParams);
    hwiParams.enableInt = false;
    /*在向量51 (即 TIMER3A)上创建 Hwi */
    myHwi = Hwi_create (51、(Hwi_FuncPtr) Timer_ISR、hwiParams、&EB);
    if (myHwi = NULL){
    system_abort ("Hwi 创建失败");
    }
    Hwi_enableInterrupt (51);
    
    
    Swi_Parswams Params;
    Swi_handle LEDSwi;
    ERROR_Block eb2;
    /*将错误块和 hwiParams 初始化为默认值*/
    ERROR_INIT (&eb2);
    Swi_Params_init (&swiParams);
    LEDSwi = Swi_create ((Swi_FuncPtr) ledToggle、&swiParams、&eb2);
    if (LEDSwi = NULL){
    system_abort ("Swi 创建失败");
    }
    
    
    hardware_init();//通过 Xware
    
    BIOS_start()初始化硬件;
    
    }//---------------
    
    
    
    // hardware_init ()
    //
    //其 GPIO 引脚用于切换 LED
    /../../---------------
    void hardware_init (void)
    {
    uint32_t ui32Period;
    
    //将 CPU 时钟设置为40MHz。 400MHz PLL/2 = 200 DIV 5 = 40MHz
    SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTAL_16MHz|SYSCTL_MAIN);
    
    //添加 Tiva-C GPIO 设置-启用端口、为输出设置引脚1-3 (
    
    
    
    
    
    
    
    SYSCL_GPIO_PHIN);Timer_PM3_GPIO3 (SYSC_PHIN_IN_IN/2);GPIO_PERIPTH_INTRIP_GPIO3 (PHIN)
    // cfg Timer 3模式- periodic
    
    ui32Period =(SysCtlClockGet ()/2);//周期= CPU clk div 2 (500ms)
    TimerLoadSet (TIMER3_base、timer_A、ui32Period);//设置 TimerIntEnable (
    
    TIMER3_base、TIMER3)————启用定时器3—————/TIMER-/TIMER_TIMER 3———————————————————————中断
    
    
    
    
    
    
    
    // ledToggle ()
    //
    //切换 Tiva-C LaunchPad 上的 LED
    //---------------------------
    void ledToggle (void)
    {
    // LED 值- 2=红色、4=蓝色、8=绿色
    if (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2))
    {
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3、 0);
    }
    否则
    {
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、4);
    }
    
    i16ToggleCount += 1;//跟踪#toggleLog_Info1
    
    ("LED 翻转[%u]次"、i16ToggleCount);//将切换计数发送到 UIA
    
    }
    
    
    /---
    //计时器 ISR -由 BIOS Hwi 调用(请参阅 app.cfg)
    //
    //布置 Swi (或更高版本的一个信标)来切换 LED
    //-----
    void Timer_ISR (void)
    {
    TimerIntClear (TIMER3_base、TIMER_TINA_TIMEOUT);//必须从计时器
    
    Swi_post (LEDSwi)中清除计时器标志;//布置 LEDSwi
    }
    

     因此、问题可能是 SPI 特定问题、也可能与 TI-RTOS 上下文中 SPI 的使用方式相关、需要您进行更多调查。 您是否有许多其他 HWI/SWI 正在运行? 如果出于调试目的、您禁用/删除这些非 SPI SWI、该怎么办? 它会产生影响吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    此问题是否已解决? 我现在将关闭该线程。 如果您仍有疑问、可以重新打开该主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我因为旁路项目关闭了此项工作、并将在几周内回顾此讨论。