Reputation: 595
I have the following piece of code. It was generated by my IDE and I am trying to understand it.
#define TRGMR (*(volatile union un_trgmr *)0xF0250).trgmr
Here the timer manager is at the location 0xF0250 according to the data sheet. But what I cant understand is the syntax.
union un_trgmr {
unsigned char trgmr;
__BITS8 BIT;
};
I know about pointers. But I really cant understand what exactly is being done. Could someone please help me out?By the way BITS8 is another struct with bitfields as follows:
typedef struct {
unsigned char no0 :1;
unsigned char no1 :1;
unsigned char no2 :1;
unsigned char no3 :1;
unsigned char no4 :1;
unsigned char no5 :1;
unsigned char no6 :1;
unsigned char no7 :1;
} __BITS8;
Upvotes: 5
Views: 500
Reputation: 212959
It's just a way of accessing a memory-mapped register at a fixed address 0xF0250
. You can access individual bits of the registers via the BIT
field of the union, or the whole 8 bit register via the trmgr
field. The #define
just gives you convenient access to the latter, so that you can write, e.g.
TRMGR = 0x3f; // write 0x3f to timer manager register
Note the use of volatile
- this is a common technique with memory-mapped I/O registers to ensure that reads/writes always occur as intended and are not optimised away (as they might be with normal memory locations).
Upvotes: 9