打印
[技术讨论]

请教一个C语言的问题

[复制链接]
715|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guyueKT|  楼主 | 2021-3-22 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
M0P_CLOCK->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul))); 摘自华大的参考
把0x00100c08这个数据转化为地址,再指针操作。
问题是数据0x00100c08后面带的是无符号long,long也是4个字节的,应该是属于可有可无的?
为什么转换是用uint16_t,数据不是32位的吗?
还请大神指点指点。谢谢

使用特权

评论回复
评论
zyj9490 2021-3-22 11:55 回复TA
地址内容 
zyj9490 2021-3-22 11:54 回复TA
地址与地址内部(被指向的变量),二者是不同的概念。 

相关帖子

沙发
manbo789| | 2021-3-22 10:27 | 只看该作者
本帖最后由 manbo789 于 2021-3-22 10:29 编辑

指针是32位的,但是指针地址中的内容(数据)是16位的,uint16_t*中的uint16_t是告诉编译器如何使用指针地址中的内容,也就是说明 指针指向的数据的类型,

使用特权

评论回复
板凳
walton1226| | 2021-3-22 10:29 | 只看该作者
RCH_CR这个寄存器的低16位有效,uint16_t是无符号型16位数据类型

使用特权

评论回复
地板
manbo789| | 2021-3-22 10:34 | 只看该作者
或者这样写你可能更容易理解:(*((volatile uint16_t*)((uint32_t) (0x00100C08ul)))),

使用特权

评论回复
5
haoyupei| | 2021-3-23 00:30 | 只看该作者
楼主看下摘自华大半导体的设置晶振的手册
24M校准值地址:0x00100C00 - 0x00100C01
22.12M校准值地址:0x00100C02 - 0x00100C03
16M校准值地址:0x00100C04 - 0x00100C05
8M校准值地址:0x00100C06 - 0x00100C07
4M校准值地址:0x00100C08 - 0x00100C09
校准数值在Flash的存储都是16位方式存储,所以都使用 volatile uint16_t*,高16位全部为0
也可以使用 volatile uint32_t* ,结果就是把高16位抹掉,保留低16位,这种设置高16位可能不为0,不知道是否会产生问题。

使用特权

评论回复
评论
haoyupei 2021-3-23 10:29 回复TA
@zyj9490 :是这样。 
zyj9490 2021-3-23 10:06 回复TA
牵涉到一个对齐方式问题,如果是小端方式,低地址放的是变量的低16位字节,如果是大端模式,低地址放的是高位字节,因此指针定义为16位指针时,指针的地址值定义有讲究了,如果指针是32指针时,取出内容后再做高位字节MASK,就简单了。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

34

帖子

1

粉丝