1、芯片底层位操作的一些写法

重点学习点:


typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus,FunctionalState;

typedef enum {FALSE = 0, TRUE = !FALSE} bool;

typedef enum {RESET = 0, SET = !RESET} FlagStatus;

typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus;

typedef enum {FLAG_NOTSET = 0, FLAG_SET = !FLAG_NOTSET} FLAG_STATUS;

typedef enum {FLAG_FAIL = 0, FLAG_PASS = !FLAG_FAIL} FLAG_PASS_FAIL;



/* bit operations */
#define REG32(addr)                  (*(volatile uint32_t *)(uint32_t)(addr))
#define REG16(addr)                  (*(volatile uint16_t *)(uint32_t)(addr))
#define REG8(addr)                   (*(volatile uint8_t *)(uint32_t)(addr))
#define BIT(x)                       ((uint32_t)((uint32_t)0x01U<<(x)))
#define BITS(start, end)             ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end))))
#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start))



/**
  * @}
  */


#define U8_MAX     ((u8)255)
#define S8_MAX     ((s8)127)
#define S8_MIN     ((s8)-128)
#define U16_MAX    ((u16)65535u)
#define S16_MAX    ((s16)32767)
#define S16_MIN    ((s16)-32768)
#define U32_MAX    ((u32)4294967295uL)
#define S32_MAX    ((s32)2147483647)
#define S32_MIN    ((s32)-2147483648)


/**
 * @brief Exported constants and macro
 */
#define IS_CONTROL_STATUS(STATUS) ((STATUS == DISABLE) || (STATUS == ENABLE))

#define wb(addr, value)     (*((u8  volatile *) (addr)) = value)
#define rb(addr)            (*((u8  volatile *) (addr)))
#define whw(addr, value)    (*((u16 volatile *) (addr)) = value)
#define rhw(addr)           (*((u16 volatile *) (addr)))
#define ww(addr, value)     (*((u32 volatile *) (addr)) = value)
#define rw(addr)            (*((u32 volatile *) (addr)))

一下是完整代码

