如何搜一个文件夹中有没有某个字符串
findstr /s /i /m /c:"TCE_MRD_TASK_WRITE_END_INT" "D:\20220728\OCAP_V3.00.02.P01_HY_20221122\OCAP_V3.00.02.P01_HY_20221122\*.*"
1. MRD
1.1. MRD输入数据结构
输入数据以包为单位进行处理,每个采样点为 32 比特,其中实部和虚部各 16 比特。起始位置为包描述符,因而包大小为 dft_size*4+包描述符。输入包描述符共占16字节。
以下为和代码中对应的输入参数选项:
参数 | 类型 | 宽度 | 说明 | 实际值 |
---|---|---|---|---|
s32p_dest_add | SINT32_PTR | 32 | 输出数据地址 | 输出地址 |
b_dest_add_valid | BOOLEAN | 1 | 0 :输出数据由buffer manager 控制。1 :输出数据地址为s32p_dest_add | TRUE |
s32_out_buf_number | SINT32 | 2 | 输出buffer选择,可选0-3 | 0 |
s32_dft_size | SINT32 | 10 | 变换样点索引 | 7 :对应2048点 |
s32_dft_samples | SINT32 | 13 | 发给MRD的采样点数 | 2048 |
s32_dft_offset | SINT32 | 12 | 输入数据补零个数/输出数据提取时跳过个数 | 0 |
s32_pad_extract | SINT32 | 2 | 输入数据补零/输出数据提取选择。0 :不使能,1 :使能输入补0,2 :使能输出提取 | 0 |
s32_alpha | SINT32 | 24 | 变换频移/相位梯度(规范为 pi 的弧度)在正负 1 之间的有符号数,格式为定点 Q1.23 | 0 |
s32_beta | SINT32 | 16 | 变换相移/相位偏置(规范为 pi 的角度)在正负 1 之间的有符号数,格式为定点 Q1.15 | 0 |
s32_nco_lpo | SINT32 | 2 | 频移/相移选择,0 :不使能,1 :使能频移,2 :使能相移 | 0 |
b_inverse_dft | BOOLEAN | 1 | 正反向FFT变换,0 :正向,1 :反向 | 0 ,1 |
b_scaling_type | BOOLEAN | 1 | 缩放策略选择,0 :自动缩放,1 :固定缩放 | 1 |
s32_fixed_scaling_scheme | SINT32 | 2 | 固定缩放选择 | 1 ,0 |
s32_header_repetition | SINT32 | 8 | 重复包描述符,指示本包后面有几包数据发送到MRD,不包含包描述符,使用此包描述符 | 0 |
s32_reserved | UINT32 | 2 | 保留 | / |
1.2. 寄存器配置
MRD配置端口基地址为0x200000
寄存器 | 描述 | 宽度(bits) | 地址偏移 | 实际值 |
---|---|---|---|---|
MRD_HW_CONFIG | 不知道干啥的 | ~ | 0x00 | 0x008a3309 |
MRD_SW_RESET | 软复位寄存器 | 1 | 0x04 | 0x0000 |
MRD_ERROR_STATUS | 错误状态监测寄存器 | 6 | 0x08 | 0x0000 |
MRD_IN_BUF_RD_CNT | 输入 buffer 读计数寄存器 | 10 | 0x20 | |
MRD_AXI_MR_WR_CFG | 主设备写接口配置寄存器 | 32 | 0x74 |
1.3. MRD工作流程
1.3.1. 写 CP_MAILBOX 寄存器 CP_MAILBOX_XC4210_INTR_EN,配置XC4210_MRD_ERR_INTR_EN 和 XC4210_MRD0_INTR_EN 位使能 MRD 相关中断
以下为XC4210中断使能寄存器中的两个位:
我看目前程序应该是只配置了中断使能,错误中断使能未配置。
*CP_MAIL_XC4210_INTR_EN |=(0x1 << XC4210_MRD0_INTR_EN);
1.3.2. 配置 XC4210_ICTL 的中断向量寄存器 XC4210_ICTL_IRQ_VECTOR_x,中断源使能寄存器 XC4210_ICTL_IRQ_INTEN 和中断源屏蔽寄存器XC4210_ICTL_IRQ_INTMASK,打开 MRD 中断,配置 MRD 中断处理函数入口地址
XC4210_ICTL 包含32个中断源,其中MRD为IRQ中断源25。
1.3.2.1. 配置XC4210_ICTL_IRQ_INTEN
中断使能通过XC4210_ICTL_IRQ_INTEN寄存器实现,此处需要使能第24位中断源。
*XC_IRQ_INTEN_L |= 0x1 << 24;
how to 理解上面的代码?
这行代码是用于设置一个位于XC_IRQ_INTEN_L寄存器的中断使能位。
XC_IRQ_INTEN_L
:这是一个指向XC4210的中断使能寄存器(32位)的指针。0x1 << 24
:这是一个位操作,将数值0x1左移24位。左移操作后,得到一个新的数值0x01000000
。这个操作的目的是创建一个只有第25位为1的掩码,用于设置寄存器中相应的中断使能位。*XC_IRQ_INTEN_L |=:
这是一个复合赋值操作,它将XC_IRQ_INTEN_L
寄存器的当前值与刚刚创建的掩码进行按位或(bitwise OR)操作,然后将结果写回寄存器。按位或操作保留了寄存器中其他位的值,并将第25位设置为1,从而使能第25位对应的中断。
综上所述,这行代码的作用是设置XC_IRQ_INTEN_L寄存器的第25位为1,由此实现中断使能。
1.3.2.2. 配置XC4210_ICTL_IRQ_INTMASK
中断屏蔽与否通过XC4210_ICTL_IRQ_INTMASK实现:
*XC_IRQ_INTMASK_L &= ~(0x1 << 24);
和中断使能类似。这行代码的作用是清除XC_IRQ_INTMASK_L寄存器的第25位,由下图可知,以此实现中断不屏蔽。
1.3.2.3. 配置中断入口函数
osa_irq_unregister(TCE_MRD_TASK_WRITE_END_INT);
osa_irq_register(TCE_MRD_TASK_WRITE_END_INT, (osa_irq_handler_t)user_mrd_test_isr, NULL_PTR);
以上实现了解注册(取消关联)一个中断服务程序(ISR)和注册(关联)一个中断服务程序。当TCE_MRD_TASK_WRITE_END_INT
这个特定中断发生时,处理器将调用user_mrd_test_isr
函数来处理中断。其中ISR译为中断服务程序。
配置 XC4210 寄存器 modp,使能矢量中断
没找到在哪里配置,但有一行注释给了可能的解释,大意是:
在模块配置寄存器(modp reg)的默认设置中,矢量中断(vector interrupt)已经启用。因此,我们不需要在模块配置寄存器(modp register)中设置矢量中断使能位(VINT enable bit)。
配置 FIC 总线的地址范围
harq_turbo_fic_config();
// fic_mrd_config();
TCE复位
此处涉及TCE控制器TCE_CTL以及复位寄存器TCE_RST。
其中XC4210 访问 TCE_CTL 的基地址为:0x800000
#define TCE_CTL_BASE 0x800000
#define TCE_RST (TCE_CTL_BASE + 0x04)
具体复位代码如下:
s32_reg_value = 0x3ff << 16 | 0x0;
vp_reg_addr = (VOID_PTR)TCE_RST;
out_arX_s_arY_s_dw((VOID_PTR)s32_reg_value, vp_reg_addr);
// release reset
s32_reg_value = 0x3ff << 16 | 0x3ff;
vp_reg_addr = (VOID_PTR)TCE_RST;
out_arX_s_arY_s_dw((VOID_PTR)s32_reg_value, vp_reg_addr);
首先,将0x3ff << 16 | 0x0
的结果赋值给s32_reg_value
。结果是一个32位整数,其高16位为0x3ff
,低16位为0x0
。对应到TCE_RST寄存器中。为复位操作。
文档信息
- 本文作者:Ziyue Qi
- 本文链接:https://westqzy.github.io/2023/04/23/MRD/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)