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/EK-TM4C1294XL:TI-RTOS 硬件中断

Guru**** 2470720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/676731/rtos-ek-tm4c1294xl-ti-rtos-hardware-interrupt

器件型号:EK-TM4C1294XL

工具/软件:TI-RTOS

您好;

在 TI-RTOS 概念硬件中断专题讨论会系列中,第一个有关通过闪烁 LED 进行硬件交互的使用的实验。在我尝试此实验时,我遇到了一些问题。 在代码中、Hwi 将基于 Tiva TM4C1294xl 计时器2A 发生。但当我动态地设置 Hwi 的属性时、不会发生任何事情。所有代码如下;

#include 
#include 

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

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

#define TASKSTACKSIZE 512


Hwi_handle hwi1;

void hwiFxn (){

GPIO_WRITE (Board_LED1、Board_LED_ON);
}



int main (void)
{

Hwi_Params Hwip;
Task_Params taskParams;
/*呼叫板初始化函数*/
Board_initGeneral();
// Board_initEMAC();
Board_initGPIO();
// Board_initI2C();
// Board_initSDSPI();
// Board_initSPI ();
// Board_initUART ();
// Board_initUSB (Board_USBDEVICE);
// Board_initUSBMSCHFatFs();
// Board_initWatchdog();
// Board_initWiFi ();

/*构造心跳任务线程*/
Task_Params_init (&taskParams);
taskParams.arg0 = 1000;
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr)心跳 BeatFxn、&taskParams、NULL);


Hwi_Params_init (&hwip);
hwip.arg=0;
hwip.EventID=39;
hwip.priority=0;
hwi1=hwi_create (39、hwiFxn、&hwip, NULL);



/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);
GPIO_WRITE (Board_LED1、Board_LED_OFF);

system_printf ("启动示例\n 系统提供程序设置为 SysMin。 "
"停止目标以查看 ROV 中的任何 SysMin 内容。\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/

system_flush();

/*启动 BIOS */
BIOS_start();

返回(0);
} 

此外、在专题讨论会中、它会介绍 Tiva C 系列的事件 ID;

我想知道在设置硬件交叉时缺少一点吗? 了解用法和设置以供进一步使用将非常有帮助。

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我看不到您使用 Hwi_enableInterrupt (39)启用中断;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles;

    我试过它,但它不起作用。 我是否需要为计时器定义中断? 在我确定定时器中断后、我需要为此中断实例提供一个函数地址。 就像我在 Hwi 函数中定义的那样:

    void hwiFxn(){

    GPIO_WRITE (Board_LED1、Board_LED_ON);

    (示例)

    我需要理解的是,hwi 定义的函数(在该示例中为 hwifxn)-- hwi1=Hwi_create (39、hwiFxn、&hwip、NULL)--将具有更高的优先级,即使我们使用计时器或其他类型的中断(时钟、ADC 等)触发此硬件中断函数。 请告诉我这个问题。 这将非常有帮助。

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

    您好!

     我建议您参考 LAB5解决方案。 唯一的区别是在 LAB5中、Timer2的 Hwi 是静态创建的、而不是通过 Hwi_create()动态创建的。 查看代码、不仅需要启用 Timer2中断、还需要正确配置 Timer2 (即计时器的周期)。 我在您的代码中看不到它。 我不太确定您为什么要在 这里执行 BeatFxn 项任务。  我建议您重点关注让 Hwi 首先工作。  

    -------------------------------------------------------
    //项目:使用 Hwi 使 TM4C BIOS 闪烁(解决方案)
    //作者:Eric Wilbur
    //日期:2014年6月
    //
    //注意:函数调用 TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT)具有
    // 处于 ISR 中。 这个 fxn 清除了定时器的中断标志来
    // 来自外设-它不清除 CPU 中断标志-该
    // 由硬件完成。 作者很难找到这一部分-因此
    // 注意事项。 在 Swi 实验中、这个 fxn 必须被放置在
    //中 Timer_ISR fxn、因为它将是新的 ISR。
    //
    //按照以下步骤在 CCSv6.0中创建此项目:
    // 1. Project -> New CCS Project
    // 2. 选择 Template:
    //- TI-RTOS for Tiva-C -> Driver Examples -> EK-TM4C123 LP -> Example Projects ->
    // 空项目
    //-空项目包含完整的仪器(UIA、RTOS 分析器)和
    // 为 MSP430Ware 的 TI-RTOS 版本设置的路径
    // 3. 删除以下文件:
    //- Board.h、empty.c、EK_TM4C123GXL.c/h、empty_readme.txt
    // 4. 从 TI-RTOS 专题讨论会解决方案文件中为本实验添加 main.c
    // 5. 根据需要编辑 empty.cfg (添加/减去) BIOS 处理、删除给定任务
    // 6. 构建、加载、运行...
    ///--------------------------------------
    
    
    ///--------------------------------
    // BIOS 头文件
    //---------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API //needed 用于任何 Log_info()调用
    #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);
    
    
    //---------------
    //全局
    //---------------
    volatile Int16_t i16ToggleCount = 0;
    
    
    //---------------
    // main()//-----------------
    
    void main (void)
    {
    
    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
    );Timer_GPIO2|SYSC_PIN_PHIN (PHIN_IN_IN_IN/2);Timer_GPIOTP2|SYSC_GPIO_PERIP_PIN_PHIN (PHIN_IN_IN_IN_IN/2)// cfg Timer 2模式-周期性
    
    ui32Period =(SysCtlClockGet ()/2);//周期= CPU clk div 2 (500ms)
    TimerLoadSet (TIMER2_base、timer_A、ui32Period);//设置 TimerIntEnable (
    
    TIMER2_base) Timer2A
    
    (TIMER2_BASE)————启用定时器2—————/TIMER-2-中断————
    
    
    
    
    
    // ledToggle ()
    //
    //切换 Tiva-C LaunchPad 上的 LED
    //---------------------------
    void ledToggle (void)
    {
    TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);//必须从计时器中清除计时器标志
    
    // LED 值- 2=红色、4=蓝色、8=绿色
    IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2))
    {
    GPIOPORTF_BASE、8= GPIO_PIN_PIN_2|GPIO_PIN_PIN_PIN_PIN_BASE、GPIO_3|GPIO_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_2|GPIO_PIN_PIN_PIN_PIN 0);
    }
    否则
    {
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、4);
    }
    
    i16ToggleCount += 1;//跟踪#toggle
    
    Log_Info1 ("LED 翻转[%u]次"、i16ToggleCount);//将切换计数发送到 UIA
    
    }