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.
工具/软件: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); }
您好 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、该怎么办? 它会产生影响吗?
我因为旁路项目关闭了此项工作、并将在几周内回顾此讨论。