#ifdef __cplusplus
 extern "C" {
#endif


/** @addtogroup Library_configuration_section
  * @{
  */
/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application

   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */
#if !defined  (HSE_VALUE)
#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */

/**
 * @brief In the following line adjust the External High Speed oscillator (HSE) Startup
   Timeout value
   */
#if !defined  (HSE_STARTUP_TIMEOUT)
#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x500) /*!< Time out for HSE start up */
#endif /* HSE_STARTUP_TIMEOUT */

/**
 * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup
   Timeout value
   */
#if !defined  (HSI_STARTUP_TIMEOUT)
#define HSI_STARTUP_TIMEOUT   ((uint16_t)0x5000) /*!< Time out for HSI start up */
#endif /* HSI_STARTUP_TIMEOUT */

#if !defined  (HSI_VALUE)
#define HSI_VALUE  ((uint32_t)HSE_VALUE) /*!< Value of the Internal High Speed oscillator in Hz.
                                             The real value may vary depending on the variations
                                             in voltage and temperature.  */
#endif /* HSI_VALUE */

#if !defined  (LSE_VALUE)
#define LSE_VALUE  ((uint32_t)32768)    /*!< Value of the External Low Speed oscillator in Hz */
#endif /* LSE_VALUE */

#if !defined  (LSI_VALUE)
#define LSI_VALUE  ((uint32_t)LSE_VALUE)    /*!< Value of the Internal Low Speed oscillator in Hz
                                             The real value may vary depending on the variations
                                             in voltage and temperature.  */
#endif /* LSI_VALUE */
/**
  * @}
  */


/** @addtogroup Configuration_section_for_CMSIS
  * @{
  */

/**
 * @brief Interrupt Number Definition
 */
#define __CM0_REV                 0 /*!< Core Revision r0p0                            */
#define __MPU_PRESENT             0 /*!< Do not provide MPU                            */
#define __NVIC_PRIO_BITS          2 /*!< Uses 2 Bits for the Priority Levels           */
#define __Vendor_SysTickConfig    0 /*!< Set to 1 if different SysTick Config is used  */

/*!< Interrupt Number Definition */
typedef enum IRQn
{
/******  Cortex-M0 Processor Exceptions Numbers ******************************************************/
  NMI_IRQn                    = -14,    /*!< 2 Non Maskable Interrupt                                */
  HardFault_IRQn              = -13,    /*!< 3 Cortex-M0 Hard Fault Interrupt                        */
  SVC_IRQn                    = -5,     /*!< 11 Cortex-M0 SV Call Interrupt                          */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M0 Pend SV Interrupt                          */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M0 System Tick Interrupt                      */
/******  SY9XX  specific Interrupt Numbers *************************************/
  CKRDY_IRQn                  = 0,      /*!< Clock Ready Interrupt                                   */
  WWDG_IRQn                   = 1,      /*!< Window WatchDog Interrupt                               */
  RTC_LVD_IRQn                = 2,      /*!< RTC&LVD Interrupt                                       */
  XIP_IRQn                    = 3,      /*!< XIP Interrupt                                           */
  EVWUP_IRQn                  = 4,      /*!< EXTI Event Wakeup Detection Interrupt                   */
  LPWUP_POR_IRQn              = 5,      /*!< WAKEUP pin and POR Interrupt                            */
  EXTI0_1_IRQn                = 6,      /*!< EXTI Line 0,1 Interrupts                                */
  EXTI2_3_IRQn                = 7,      /*!< EXTI Line 2,3 Interrupts                                */
  EXTI4_TO_15_IRQn            = 8,      /*!< EXTI Line 4~15 Interrupts                               */
  MIC_IRQn                    = 9,      /*!< MIC Interrupts                                          */
  PWS0_IRQn                   = 10,     /*!< PWS0 Interrupt                                          */
  ADC_IRQn                    = 10,     /*!< ADC Interrupt                                           */
  PWS1_IRQn                   = 11,     /*!< PWS1 Interrupt                                          */
  VCC33_UV_OV_IRQn            = 12,     /*!< VCC33_UV  or OV Interrupts                              */
  BAT_UV_IRQn                 = 13,     /*!< BAT_UV Interrupts                                       */
  USB_UV_IRQn                 = 14,     /*!< USB_UV Interrupts                                       */
  USB_DET_IRQn                = 15,     /*!< BAT_DET Interrupts                                      */
  EXT0PLUG_IRQn               = 16,     /*!< EXT0PLUG Interrupts                                     */
  EXT1PLUG_IRQn               = 17,     /*!< EXT1PLUG Interrupts                                     */
  EBFTM_IRQn                  = 18,     /*!< EBFTM Interrupts                                        */
  DUAL_TIMER_IRQn             = 19,     /*!< DUAL TIMER Interrupts                                   */                       
  TWI0_IRQn                   = 20,     /*!< TWI0 Interrupt                                          */
  TWI1_IRQn                   = 21,     /*!< TWI1 Interrupt                                          */
  SPI0_IRQn                   = 22,     /*!< SPI0 Interrupt                                          */
  SPI1_IRQn                   = 23,     /*!< SPI1 Interrupt                                          */
  UART0_IRQn                  = 24,     /*!< UART0 Interrupt                                         */
  UART1_IRQn                  = 25,     /*!< UART1 Interrupt                                         */
  UART2_IRQn                  = 26,     /*!< UART2 Interrupt                                         */
  PDMA_CH0_IRQn               = 27,     /*!< PDMA Channel 0 Interrupt                                */
  PDMA_CH1_IRQn               = 28,     /*!< PDMA Channel 1 Interrupt                                */
  PDMA_CH2_IRQn               = 29,     /*!< PDMA Channel 2 Interrupt                                */
  PDMA_CH3_IRQn               = 30,     /*!< PDMA Channel 3 Interrupt                                */
  PDMA_CH4_5_6_7_IRQn         = 31      /*!< PDMA Channel 4,5,6,7 Interrupt                          */
} IRQn_Type;


#include "core_cm0.h"
#include <stdint.h>

/** @addtogroup Exported_macros
  * @{
  */
#define UNUSED(X) (void)X
#define Assert_Param(expr) ((void)0)
#define assert_param(expr) ((void)0)
/**
  * @}
  */

/** @addtogroup Exported_Types
  * @{
  */
typedef signed long  s32;
typedef signed short s16;
typedef signed char  s8;

typedef const int32_t sc32;           /*!< Read Only                                                        */
typedef const int16_t sc16;           /*!< Read Only                                                        */
typedef const int8_t  sc8;            /*!< Read Only                                                        */

typedef __IO int32_t vs32;
typedef __IO int16_t vs16;
typedef __IO int8_t  vs8;

typedef __I int32_t vsc32;            /*!< Read Only                                                        */
typedef __I int16_t vsc16;            /*!< Read Only                                                        */
typedef __I int8_t  vsc8;             /*!< Read Only                                                        */

typedef unsigned long  u32;
typedef unsigned short u16;
typedef unsigned char  u8;

typedef unsigned long  const uc32;    /*!< Read Only                                                        */
typedef unsigned short const uc16;    /*!< Read Only                                                        */
typedef unsigned char  const uc8;     /*!< Read Only                                                        */

typedef __IO uint32_t  vu32;
typedef __IO uint16_t  vu16;
typedef __IO uint8_t   vu8;

typedef __I uint32_t vuc32;           /*!< Read Only                                                        */
typedef __I uint16_t vuc16;           /*!< Read Only                                                        */
typedef __I uint8_t  vuc8;            /*!< Read Only                                                        */


typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus,FunctionalState;

typedef enum {FALSE = 0, TRUE = !FALSE} bool;

typedef enum {RESET = 0, SET = !RESET} FlagStatus;

typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus;

typedef enum {FLAG_NOTSET = 0, FLAG_SET = !FLAG_NOTSET} FLAG_STATUS;

typedef enum {FLAG_FAIL = 0, FLAG_PASS = !FLAG_FAIL} FLAG_PASS_FAIL;



/* bit operations */
#define REG32(addr)                  (*(volatile uint32_t *)(uint32_t)(addr))
#define REG16(addr)                  (*(volatile uint16_t *)(uint32_t)(addr))
#define REG8(addr)                   (*(volatile uint8_t *)(uint32_t)(addr))
#define BIT(x)                       ((uint32_t)((uint32_t)0x01U<<(x)))
#define BITS(start, end)             ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end))))
#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start))



/**
  * @}
  */


#define U8_MAX     ((u8)255)
#define S8_MAX     ((s8)127)
#define S8_MIN     ((s8)-128)
#define U16_MAX    ((u16)65535u)
#define S16_MAX    ((s16)32767)
#define S16_MIN    ((s16)-32768)
#define U32_MAX    ((u32)4294967295uL)
#define S32_MAX    ((s32)2147483647)
#define S32_MIN    ((s32)-2147483648)


/**
 * @brief Exported constants and macro
 */
#define IS_CONTROL_STATUS(STATUS) ((STATUS == DISABLE) || (STATUS == ENABLE))

#define wb(addr, value)     (*((u8  volatile *) (addr)) = value)
#define rb(addr)            (*((u8  volatile *) (addr)))
#define whw(addr, value)    (*((u16 volatile *) (addr)) = value)
#define rhw(addr)           (*((u16 volatile *) (addr)))
#define ww(addr, value)     (*((u32 volatile *) (addr)) = value)
#define rw(addr)            (*((u32 volatile *) (addr)))

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林时小卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值