打印
[AT32F423]

AT32f423电池供电数据寄存器ERTC_BPRx半字操作不成功

[复制链接]
5026|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaolf_2000|  楼主 | 2023-11-2 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaolf_2000 于 2023-11-2 11:29 编辑

参照库里面的
void ertc_bpr_data_write(ertc_dt_type dt, uint32_t data)
{
  __IO uint32_t reg = 0;

  reg = ERTC_BASE + 0x50 + (dt * 4);

  *(__IO uint32_t *)reg = data;
}
uint32_t ertc_bpr_data_read(ertc_dt_type dt)
{
  __IO uint32_t reg = 0;

  reg = ERTC_BASE + 0x50 + (dt * 4);

  return (*(__IO uint32_t *)reg);
}
写的:
void ertc_bpr_16bitdata_write(uint16_t dt, uint16_t data)
{
    __IO uint16_t reg = 0;

    reg = ERTC_BASE + 0x50 + (dt * 2);

    *(__IO uint16_t *)reg = data;
}
uint16_t ertc_bpr_16bitdata_read(uint16_t dt)
{
    __IO uint16_t reg = 0;
    reg = ERTC_BASE + 0x50 + (dt * 2);
    return (*(__IO uint16_t *)reg);
}
时钟使能了,访问也使能了,但还是写不进去,读出来都是0xffff,不明白原因
   crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
    pwc_battery_powered_domain_access(TRUE);

使用特权

评论回复
评论
xch 2023-11-2 16:02 回复TA
ARM指针都是占用32bit大小空间的,你定义一个仅16bit大小的变量存32位地址,装不下啊! 
沙发
骑着蜗牛狂奔O| | 2023-11-2 13:46 | 只看该作者
你好,ERTC BPR寄存器只支持32位访问,如果需要做半字读写可以用软件实现,先32位读出数据,然后半字操作,然后再32位存储

使用特权

评论回复
板凳
骑着蜗牛狂奔O| | 2023-11-2 13:48 | 只看该作者
另外关于BPR寄存器读写操作例程可以参考BSP里面的demo      ertc\bpr_domain

使用特权

评论回复
地板
gaolf_2000|  楼主 | 2023-11-2 14:25 | 只看该作者
骑着蜗牛狂奔O 发表于 2023-11-2 13:46
你好,ERTC BPR寄存器只支持32位访问,如果需要做半字读写可以用软件实现,先32位读出数据,然后半字操作, ...


使用特权

评论回复
5
xch| | 2023-11-2 15:51 | 只看该作者
void ertc_bpr_16bitdata_write(uint16_t dt, uint16_t data)
{
   __IO uint16_t *reg =   ERTC_BASE + 0x50 + (dt * 2);
    *reg = data;
}

使用特权

评论回复
6
muyichuan2012| | 2023-11-2 15:59 | 只看该作者
ERTC BPR寄存器只支持32位访问

使用特权

评论回复
7
hjl2832| | 2023-11-3 08:11 | 只看该作者
你不能把reg改成16位的,它只支持32位操作,你要写16位数据,直接写就行了,默认会把16位转成32位操作,读取后取低16位就是了。

使用特权

评论回复
8
zhanglinux| | 2023-11-6 23:02 | 只看该作者

AT32f423电池供电数据寄存器ERTC_BPRx半字操作不成功

赞!!!!

使用特权

评论回复
9
xch| | 2023-11-12 01:55 | 只看该作者
void ertc_bpr_16bitdata_write(uint16_t dt, uint16_t data)
{
   __IO uint16_t *reg16 =  (__IO uint16_t *)((uint32_t) ERTC    +0x50+2*dt);
   __IO uint32_t *reg32 =  (__IO uint32_t *)((uint32_t) ERTC    +0x50+4*dt);
   CRM->apb1en_bit.pwcen =1;
   PWC->ctrl_bit.bpwen=1; //PWC_CTRL 的BPWEN=1
   ERTC->wp = 0XCA;//ERTC_WP 寄存器写入 0xCA,0x53
   ERTC->wp = 0X53;
   ERTC->ctrl_bit.bpr =1;
   ERTC->dt1;
    *reg16 = data;
    reg16++;
    *reg16 = data;
     *reg32 = data+1;
     ERTC->wp = 0Xff;
}

///16 bit 操作没问题。
操作前需要要解锁。
以上代码调试通过。

使用特权

评论回复
10
xch| | 2023-11-12 02:02 | 只看该作者
AT32F423_TEST - IAR Embedded Workbench IDE - Arm 8.40.2 2023-11-12 01-58-15.mp4.zip (6.12 MB)


使用特权

评论回复
11
xch| | 2023-11-12 04:46 | 只看该作者
我的结论不对,碰巧了以为对了。对DT寄存器进行8位、16位写入时,实际上高位复写了低位。
比如写16位0x0001,实际上进行了32位写入,写入了0x00010001;
写8位0x0001,实际上进行了32位写入,写入了0x01010101;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

27

帖子

0

粉丝