主题中讨论的其他器件:HALCOGEN
您好!
我使用的是周期为1ms 的 FreeRTOS、我还需要周期为5ms 的 RTI 时钟触发器、
我不想使用软件计时器。
这种实施有一些例子吗?
谢谢
Antonio
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.
您好!
我使用的是周期为1ms 的 FreeRTOS、我还需要周期为5ms 的 RTI 时钟触发器、
我不想使用软件计时器。
这种实施有一些例子吗?
谢谢
Antonio
HY、实际设置为:
静态空 prvSetupTimerInterrupt (void) { //禁用计时器0。 // portRTI_GCTRL_REG &= 0xFFFFFFFEUL; //使用内部计数器。 // portRTI_TBCTRL_REG = 0x000000000000U; // COMPSEL0将使用 RTIFRC0计数器。 // portRTI_COMPCTRL_REG = 0x000000000000U; //初始化计数器和预分频计数器寄存器。 // portRTI_CNT0_UC0_REG = 0x000000000000; portRTI_CNT0_FRC0_REG = 0x00000000U; //设置 RTI 时钟的预分频器。 // portRTI_CNT0_CPU0_REG = 0x00000001U; portRTI_CNT0_COMP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz; portRTI_CNT0_UDCP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGICK _RATE_Hz;port_RIT_CNT0_UDCP0_REG =(CONFIGCP0_CLK_RET_RECO_RECO_Hz /portRTI_INTFLAG_REG = 0x0007000FU; portRTI_CLEARINTENA_REG= 0x00070F0FU; //启用比较0中断。 // portRTI_SETINTENA_REG = 0x00000001U; portRTI_GCTRL_REG |= 0x00000001U; }
我必须启用1到5ms 的比较、以便该设置只需添加以下寄存器值即可?
#define portRTI_CNT0_FRC1_REG (*(volatile uint32_t *) 0xFFFFFF30)
#define portRTI_CNT0_UC1_REG (*(volatile UINT32_t *) 0xFFFFFF34)
#define portRTI_CNT0_CPUC1_REG (*(volatile UINT32_t *) 0xFFFFFF38)
#define portRTI_CNT0_COMP1_REG (*(volatile uint32_t *) 0xFFFFFF58)
#define portRTI_CNT0_UDCP1_REG (*(volatile UINT32_t *) 0xFFFFFF5C)
/* COMPSEL0将使用 RTIFRC0计数器。 *
PORTTI_COMPCTRL_REG = 0x000000000000U;
PORTTI_CNT0_UC1_REG = 0x000000000000U;
PORTTI_CNT0_FRC1_REG = 0x000000000000U;
/*为 RTI 时钟设置预分频器。 *
PORTTI_CNT0_CPUC1_REG = 0x00000001U;
PORTTI_CNT0_COMP1_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz * 5;
PORTTI_CNT0_UDCP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz * 5;
很抱歉、但对我来说、实施起来并不简单、
谢谢、
Antonio
感谢 QJ Wang、
我已经执行了您的建议、现在假设中断可用-关于如何捕获中断的问题、
事实上、RTI 驱动程序不是由 HalCoGen 生成的、所以我从另一个项目复制了文件 HL_reg_rti.h、并且我还添加了以下通知
/*注-您需要从 notification.c 中删除 rtiNotification 以避免重新定义*/ void rtiNotification (rtiBASE-t * rtiREG、uint32通知) {// 在用户代码开始和用户代码结束之间输入用户代码。 * /*切换 HET 引脚0 */ gioSetPort (hetPORT1、gioGetPort (hetPORT1)^ 0x00000001); }
但它没有被调用、
随附示例项目、有关如何解决该项目的任何想法?
感谢您的观看、
Antonio
现在、它几乎可以工作、
完整的过程如下:
1)在 HalCoGen 中、将"VIM RAM"重命名为"rtiCompare1Interrupt"中断0x00000010:03
2) 2)在 HalCoGen 中"VIM 通道0-31"启用中断3 RTI 比较1
3) 3)在 HalCoGen 中生成代码
4) 4)添加了 HL_RTI.h
5) 5)添加了 HL_reg_RTI.h
6) 6)添加了 HL_RTI.c
7)在 os_port.c 中
在 /*用户代码开始(2)*/中添加了以下行
#define portRTI_CNT0_COMP1_REG (*(volatile uint32_t *) 0xFFFFFF58)
#define portRTI_CNT0_UDCP1_REG (*(volatile UINT32_t *) 0xFFFFFF5C)
在方法 prvSetupTimerInterrupt 末尾添加了以下行
/*启用5ms compare1计时器*/
PORTTI_CNT0_COMP1_REG = PORTTI_CNT0_COMP0_REG * 5;//5ms
PORTTI_CNT0_UDCP1_REG = PORTTI_CNT0_UDCP0_REG * 5;//5ms
PORTTI_SETINTENA_REG = 0x03;
8) 8)代码中需要的位置、添加:
#include "HL_REG_RTI.h"
#include "HL_RTI.h"
void rtiNotification (rtibase_t * rtiREG、uint32通知)
{
//gioSetBit (hetPORT1、0、gioGetBit (hetPORT1、0)^ 1);
}
几乎还可以,因为
PORTTI_CNT0_COMP1_REG = PORTTI_CNT0_COMP0_REG * 5;//5ms
PORTTI_CNT0_UDCP1_REG = PORTTI_CNT0_UDCP0_REG * 5;//5ms
PORTTI_SETINTENA_REG = 0x03;
每次我使用 HalCoGen 生成代码时被删除、并且函数 prvSetupTimerInterrupt 中没有可用的用户块
在代码执行期间、我还尝试使用以下指令执行同样的操作
rtiStopCounter (rtiREG1、rtiCOUNTER_BLOCK0);
uint32 rtiCompare0Period = rtiGetPeriod (rtiREG1、rtiCOMPARE0);
uint32 rtiCompare1Period = rtiCompare0Period * 5;
rtiSetPeriod (rtiREG1、rtiCOMPARE1、rtiCompare1Period);
rtiResetCounter (rtiREG1、rtiCOUNTER_BLOCK0);
但是 rtiCompare0Period 似乎始终为0
下面是工作示例