完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
下面是在.h 头文件里对一个32位寄存器的定义,有些地方不明白, 请教一下,先谢谢啦!
1)为什么这里typedef union有4个 struct? 是不是针对不同情况?如果我使用第一个struct,还能不能用其他的? 2)如果我对某一位赋值,我可以使用, 比如PMCONbits.CS2P=1;(因为定义了unsigned CS2P:1;) 但是有些位没有定义,比如unsigned:1;是不是说明该位不能被赋值?如果能,怎么赋值? 3) 能不能用PMCON对整个寄存器赋值,比如PMCON=0xFFFFFF00 4) PMCONCLR是不是所有为置0, PMCONSET所有为置1? #define PMCON PMCON extern volatile unsigned int PMCON __attribute__((section("sfrs"))); typedef union { struct { unsigned RDSP:1; unsigned WRSP:1; unsigned :1; unsigned CS1P:1; unsigned CS2P:1; unsigned ALP:1; unsigned CSF:2; unsigned PTRDEN:1; unsigned PTWREN:1; unsigned PMPTTL:1; unsigned ADRMUX:2; unsigned SIDL:1; unsigned :1; unsigned ON:1; unsigned :1; unsigned DUALBUF:1; unsigned :5; unsigned RDSTART:1; }; struct { unsigned :6; unsigned CSF0:1; unsigned CSF1:1; unsigned :3; unsigned ADRMUX0:1; unsigned ADRMUX1:1; }; struct { unsigned :13; unsigned PSIDL:1; unsigned :1; unsigned PMPEN:1; }; struct { unsigned w:32; }; } __PMCONbits_t; extern volatile __PMCONbits_t PMCONbits __asm__ ("PMCON") __attribute__((section("sfrs"))); extern volatile unsigned int PMCONCLR __attribute__((section("sfrs"))); extern volatile unsigned int PMCONSET __attribute__((section("sfrs"))); extern volatile unsigned int PMCONINV __attribute__((section("sfrs")));
|
|
相关推荐
7个回答
|
|
|
先搞清楚什么是结构体,什么是联合体把
|
|
|
|
|
|
谢谢! 是因为时间的关系,又急需处理,才这样的,如果您明白的话还请能告知一下。 |
|
|
|
|
|
初学者 跟着一起学习下
|
|
|
|
|
|
联合体共用内存
|
|
|
|
|
|
首先第四个结构体决定了该共用体占32个位;然后第一个结构体确认该32的名称如图:有一部分是不能访问的,然后4个结构体的位是有一定的对应关系。这东西我也是现学的 但是理解应该没错。希望能帮到你。
你去csdn论坛搜索“C语言结构体中冒号的用法--C 位域”这个。我没权限发表URL链接 ![]() 关于图的一个解释:24位与32位的对应关系与系统数据的大小端模式有关所以图不一定准确。 |
|
|
|
|
|
共同体内的变量共享内存空间,比如定义一个共同体如下:
union{ int x; struct{ char unit1; char unit2; char unit3; char unit4; }alpha; }FourUnit; 假设是在32位的系统中,x占用的是4个字节,而在struct中的char单元,每个占用1个字节的内存空间,他们是相互共享空间的;假设 FourUnit=10; 则内存里的数值为(内存的存储有大小端存储之分,此处以下图看到的存储方式来分析,在使用共同体的时候需要十分注意,尤其是在代码移植的时候,所以在可移植的代码中,最好不要使用共同体): ___________________________________ type | 字节1 | 字节2 | 字节3 | 字节4 | —————————————————————— int | 00 | 00 | 00 | 10 | __________________________________ struct | 00 | 00 | 00 | 10 | __________________________________ 由此可以看出,当FourUnit=10的时候,x=10;alpha.Unit1=10;alpha.Unit2=00;alpha.Unit3=00;alpha.Unit4=00; 如同一人得道,鸡犬升天一样,只要共同体的值发生改变,则内部相关的变量值将随之也发生改变。 同样,如同一颗老鼠屎坏了一锅粥一样,只要共同体中的某个变量的值发生了改变,则该共同体的值也随之发生改变。 这种联动的关系,就是共同内存空间导致的。 那么在单片机中,共同体担当的作用就是: 1.如果他们之间的配置是互斥的话,可以使用共同体;例如如果寄存器A和B是共用同一个物理存储空间的话,他们之间的关系可以用共同体来表达,寄存器A掌管着功能C,寄存器B掌管着功能D,由于资源有限,功能C和功能D不能够同时开启,则在配置寄存器A或者B的时候,可以相应的关掉寄存器B或A的功能。 2.比较常见的一种是,如MSP单片机中,可以利用共同体来对一个寄存器中的位进行单独的操作。也可以对多位进行一次性操作等。简言之就是将datasheet中的功能配置的位集中在一起,方便配置。你问题中提到的就是这一种用法 |
|
|
|
|
|
1) 四个结构体实际是定义了四种访问方式,编程时有时需要同时修改很多个bit,有时只需要修改一个bit, 这时就可以根据需求使用其中的某一个结构。这四个结构可以随时换着用。
2) 可以赋值,可以用其它使用了这个bit的结构体赋值,或者整体赋值;PMCONbits.s1.CS2P=1或PMCONbits.s4|=0x20; 3) 可以整体赋值,如PMCONbits.s4=0xFFFFFF00; 写法都有问题,应该改成如下形式: #define PMCON PMCON extern volatile unsigned int PMCON __attribute__((section("sfrs"))); typedef union { struct { unsigned RDSP:1; unsigned WRSP:1; unsigned :1; unsigned CS1P:1; unsigned CS2P:1; unsigned ALP:1; unsigned CSF:2; unsigned PTRDEN:1; unsigned PTWREN:1; unsigned PMPTTL:1; unsigned ADRMUX:2; unsigned SIDL:1; unsigned :1; unsigned ON:1; unsigned :1; unsigned DUALBUF:1; unsigned :5; unsigned RDSTART:1; } s1; struct { unsigned :6; unsigned CSF0:1; unsigned CSF1:1; unsigned :3; unsigned ADRMUX0:1; unsigned ADRMUX1:1; } s2; struct { unsigned :13; unsigned PSIDL:1; unsigned :1; unsigned PMPEN:1; } s3; uint32_t s4; } __PMCONbits_t; extern volatile __PMCONbits_t PMCONbits __asm__ ("PMCON") __attribute__((section("sfrs"))); extern volatile unsigned int PMCONCLR __attribute__((section("sfrs"))); extern volatile unsigned int PMCONSET __attribute__((section("sfrs"))); extern volatile unsigned int PMCONINV __attribute__((section("sfrs"))); |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1033 浏览 0 评论
2877 浏览 0 评论
图腾柱PFC无法上升至400V,且电感电流为正弦波形,但是幅值极小
9386 浏览 0 评论
飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接
2898 浏览 0 评论
使用 LinkBoy 将程序导出为 C 语言代码并烧录至 Arduino ESP32 开发板
2302 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 12:21 , Processed in 0.948720 second(s), Total 89, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2343