主题中讨论的其他器件:C2000WARE
工具/软件:TI-RTOS
您好!
我为非 BIOS 项目编写了自己的 I2C 库。 现在、我要编写 BIOS 版本。 我创建了一个项目、并添加了 driverlib 头文件。 我添加了 driverlib 源代码、并添加了指向项目的路径。 工程会编译、但当我放入代码时、driverlib 应用程序中的任何函数都会崩溃。
那么、这是我的问题-在 SYS/BIOS 项目中是否有任何方法使用 driverlib?
BR、
Dawid。
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
您好!
我为非 BIOS 项目编写了自己的 I2C 库。 现在、我要编写 BIOS 版本。 我创建了一个项目、并添加了 driverlib 头文件。 我添加了 driverlib 源代码、并添加了指向项目的路径。 工程会编译、但当我放入代码时、driverlib 应用程序中的任何函数都会崩溃。
那么、这是我的问题-在 SYS/BIOS 项目中是否有任何方法使用 driverlib?
BR、
Dawid。
尊敬的惠特尼:
我看不到"红色错误"、但在按下"播放"按钮后、我的应用程序会立即停止。 我同时解决了这个问题-我意识到我添加了"Interrupt_initVectorTable();"行。 我在使用 RTOS 时看到这是禁止的。 现在、我还有另一个问题。
我想使用 I2C、所以我创建了 Hwi (INT8.1有88个数字)、我将88作为中断编号。 我是否应该在 RTOS 中执行其他操作来启用此中断?
以下是我的代码:
#include
#include
#include
#include
#include
#include "driverlib.h"
#include "device.h"
#include "i2c_library.h"
#define SLAVE_ADDRESS 0x20
I2C_Master_t I2cMaster;
//全局函数
void I2C_lib_init (uint32_t I2C_base、I2C_Master_t * i2c)
{
*i2c = InitializeFunctionPointers();
// zapisanie w strukturze adresu używanego modułu I2C
I2C->I2C_base = I2CA_BASE;
//必须在配置 I2C 之前将其复位
I2C_DisableModule (I2C_base);
// I2C 配置。
I2C_initMaster (I2C_base、DEVICE_SYSCLK_FREQ、400000、I2C_DUTYCYCLE _50);
I2C_setBitCount (I2C_base、I2C_BITCOUNT_8);
I2C_setEmulationMode (I2C_base、I2C_emulation_free_run);
//启用停止条件和寄存器访问就绪中断
I2C_enableInterrupt (I2C_base、I2C_INT_STOP_Condition |
I2C_INT_REG_ACCESS_RDY |
I2C_INT_RX_DATA_RDY |
I2C_INT_TX_DATA_RDY |
I2C_INT_NO_ACK
);
// FIFO 配置
I2C_enableFIFO (I2C_base);
//I2C_clearInterruptStatus (I2C_base、I2C_INT_RXFF | I2C_INT_TXFF);
//配置完成。 启用模块。
I2C_enableModule (I2C_base);
}
//
*=== main ====
*/
int main()
{
GPIO_setPinConfig (GPIO_104_SDAA);
GPIO_setPadConfig (104、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (104、GPIO_QUAL_异 步);
GPIO_setPinConfig (GPIO_105_SCLA);
GPIO_setPadConfig (105、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (105、GPIO_QUAL_ASYNC_A);
interrupt_initModule();
// Interrupt_initVectorTable();
I2C_lib_init (I2CA_BASE、&I2cMaster);
//中断_ENABLE (INT_I2CA);
/*
*将"Hello world"打印到日志缓冲区。
*
log_info0 ("Hello world\n");
/*
*启动 BIOS
*执行几个最终初始化、然后执行
*进入持续调用的循环
*已安装空闲函数。
*
BIOS_start();/*不返回*/
return (0);
}
/*
==== myIdleFxn ===
*从
BIOS_start()线程内反复调用的后台空闲函数*。
*/
void myIdleFxn (void)
{
uint8_t DATA[]={0x0F、0x1F、0x2F、0x3F、0x4F};
if (I2cMaster.status = I2CM_STATUS_READY)
if (!I2C_getStopConditionStatus (I2CA_BASE))
I2C_lib_MasterWriteRead (&I2cMaster、SLAVE_ADDRESS、DATA、0、5);
}
void I2caISR()
{
I2C_lib_InterruptHandler (&I2cMaster);
}
我不确定是否可以在 RTOS 中使用诸如 DEVICE_INIT()、Device_initGPIO()或 Interrupt_enable (INT_I2CA)之类的函数。
我可以在示波器中看到 I2C 线路上没有发生任何情况、因此我认为 I2C 配置错误。 那么、我应该如何在 RTOS 中正确执行它呢?
BR、
Dawid。
Whitney、
根据您之前的消息、我对我的代码进行了一些更改。 其中包括:
SYSCTL_setLowSpeedClock (SYSCTL_LSPCLK_PRESALE_4); device_enableAllPeripheral(); DEVICE_initGPIO(); GPIO_setPinConfig (GPIO_104_SDAA); GPIO_setPadConfig (104、GPIO_PIN_TYPE_PULLUP); GPIO_setQualificationMode (104、GPIO_QUAL_异 步); GPIO_setPinConfig (GPIO_105_SCLA); GPIO_setPadConfig (105、GPIO_PIN_TYPE_PULLUP); GPIO_setQualificationMode (105、GPIO_QUAL_ASYNC_A); interrupt_initModule(); I2C_lib_init (I2CA_BASE、&I2cMaster); INTERRUPT_ENABLE (INT_I2CA);
现在、I2C 将触发并将中断处理程序触发到、但下面是我从控制台发出的日志:
[C28xx_CPU1]节拍数= 1
ackOverflow:ISR 栈溢出。
xdc.runtime.Error.raise:终止执行
已选中 BIOS 配置中的自动确认。 我已检查 BIOS 配置、可以看到:
我不确定该时钟频率是否正确。 在非 BIOS 项目中、我的时钟频率始终为200MHz。 ackOverflow:ISR 栈溢出可能 是由错误的 CPU 时钟设置引起的?
BR、
Dawid。
我不认为时钟频率会导致堆栈溢出。 在上面发布了屏幕截图的那个页面上、尝试增大"系统(Hwi 和 Swi)堆栈大小"字段、看看这是否有用。 您可以在 CCS 调试会话中使用 ROV (它位于 Tools > ROV Classic for Me 下-可能取决于您使用的版本)来检查堆栈使用情况。 从模块列表中选择 Hwi、然后单击模块选项卡以获取堆栈信息。
但是正确的是、SYS/BIOS 已将 SYSCLK 配置为以与 C2000Ware 代码不同的速度运行。 您可以在引导模块中对此进行调整。
惠特尼
我的 Hwi 看起来像这样:
void I2caISR()
{
I2C_lib_InterruptHandler (&I2cMaster);
}
其中 I2C_lib_InterruptHandler 为:
void I2C_lib_InterruptHandler (I2C_Master_t * i2c) { I2C_InterruptSource intSource = i2c->GetInterruptSource (i2c->I2C_base);//I2C_getInterruptSource (i2c->I2C_base); switch (intSource) { I2C_INTSRC_TX_DATA_RDY 案例: I2C_lib_MasterWriteHandler (i2c); 中断; I2C_INTSRC_RX_DATA_RDY 案例: I2C_lib_MasterReadHandler (i2c); 中断; I2C_INTSRC_REG_ACCESS_RDY 案例: I2C_lib_MasterRegAccessReadyHandler (i2c); 中断; I2C_INTSRC_NO_ACK 案例: I2C_lib_MasterNoAckHandler (i2c); 中断; 情况 I2C_INTSRC_STOP_Condition: I2C_lib_MasterStopConditionHandler (i2c); 中断; } }
你怎么看? 这是 RTOS 中的一种好方法、还是应该触发 Swi 来处理此中断?
我在"Memory Browser"中查看、可以看到: