bluesea
1.sizeof用法:
UART1Write((u8*)"Starting.....",sizeof("Starting.....")) ;
void UART1Write(u8* data,u16 len)
2.struct用法
a.寄存器作为结构体,struct中含enum
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef struct{ uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. It ranges from 1 to 1024. */ uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. This parameter can be a value of @ref CAN_operating_mode */
uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization. This parameter can be a value of @ref CAN_synchronisation_jump_width */
uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit Segment 1. This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */
uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2. This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. This parameter can be set either to ENABLE or DISABLE. */ FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. This parameter can be set either to ENABLE or DISABLE. */
FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE. */
FunctionalState CAN_NART; /*!< Enable or disable the no-automatic retransmission mode. This parameter can be set either to ENABLE or DISABLE. */
FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. This parameter can be set either to ENABLE or DISABLE. */
FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. This parameter can be set either to ENABLE or DISABLE. */} CAN_InitTypeDef;
CAN_InitTypeDef CAN_InitStructure;
CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5;
再看这段程序对应的底层函数
if (CAN_InitStruct->CAN_TTCM == ENABLE) { CANx->MCR |= MCR_TTCM; } else { CANx->MCR &= ~MCR_TTCM; }
#define MCR_TTCM ((uint32_t)0x00000080) /* time triggered communication */
CANx:uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
再看看共用体内嵌结构体,
typedef unsigned char byte;
typedef union
{ byte Byte; struct { byte PS0 :1; /* Prescale Divisor Select Bit 0 */ byte PS1 :1; /* Prescale Divisor Select Bit 1 */ byte PS2 :1; /* Prescale Divisor Select Bit 2 */ byte CLKSA :1; /* Clock Source Select A */ byte CLKSB :1; /* Clock Source Select B */ byte CPWMS :1; /* Center-Aligned PWM Select */ byte TOIE :1; /* Timer Overflow Interrupt Enable */ byte TOF :1; /* Timer Overflow Flag */ } Bits; struct { byte grpPS :3; byte grpCLKSx :2; byte :1; byte :1; byte :1; } MergedBits; } TPM1SCSTR;
extern volatile TPM1SCSTR _TPM1SC @0x00000020;
volatile TPM1SCSTR _TPM1SC; #define TPM1SC _TPM1SC.Byte#define TPM1SC_PS0 _TPM1SC.Bits.PS0#define TPM1SC_PS1 _TPM1SC.Bits.PS1#define TPM1SC_PS2 _TPM1SC.Bits.PS2#define TPM1SC_CLKSA _TPM1SC.Bits.CLKSA#define TPM1SC_CLKSB _TPM1SC.Bits.CLKSB#define TPM1SC_CPWMS _TPM1SC.Bits.CPWMS#define TPM1SC_TOIE _TPM1SC.Bits.TOIE#define TPM1SC_TOF _TPM1SC.Bits.TOF#define TPM1SC_PS _TPM1SC.MergedBits.grpPS#define TPM1SC_CLKSx _TPM1SC.MergedBits.grpCLKSx
#define TPM1SC_PS0_MASK 1#define TPM1SC_PS1_MASK 2#define TPM1SC_PS2_MASK 4#define TPM1SC_CLKSA_MASK 8#define TPM1SC_CLKSB_MASK 16#define TPM1SC_CPWMS_MASK 32#define TPM1SC_TOIE_MASK 64#define TPM1SC_TOF_MASK 128#define TPM1SC_PS_MASK 7#define TPM1SC_PS_BITNUM 0#define TPM1SC_CLKSx_MASK 24#define TPM1SC_CLKSx_BITNUM 3
3.#ifndef #define #endif的用法
http://blog.ednchina.com/tianlebo/14358/message.aspx