公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,


我遇到了一个不寻常的问题。 我正在尝试设置 AURIX TC397XE 的 OLDAEN 位,以防止在写入 OLDA 内存范围时生成陷阱。

为了实现这一目标,我创建了一个桥接控制寄存器的结构和一个联合结构。 然后,我将 DOM0_BRCON 指针定义为指向 BRCON 寄存器的地址。

在 osee_tc_core0_start 例程中,我调用了函数 osee_tc_set_olda_enable ()。 但是,我总是遇到陷阱,而且 OLDAEN 位没有设置。

我不确定我是否遗漏了什么,或者我的方法是否有任何错误。

typedef struct OsEE_tc_DOM_BRCON_bits_tag
{
    unsigned int OLDAEN:1;        /**< [0:0] Online Data Acquisition Enable - OLDAEN (rw) */
    unsigned int reserved_1:5;    /**< [5:1] \internal Reserved */
    unsigned int reserved_6:1;    /**< [6:6] \internal Reserved */
    unsigned int reserved_7:2;    /**< [8:7] \internal Reserved */
    unsigned int reserved_9:2;    /**< [10:9] \internal Reserved */
    unsigned int reserved_11:2;    /**<[12:11] \internal Reserved */
    unsigned int reserved_13:7;    /**<[19:13] \internal Reserved */
    unsigned int reserved_20:12;    /**<[31:20] \internal Reserved */
} OsEE_tc_DOM_BRCON_bits;
typedef union
{
OsEE_reg            reg;   /* Register access */
OsEE_tc_DOM_BRCON_bits  bits;  /* Bitfield access */
} OsEE_tc_DOM_BRCON;

#define DOM0_BRCON  (*(volatile OsEE_tc_DOM_BRCON*)0xF8700430u)

OSEE_STATIC_INLINE void OSEE_ALWAYS_INLINE /* static inline void __attribute__((always_inline)) */
osEE_tc_set_olda_enable()
{
DOM0_BRCON.bits.OLDAEN = 1U;
}

 

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

BRCON 寄存器需要 32 位访问权限,您是否确认您的代码就是这样做的?

cwunder_0-1699553101312.png

 

在原帖中查看解决方案

0 点赞
4 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

BRCON 寄存器需要 32 位访问权限,您是否确认您的代码就是这样做的?

cwunder_0-1699553101312.png

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @cwunder

我还尝试使用以下代码进行 32 位访问:dom0_brcon.reg = 0x201;但是,OLDAEN 位仍未设置。

观察到的行为还有其他潜在原因吗?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你没有说明你使用的是哪个编译器工具集。 我建议使用访问权限查看正在生成的汇编指令,以确保您的指令使用的是 st.w 指令。

 

	mov	d15,#513
	movh.a	a15,#63600
	st.w	[a15]@los(0xf8700430),d15

 

除了 32 位访问权限外,您还必须处于管理模式,并且 DOM0_ACCEN0 设置允许 CPU 进行访问。

如果你使用的是 Tasking,这里是他们手册中的一段片段:
如果你在特殊函数寄存器中声明位域,这种行为并不总是理想的:一些特殊的函数寄存器需要 16 位或 32 位访问权限。要强制 16 位或 32 位访问,可以使用数据类型限定__sfrbit16 and __符 sf rbit32。

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager


我使用了 __sfrbit32 限定符来强制 32 位访问,但它没有改变任何东西。
看来 Tasking 编译器正在执行一些优化,而 dom0_brcon.bits. oldaen = 1U; 指令从未执行过。
我试图使用Tasking的优化实用程序阻止编译器优化,如下所示,但它没有解决问题:

#pragma optimize 0
DOM0_BRCON.bits.OLDAEN = 1U;
#pragma endoptimize

有趣的是,在使用 Hightec 编译器时,它可以正常工作。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/Trouble-Setting-OLDAEN-Bit-on-AURIX-TC397XE/m-p/643213

0 点赞