format utf-8

This commit is contained in:
yanmowudi 2021-05-06 10:42:41 +08:00
parent c00300d5f4
commit 2c05296948
46 changed files with 8127 additions and 8039 deletions

View File

@ -108,11 +108,11 @@ typedef enum IRQn
#include "core_cm4.h" /* Cortex-M0 processor and core peripherals */
#include "system_SWM320.h"
/******************************************************************************/
/* Device Specific Peripheral registers structures */
/******************************************************************************/
typedef struct {
typedef struct
{
__IO uint32_t CLKSEL; //Clock Select
__IO uint32_t CLKDIV;
@ -181,7 +181,6 @@ typedef struct {
__IO uint32_t ADC1IN7;
} SYS_TypeDef;
#define SYS_CLKSEL_LFCK_Pos 0 //Low Frequency Clock Source 0 LRC 1 PLL
#define SYS_CLKSEL_LFCK_Msk (0x01 << SYS_CLKSEL_LFCK_Pos)
#define SYS_CLKSEL_HFCK_Pos 1 //High Frequency Clock Source 0 HRC 1 XTAL
@ -313,7 +312,6 @@ typedef struct {
#define SYS_LRCTRIM1_U_Pos 0 //LRC U调控制位
#define SYS_LRCTRIM1_U_Msk (0x7FFF << SYS_LRCTRIM1_U_Pos)
#define SYS_HRCCR_DBL_Pos 0 //Double Frequency 0 20MHz 1 40MHz
#define SYS_HRCCR_DBL_Msk (0x01 << SYS_HRCCR_DBL_Pos)
#define SYS_HRCCR_OFF_Pos 1 //High speed RC Off
@ -329,8 +327,8 @@ typedef struct {
#define SYS_PLLCR_OFF_Pos 2
#define SYS_PLLCR_OFF_Msk (0x01 << SYS_PLLCR_OFF_Pos)
#define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器
//VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
#define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器 \
//VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV \
//PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
#define SYS_PLLDIV_FBDIV_Msk (0x1FF << SYS_PLLDIV_FBDIV_Pos)
#define SYS_PLLDIV_ADDIV_Pos 9 //ADC时钟基即VCO输出分频后的时钟经ADDIV分频后作为ADC的转换时钟
@ -364,10 +362,8 @@ typedef struct {
#define SYS_ADC1IN7_IOON_Pos 4 //ADC1模块模拟通道7所用IO开关
#define SYS_ADC1IN7_IOON_Msk (0x01 << SYS_ADC1IN7_IOON_Pos)
typedef struct {
typedef struct
{
__IO uint32_t PORTA_SEL; //给PORTA_SEL[2n+2:2n]赋相应的值将PORTA.PINn引脚配置成GPIO、模拟、数字等功能
//当赋值为PORTA_PINn_FUNMUX时PORTA.PINn引脚可通过PORTA_MUX寄存器连接到各种数字外设
__IO uint32_t PORTB_SEL;
@ -501,7 +497,6 @@ typedef struct {
__IO uint32_t PORTP_INEN;
} PORT_TypeDef;
#define PORT_PORTA_PULLU_PIN0_Pos 0
#define PORT_PORTA_PULLU_PIN0_Msk (0x01 << PORT_PORTA_PULLU_PIN0_Pos)
#define PORT_PORTA_PULLU_PIN1_Pos 1
@ -1141,10 +1136,8 @@ typedef struct {
#define PORT_PORTP_INEN_PIN23_Pos 23
#define PORT_PORTP_INEN_PIN23_Msk (0x01 << PORT_PORTP_INEN_PIN23_Pos)
typedef struct {
typedef struct
{
__IO uint32_t DATA;
#define PIN0 0
#define PIN1 1
@ -1189,7 +1182,6 @@ typedef struct {
__IO uint32_t INTCLR; //写1清除中断标志只对边沿触发中断有用
} GPIO_TypeDef;
#define GPIO_DATA_PIN0_Pos 0
#define GPIO_DATA_PIN0_Msk (0x01 << GPIO_DATA_PIN0_Pos)
#define GPIO_DATA_PIN1_Pos 1
@ -1631,10 +1623,8 @@ typedef struct {
#define GPIO_INTCLR_PIN23_Pos 23
#define GPIO_INTCLR_PIN23_Msk (0x01 << GPIO_INTCLR_PIN23_Pos)
typedef struct {
typedef struct
{
__IO uint32_t LDVAL; //定时器加载值,使能后定时器从此数值开始向下递减计数
__I uint32_t CVAL; //定时器当前值LDVAL-CVAL 可计算出计时时长
@ -1642,7 +1632,6 @@ typedef struct {
__IO uint32_t CTRL;
} TIMR_TypeDef;
#define TIMR_CTRL_EN_Pos 0 //此位赋1导致TIMR从LDVAL开始向下递减计数
#define TIMR_CTRL_EN_Msk (0x01 << TIMR_CTRL_EN_Pos)
#define TIMR_CTRL_CLKSRC_Pos 1 //时钟源0 内部系统时钟 1 外部引脚脉冲计数
@ -1650,8 +1639,8 @@ typedef struct {
#define TIMR_CTRL_CASCADE_Pos 2 //1 TIMRx的计数时钟为TIMRx-1的溢出信号
#define TIMR_CTRL_CASCADE_Msk (0x01 << TIMR_CTRL_CASCADE_Pos)
typedef struct {
typedef struct
{
__IO uint32_t PCTRL; //Pulse Control脉宽测量模块控制寄存器
__I uint32_t PCVAL; //脉宽测量定时器当前值
@ -1665,7 +1654,6 @@ typedef struct {
__IO uint32_t HALT;
} TIMRG_TypeDef;
#define TIMRG_PCTRL_EN_Pos 0 //开始测量脉宽脉宽内32位计数器从0开始向上计数
#define TIMRG_PCTRL_EN_Msk (0x01 << TIMRG_PCTRL_EN_Pos)
#define TIMRG_PCTRL_HIGH_Pos 1 //0 测量低电平长度 1 测量高电平长度
@ -1716,10 +1704,8 @@ typedef struct {
#define TIMRG_HALT_TIMR5_Pos 5
#define TIMRG_HALT_TIMR5_Msk (0x01 << TIMRG_HALT_TIMR5_Pos)
typedef struct {
typedef struct
{
__IO uint32_t DATA;
__IO uint32_t CTRL;
@ -1730,14 +1716,14 @@ typedef struct {
__IO uint32_t LINCR;
union {
union
{
__IO uint32_t CTSCR;
__IO uint32_t RTSCR;
};
} UART_TypeDef;
#define UART_DATA_DATA_Pos 0
#define UART_DATA_DATA_Msk (0x1FF << UART_DATA_DATA_Pos)
#define UART_DATA_VALID_Pos 9 //当DATA字段有有效的接收数据时该位硬件置1读取数据后自动清零
@ -1804,9 +1790,9 @@ typedef struct {
#define UART_BAUD_RXIF_Msk (0x01 << UART_BAUD_RXIF_Pos)
#define UART_BAUD_ABREN_Pos 23 //Auto Baudrate Enable写1启动自动波特率校准完成后自动清零
#define UART_BAUD_ABREN_Msk (0x01 << UART_BAUD_ABREN_Pos)
#define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit用于计算波特率的检测位长0 1位通过测起始位 脉宽计算波特率要求发送端发送0xFF
// 1 2位通过测起始位加1位数据位脉宽计算波特率要求发送端发送0xFE
// 1 4位通过测起始位加3位数据位脉宽计算波特率要求发送端发送0xF8
#define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit用于计算波特率的检测位长0 1位通过测起始位 脉宽计算波特率要求发送端发送0xFF \
// 1 210xFE \
// 1 430xF8 \
// 1 8位通过测起始位加7位数据位脉宽计算波特率要求发送端发送0x80
#define UART_BAUD_ABRBIT_Msk (0x03 << UART_BAUD_ABRBIT_Pos)
#define UART_BAUD_ABRERR_Pos 26 //Auto Baudrate Error0 自动波特率校准成功 1 自动波特率校准失败
@ -1850,10 +1836,8 @@ typedef struct {
#define UART_RTSCR_STAT_Pos 8 //RTS信号的当前状态
#define UART_RTSCR_STAT_Msk (0x01 << UART_RTSCR_STAT_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t DATA;
@ -1865,7 +1849,6 @@ typedef struct {
__IO uint32_t IF;
} SPI_TypeDef;
#define SPI_CTRL_CLKDIV_Pos 0 //Clock Divider, SPI工作时钟 = SYS_Freq/pow(2, CLKDIV+2)
#define SPI_CTRL_CLKDIV_Msk (0x07 << SPI_CTRL_CLKDIV_Pos)
#define SPI_CTRL_EN_Pos 3
@ -1940,10 +1923,8 @@ typedef struct {
#define SPI_IF_FTC_Pos 9 //Frame Transmit CompleteWTC置位时若TX FIFO是空的则FTC置位
#define SPI_IF_FTC_Msk (0x01 << SPI_IF_FTC_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CLKDIV; //[15:0] 须将内部工作频率分到SCL频率的5倍即CLKDIV = SYS_Freq/5/SCL_Freq - 1
__IO uint32_t CTRL;
@ -1961,7 +1942,6 @@ typedef struct {
__IO uint32_t SLVRX;
} I2C_TypeDef;
#define I2C_CTRL_MSTIE_Pos 6
#define I2C_CTRL_MSTIE_Msk (0x01 << I2C_CTRL_MSTIE_Pos)
#define I2C_CTRL_EN_Pos 7
@ -2024,10 +2004,8 @@ typedef struct {
#define I2C_SLVIF_ACTIVE_Pos 6 //slave 有效
#define I2C_SLVIF_ACTIVE_Msk (0x01 << I2C_SLVIF_ACTIVE_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t START;
@ -2036,7 +2014,8 @@ typedef struct {
__IO uint32_t IF;
struct {
struct
{
__IO uint32_t STAT;
__IO uint32_t DATA;
@ -2055,7 +2034,6 @@ typedef struct {
__IO uint32_t CALIBEN;
} ADC_TypeDef;
#define ADC_CTRL_CH0_Pos 0 //通道选中
#define ADC_CTRL_CH0_Msk (0x01 << ADC_CTRL_CH0_Pos)
#define ADC_CTRL_CH1_Pos 1
@ -2259,10 +2237,8 @@ typedef struct {
#define ADC_CALIBEN_K_Pos 1
#define ADC_CALIBEN_K_Msk (0x01 << ADC_CALIBEN_K_Pos)
typedef struct {
typedef struct
{
__IO uint32_t MODE; //0 普通模式A、B两路输出互相独立
//1 互补模式A、B两路输出都由PERA、HIGHA控制B路输出与A路输出极性相反且DZA、DZB控制A、B路输出上升沿推迟时间
//2 单次模式,同普通模式,但一个周期后自动停止
@ -2284,14 +2260,13 @@ typedef struct {
__IO uint32_t INIOUT; //Init Output level初始输出电平
} PWM_TypeDef;
#define PWM_INIOUT_PWMA_Pos 0
#define PWM_INIOUT_PWMA_Msk (0x01 << PWM_INIOUT_PWMA_Pos)
#define PWM_INIOUT_PWMB_Pos 1
#define PWM_INIOUT_PWMB_Msk (0x01 << PWM_INIOUT_PWMB_Pos)
typedef struct {
typedef struct
{
__IO uint32_t FORCEH;
__IO uint32_t ADTRG0A;
@ -2327,7 +2302,6 @@ typedef struct {
__IO uint32_t IRS; //Interrupt Raw Stat
} PWMG_TypeDef;
#define PWMG_FORCEH_PWM0_Pos 0
#define PWMG_FORCEH_PWM0_Msk (0x01 << PWMG_FORCEH_PWM0_Pos)
#define PWMG_FORCEH_PWM1_Pos 1
@ -2396,7 +2370,6 @@ typedef struct {
#define PWMG_CHEN_PWM5B_Pos 11
#define PWMG_CHEN_PWM5B_Msk (0x01 << PWMG_CHEN_PWM5B_Pos)
#define PWMG_IE_NEWP0A_Pos 0
#define PWMG_IE_NEWP0A_Msk (0x01 << PWMG_IE_NEWP0A_Pos)
#define PWMG_IE_NEWP0B_Pos 1
@ -2601,10 +2574,8 @@ typedef struct {
#define PWMG_IRS_HALT_Pos 24
#define PWMG_IRS_HALT_Msk (0x01 << PWMG_IRS_HALT_Pos)
typedef struct {
typedef struct
{
__IO uint32_t EN; //[0] ENABLE
__IO uint32_t IE; //只有为1时IF[CHx]在DMA传输结束时才能变为1否则将一直保持在0
@ -2615,7 +2586,8 @@ typedef struct {
uint32_t RESERVED[12];
struct {
struct
{
__IO uint32_t CR;
__IO uint32_t AM; //Adress Mode
@ -2644,7 +2616,6 @@ typedef struct {
} CH[3];
} DMA_TypeDef;
#define DMA_IE_CH0_Pos 0
#define DMA_IE_CH0_Msk (0x01 << DMA_IE_CH0_Pos)
#define DMA_IE_CH1_Pos 1
@ -2712,10 +2683,8 @@ typedef struct {
#define DMA_AM_BURST_Pos 16
#define DMA_AM_BURST_Msk (0x01 << DMA_AM_BURST_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CR; //Control Register
__O uint32_t CMD; //Command Register
@ -2744,8 +2713,10 @@ typedef struct {
__IO uint32_t TXERR; //TX错误计数
union {
struct { //在复位时可读写,正常工作模式下不可访问
union
{
struct
{ //在复位时可读写,正常工作模式下不可访问
__IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器
__IO uint32_t AMR[4]; //Acceptance Mask Register, 验收屏蔽寄存器对应位写0ID必须和验收寄存器匹配
@ -2753,14 +2724,17 @@ typedef struct {
uint32_t RESERVED[5];
} FILTER;
union { //在正常工作模式下可读写,复位时不可访问
struct {
union
{ //在正常工作模式下可读写,复位时不可访问
struct
{
__O uint32_t INFO;
__O uint32_t DATA[12];
} TXFRAME;
struct {
struct
{
__I uint32_t INFO;
__I uint32_t DATA[12];
@ -2772,14 +2746,14 @@ typedef struct {
uint32_t RESERVED3[66];
struct { //TXFRAME的读接口
struct
{ //TXFRAME的读接口
__I uint32_t INFO;
__I uint32_t DATA[12];
} TXFRAME_R;
} CAN_TypeDef;
#define CAN_CR_RST_Pos 0
#define CAN_CR_RST_Msk (0x01 << CAN_CR_RST_Pos)
#define CAN_CR_LOM_Pos 1 //Listen Only Mode
@ -2879,10 +2853,8 @@ typedef struct {
#define CAN_INFO_FF_Pos 7 //Frame Format0 标准帧格式 1 扩展帧格式
#define CAN_INFO_FF_Msk (0x01 << CAN_INFO_FF_Pos)
typedef struct {
typedef struct
{
__IO uint32_t IE; //[0] 为0的时候IF[0]维持为0
__IO uint32_t IF; //[0] 当完成指定长度的数据传输时置1写1清零
@ -2900,16 +2872,15 @@ typedef struct {
__IO uint32_t PRECMDV; //在MPU接口中发送数据前RS拉低的那一拍数据总线上的值
} LCD_TypeDef;
#define LCD_START_GO_Pos 1 //写1开始传输数据数据传输结束后自动清零
#define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos)
#define LCD_START_BURST_Pos 2
#define LCD_START_BURST_Msk (0x01 << LCD_START_BURST_Pos)
#define LCD_CR0_VPIX_Pos 0 //当portrait为0时表示垂直方向的像素个数0表示1个最大为767
#define LCD_CR0_VPIX_Pos 0 //当portrait为0时表示垂直方向的像素个数0表示1个最大为767 \
//当portrait为1时表示水平方向的像素个数0表示1个最大为767
#define LCD_CR0_VPIX_Msk (0x3FF << LCD_CR0_VPIX_Pos)
#define LCD_CR0_HPIX_Pos 10 //当portrait为0时表示水平方向的像素个数0表示1个最大为1023
#define LCD_CR0_HPIX_Pos 10 //当portrait为0时表示水平方向的像素个数0表示1个最大为1023 \
//当portrait为1时表示垂直方向的像素个数0表示1个最大为1023
#define LCD_CR0_HPIX_Msk (0x3FF << LCD_CR0_HPIX_Pos)
#define LCD_CR0_DCLK_Pos 20 //0 DOTCLK一直翻转 1 DOTCLK在空闲时停在1
@ -2930,10 +2901,8 @@ typedef struct {
#define LCD_CR1_DCLKINV_Pos 26 //1 输出DOTCLK反向应用于用DOTCLK下降沿采样数据的屏
#define LCD_CR1_DCLKINV_Msk (0x01 << LCD_CR1_DCLKINV_Pos)
typedef struct {
typedef struct
{
__IO uint32_t DMA_MEM_ADDR;
__IO uint32_t BLK; //Block Size and Count
@ -2965,7 +2934,6 @@ typedef struct {
__IO uint32_t MAXCURR;
} SDIO_TypeDef;
#define SDIO_BLK_SIZE_Pos 0 //0x200 512字节 0x400 1024字节 0x800 2048字节
#define SDIO_BLK_SIZE_Msk (0xFFF << SDIO_BLK_SIZE_Pos)
#define SDIO_BLK_COUNT_Pos 16 //0 Stop Transfer 1 1块 2 2块 ... ...
@ -3149,10 +3117,8 @@ typedef struct {
#define SDIO_IM_RESPERR_Pos 28
#define SDIO_IM_RESPERR_Msk (0x01 << SDIO_IM_RESPERR_Pos)
typedef struct {
typedef struct
{
__IO uint32_t DATA;
__IO uint32_t ADDR;
__IO uint32_t ERASE;
@ -3164,7 +3130,6 @@ typedef struct {
__IO uint32_t STAT;
} FLASH_Typedef;
#define FLASH_ERASE_REQ_Pos 31
#define FLASH_ERASE_REQ_Msk (0x01u << FLASH_ERASE_REQ_Pos)
@ -3182,14 +3147,11 @@ typedef struct {
#define FALSH_STAT_FIFO_FULL_Pos 4
#define FLASH_STAT_FIFO_FULL_Msk (0x01 << FALSH_STAT_FIFO_FULL_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CR;
} SRAMC_TypeDef;
#define SRAMC_CR_RWTIME_Pos 0 //读写操作持续多少个时钟周期。0表示1个时钟周期。最小设置为4
#define SRAMC_CR_RWTIME_Msk (0x0F << SRAMC_CR_RWTIME_Pos)
#define SRAMC_CR_BYTEIF_Pos 4 //外部SRAM数据宽度0 16位 1 8位
@ -3197,9 +3159,8 @@ typedef struct {
#define SRAMC_CR_HBLBDIS_Pos 5 //1 ADDR[23:22]为地址线 0 ADDR[23]为高字节使能ADDR[22]为低字节使能
#define SRAMC_CR_HBLBDIS_Msk (0x01 << SRAMC_CR_HBLBDIS_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CR0;
__IO uint32_t CR1;
@ -3213,7 +3174,6 @@ typedef struct {
__IO uint32_t REFDONE; //[0] Frefresh Done上电初始化完成
} SDRAMC_TypeDef;
#define SDRAMC_CR0_BURSTLEN_Pos 0 //必须取2表示Burst Length为4
#define SDRAMC_CR0_BURSTLEN_Msk (0x07 << SDRAMC_CR0_BURSTLEN_Pos)
#define SDRAMC_CR0_CASDELAY_Pos 4 //CAS Latency 2 2 3 3
@ -3254,10 +3214,8 @@ typedef struct {
#define SDRAMC_LATCH_WAITST_Pos 2
#define SDRAMC_LATCH_WAITST_Msk (0x01 << SDRAMC_LATCH_WAITST_Pos)
typedef struct {
typedef struct
{
__IO uint32_t IE;
__IO uint32_t IF; //写1清零
@ -3271,7 +3229,6 @@ typedef struct {
__IO uint32_t CMD;
} NORFLC_TypeDef;
#define NORFLC_IE_FINISH_Pos 0
#define NORFLC_IE_FINISH_Msk (0x01 << NORFLC_IE_FINISH_Pos)
#define NORFLC_IE_TIMEOUT_Pos 1
@ -3299,10 +3256,8 @@ typedef struct {
#define NORFLC_CMD_CMD_Pos 16 //需要执行的命令0 READ 1 RESET 2 AUTOMATIC SELECT 3 PROGRAM 4 CHIP ERASE 5 SECTOR ERASE
#define NORFLC_CMD_CMD_Msk (0x07 << NORFLC_CMD_CMD_Pos)
typedef struct {
typedef struct
{
__IO uint32_t CR;
__O uint32_t DATAIN;
@ -3312,7 +3267,6 @@ typedef struct {
__I uint32_t RESULT;
} CRC_TypeDef;
#define CRC_CR_EN_Pos 0
#define CRC_CR_EN_Msk (0x01 << CRC_CR_EN_Pos)
#define CRC_CR_OREV_Pos 1 //输出结果是否翻转
@ -3324,10 +3278,8 @@ typedef struct {
#define CRC_CR_IBITS_Pos 4 //输入数据有效位数 0 32位 1 16位 2 8位
#define CRC_CR_IBITS_Msk (0x03 << CRC_CR_IBITS_Pos)
typedef struct {
typedef struct
{
__IO uint32_t MINSEC; //分秒计数
__IO uint32_t DATHUR; //日时计数
@ -3355,7 +3307,6 @@ typedef struct {
__IO uint32_t TRIMM; //时钟微调整
} RTC_TypeDef;
#define RTC_LOAD_TIME_Pos 0
#define RTC_LOAD_TIME_Msk (0x01 << RTC_LOAD_TIME_Pos)
#define RTC_LOAD_ALARM_Pos 1
@ -3425,16 +3376,14 @@ typedef struct {
#define RTC_TRIM_DEC_Pos 8
#define RTC_TRIM_DEC_Msk (0x01 << RTC_TRIM_DEC_Pos)
#define RTC_TRIMM_CYCLE_Pos 0 //用于计数周期微调如果INC为1则第n个计数周期调整为(32768±ADJ)+1,否则调整为(32768±ADJ)-1
#define RTC_TRIMM_CYCLE_Pos 0 //用于计数周期微调如果INC为1则第n个计数周期调整为(32768±ADJ)+1,否则调整为(32768±ADJ)-1 \
//cycles=0时不进行微调整cycles=1则n为2cycles=7则n为8以此类推
#define RTC_TRIMM_CYCLE_Msk (0x07 << RTC_TRIMM_CYCLE_Pos)
#define RTC_TRIMM_INC_Pos 3
#define RTC_TRIMM_INC_Msk (0x01 << RTC_TRIMM_INC_Pos)
typedef struct {
typedef struct
{
__IO uint32_t LOAD; //喂狗使计数器装载LOAD值
__I uint32_t VALUE;
@ -3446,13 +3395,11 @@ typedef struct {
__IO uint32_t FEED; //写0x55喂狗
} WDT_TypeDef;
#define WDT_CR_EN_Pos 0
#define WDT_CR_EN_Msk (0x01 << WDT_CR_EN_Pos)
#define WDT_CR_RSTEN_Pos 1
#define WDT_CR_RSTEN_Msk (0x01 << WDT_CR_RSTEN_Pos)
/******************************************************************************/
/* Peripheral memory map */
/******************************************************************************/
@ -3529,7 +3476,6 @@ typedef struct {
#define CAN_BASE (APB_BASE + 0x20000)
/******************************************************************************/
/* Peripheral declaration */
/******************************************************************************/
@ -3596,11 +3542,8 @@ typedef struct {
#define SDRAMC ((SDRAMC_TypeDef *)SDRAMC_BASE)
typedef void (*Func_void_void)(void);
#include "SWM320_port.h"
#include "SWM320_gpio.h"
#include "SWM320_exti.h"
@ -3622,5 +3565,4 @@ typedef void (* Func_void_void) (void);
#include "SWM320_rtc.h"
#include "SWM320_wdt.h"
#endif //__SWM320_H__

View File

@ -21,7 +21,6 @@
#include <stdint.h>
#include "SWM320.h"
/******************************************************************************************************************************************
*
*****************************************************************************************************************************************/
@ -33,18 +32,15 @@
#define SYS_CLK SYS_CLK_PLL
#define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1
#define SYS_CLK_DIV SYS_CLK_DIV_1
#define __HSI (20000000UL) //高速内部时钟
#define __LSI (32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
@ -55,19 +51,15 @@
#define PLL_FB_DIV 60
#define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2
#define PLL_OUT_DIV PLL_OUT_DIV8
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
/******************************************************************************************************************************************
* :
* : This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
@ -116,7 +108,8 @@ void SystemCoreClockUpdate(void)
}
}
if(SYS->CLKDIV & SYS_CLKDIV_SYS_Msk) SystemCoreClock /= 2;
if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
SystemCoreClock /= 2;
CyclesPerUs = SystemCoreClock / 1000000;
}
@ -187,7 +180,8 @@ void switchCLK_20MHz(void)
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
@ -200,7 +194,8 @@ void switchCLK_40MHz(void)
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
@ -214,7 +209,8 @@ void switchCLK_32KHz(void)
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
for(i = 0; i < 100; i++) __NOP();
for (i = 0; i < 100; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
@ -226,7 +222,8 @@ void switchCLK_XTAL(void)
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
@ -239,7 +236,8 @@ void switchCLK_PLL(void)
PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
for(i = 0; i < 10000; i++) __NOP();
for (i = 0; i < 10000; i++)
__NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
@ -254,7 +252,8 @@ void PLLInit(void)
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
}
@ -262,7 +261,8 @@ void PLLInit(void)
{
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for(i = 0; i < 20000; i++);
for (i = 0; i < 20000; i++)
;
SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
}
@ -276,5 +276,6 @@ void PLLInit(void)
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
while(SYS->PLLLOCK == 0); //等待PLL锁定
while (SYS->PLLLOCK == 0)
; //等待PLL锁定
}

View File

@ -2,20 +2,17 @@
#define __SYSTEM_SWM320_H__
#ifdef __cplusplus
extern "C" {
extern "C"
{
#endif
extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock)
extern uint32_t CyclesPerUs; // Cycles per micro second
extern void SystemInit(void);
extern void SystemCoreClockUpdate(void);
extern void switchCLK_20MHz(void);
extern void switchCLK_40MHz(void);
extern void switchCLK_32KHz(void);
@ -24,7 +21,6 @@ extern void switchCLK_PLL(void);
extern void PLLInit(void);
#ifdef __cplusplus
}
#endif

View File

@ -19,7 +19,6 @@
#include "SWM320.h"
#include "SWM320_adc.h"
/******************************************************************************************************************************************
* : ADC_Init()
* : ADC模数转换器初始化
@ -52,7 +51,8 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
}
else
{
if(SYS->PLLCR & SYS_PLLCR_OFF_Msk) PLLInit();
if (SYS->PLLCR & SYS_PLLCR_OFF_Msk)
PLLInit();
ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
@ -206,14 +206,30 @@ static uint32_t chn2idx(uint32_t chn)
switch (chn)
{
case 0x01: idx = 0; break;
case 0x02: idx = 1; break;
case 0x04: idx = 2; break;
case 0x08: idx = 3; break;
case 0x10: idx = 4; break;
case 0x20: idx = 5; break;
case 0x40: idx = 6; break;
case 0x80: idx = 7; break;
case 0x01:
idx = 0;
break;
case 0x02:
idx = 1;
break;
case 0x04:
idx = 2;
break;
case 0x08:
idx = 3;
break;
case 0x10:
idx = 4;
break;
case 0x20:
idx = 5;
break;
case 0x40:
idx = 6;
break;
case 0x80:
idx = 7;
break;
}
return idx;
@ -268,7 +284,6 @@ void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
}
/******************************************************************************************************************************************
* : ADC_IntEOCEn()
* : 使

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_ADC_H__
#define __SWM320_ADC_H__
typedef struct {
typedef struct
{
uint8_t clk_src; //ADC转换时钟源ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
uint8_t clk_div; //ADC转换时钟分频取值1--31
uint8_t pga_ref; //PGA基准PGA_REF_INTERNAL、PGA_REF_EXTERNAL
@ -42,7 +43,6 @@ typedef struct {
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生ADC_REFP和ADC_REFN可悬空
#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供(ADC_REFP + ADC_REFN) 电平值须与量程相同
void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
void ADC_Open(ADC_TypeDef *ADCx); //ADC开启可以软件启动、或硬件触发ADC转换
void ADC_Close(ADC_TypeDef *ADCx); //ADC关闭无法软件启动、或硬件触发ADC转换
@ -54,7 +54,6 @@ uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End O
void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns);
void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断使能
void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断禁止
void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断标志清除
@ -75,5 +74,4 @@ void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断禁止
void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断标志清除
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
#endif //__SWM320_ADC_H__

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_can.c
* : SWM320单片机的CAN模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_can.c
* : SWM320单片机的CAN模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -21,14 +21,13 @@
#include "SWM320.h"
#include "SWM320_can.h"
/******************************************************************************************************************************************
* : CAN_Init()
* : CAN接口初始化
* : CAN_TypeDef * CANx CAN接口CAN
* CAN_InitStructure * initStruct CAN接口相关设定值的结构体
* :
* :
* : CAN_Init()
* : CAN接口初始化
* : CAN_TypeDef * CANx CAN接口CAN
* CAN_InitStructure * initStruct CAN接口相关设定值的结构体
* :
* :
******************************************************************************************************************************************/
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct)
{
@ -39,7 +38,7 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
break;
}
CAN_Close(CANx); //一些关键寄存器只能在CAN关闭时设置
CAN_Close(CANx); //一些关键寄存器只能在CAN关闭时设置
CANx->CR &= ~(CAN_CR_LOM_Msk | CAN_CR_STM_Msk | CAN_CR_AFM_Msk);
CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) |
@ -62,7 +61,7 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
CANx->BT0 = (initStruct->CAN_SJW << CAN_BT0_SJW_Pos) |
((SystemCoreClock / 2 / initStruct->Baudrate / (1 + (initStruct->CAN_BS1 + 1) + (initStruct->CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
CANx->RXERR = 0; //只能在复位模式下清除
CANx->RXERR = 0; //只能在复位模式下清除
CANx->TXERR = 0;
CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) |
@ -86,40 +85,40 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
}
/******************************************************************************************************************************************
* : CAN_Open()
* : CAN接口打开
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_Open()
* : CAN接口打开
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_Open(CAN_TypeDef *CANx)
{
CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
}
/******************************************************************************************************************************************
* : CAN_Close()
* : CAN接口关闭
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_Close()
* : CAN接口关闭
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_Close(CAN_TypeDef *CANx)
{
CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
}
/******************************************************************************************************************************************
* : CAN_Transmit()
* : CAN发送数据
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID
* uint8_t data[]
* uint32_t size
* uint32_t once 使NAK
* :
* :
* : CAN_Transmit()
* : CAN发送数据
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID
* uint8_t data[]
* uint32_t size
* uint32_t once 使NAK
* :
* :
******************************************************************************************************************************************/
void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
{
@ -174,14 +173,14 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
}
/******************************************************************************************************************************************
* : CAN_TransmitRequest()
* : CAN发送远程请求
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID
* uint32_t once 使NAK
* :
* :
* : CAN_TransmitRequest()
* : CAN发送远程请求
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID
* uint32_t once 使NAK
* :
* :
******************************************************************************************************************************************/
void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once)
{
@ -217,12 +216,12 @@ void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint3
}
/******************************************************************************************************************************************
* : CAN_Receive()
* : CAN接收数据
* : CAN_TypeDef * CANx CAN接口CAN
* CAN_RXMessage *msg
* :
* :
* : CAN_Receive()
* : CAN接收数据
* : CAN_TypeDef * CANx CAN接口CAN
* CAN_RXMessage *msg
* :
* :
******************************************************************************************************************************************/
void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
{
@ -255,11 +254,11 @@ void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
}
/******************************************************************************************************************************************
* : CAN_TXComplete()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* : Abort也会触发发送完成
* : CAN_TXComplete()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* : Abort也会触发发送完成
******************************************************************************************************************************************/
uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
{
@ -267,11 +266,11 @@ uint32_t CAN_TXComplete(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_TXSuccess()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
* : CAN_TXSuccess()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
{
@ -279,11 +278,11 @@ uint32_t CAN_TXSuccess(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_AbortTransmit()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_AbortTransmit()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_AbortTransmit(CAN_TypeDef *CANx)
{
@ -291,11 +290,11 @@ void CAN_AbortTransmit(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_TXBufferReady()
* : TX Buffer是否准备好可以写入消息
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
* : CAN_TXBufferReady()
* : TX Buffer是否准备好可以写入消息
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
{
@ -303,11 +302,11 @@ uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_RXDataAvailable()
* : RX FIFO中是否有数据可读出
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
* : CAN_RXDataAvailable()
* : RX FIFO中是否有数据可读出
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
{
@ -315,15 +314,15 @@ uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_SetBaudrate()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t baudrate
* uint32_t CAN_BS1 CAN_BS1_1tqCAN_BS1_2tq... ... CAN_BS1_16tq
* uint32_t CAN_BS2 CAN_BS2_1tqCAN_BS2_2tq... ... CAN_BS2_8tq
* uint32_t CAN_SJW CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq
* :
* : CAN_Close()CAN模块
* : CAN_SetBaudrate()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t baudrate
* uint32_t CAN_BS1 CAN_BS1_1tqCAN_BS1_2tq... ... CAN_BS1_16tq
* uint32_t CAN_BS2 CAN_BS2_1tqCAN_BS2_2tq... ... CAN_BS2_8tq
* uint32_t CAN_SJW CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq
* :
* : CAN_Close()CAN模块
******************************************************************************************************************************************/
void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW)
{
@ -336,13 +335,13 @@ void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, ui
}
/******************************************************************************************************************************************
* : CAN_SetFilter32b()
* : 132
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t check mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* : CAN_SetFilter32b()
* : 132
* : CAN_TypeDef * CANx CAN接口CAN
* uint32_t check mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* uint32_t mask
* :
* : CAN_Close()CAN模块
* :
* : CAN_Close()CAN模块
******************************************************************************************************************************************/
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask)
{
@ -361,15 +360,15 @@ void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
}
/******************************************************************************************************************************************
* : CAN_SetFilter16b()
* : 216
* : CAN_TypeDef * CANx CAN接口CAN
* uint16_t check1 mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* : CAN_SetFilter16b()
* : 216
* : CAN_TypeDef * CANx CAN接口CAN
* uint16_t check1 mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* uint16_t mask1
* uint16_t check2
* uint16_t mask2
* :
* : CAN_Close()CAN模块
* :
* : CAN_Close()CAN模块
******************************************************************************************************************************************/
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
{
@ -388,11 +387,11 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint1
}
/******************************************************************************************************************************************
* : CAN_INTRXNotEmptyEn()
* : RX FIFO中有数据时使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTRXNotEmptyEn()
* : RX FIFO中有数据时使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx)
{
@ -400,11 +399,11 @@ void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTRXNotEmptyDis()
* : RX FIFO中有数据时
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTRXNotEmptyDis()
* : RX FIFO中有数据时
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx)
{
@ -412,11 +411,11 @@ void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTTXBufEmptyEn()
* : TX Buffer空时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTTXBufEmptyEn()
* : TX Buffer空时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx)
{
@ -424,11 +423,11 @@ void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTTXBufEmptyDis()
* : TX Buffer空时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTTXBufEmptyDis()
* : TX Buffer空时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx)
{
@ -436,11 +435,11 @@ void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTErrWarningEn()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTErrWarningEn()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTErrWarningEn(CAN_TypeDef *CANx)
{
@ -448,11 +447,11 @@ void CAN_INTErrWarningEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTErrWarningDis()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTErrWarningDis()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTErrWarningDis(CAN_TypeDef *CANx)
{
@ -460,11 +459,11 @@ void CAN_INTErrWarningDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTRXOverflowEn()
* : RX FIFO 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTRXOverflowEn()
* : RX FIFO 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTRXOverflowEn(CAN_TypeDef *CANx)
{
@ -472,11 +471,11 @@ void CAN_INTRXOverflowEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTRXOverflowDis()
* : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTRXOverflowDis()
* : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTRXOverflowDis(CAN_TypeDef *CANx)
{
@ -484,11 +483,11 @@ void CAN_INTRXOverflowDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTRXOverflowClear()
* : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTRXOverflowClear()
* : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx)
{
@ -496,11 +495,11 @@ void CAN_INTRXOverflowClear(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTWakeupEn()
* : 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTWakeupEn()
* : 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTWakeupEn(CAN_TypeDef *CANx)
{
@ -508,11 +507,11 @@ void CAN_INTWakeupEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTWakeupDis()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTWakeupDis()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTWakeupDis(CAN_TypeDef *CANx)
{
@ -520,11 +519,11 @@ void CAN_INTWakeupDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTErrPassiveEn()
* : TXERR/RXERR计数值达到127时中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTErrPassiveEn()
* : TXERR/RXERR计数值达到127时中断使能
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTErrPassiveEn(CAN_TypeDef *CANx)
{
@ -532,11 +531,11 @@ void CAN_INTErrPassiveEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTErrPassiveDis()
* : TXERR/RXERR计数值达到127时中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTErrPassiveDis()
* : TXERR/RXERR计数值达到127时中断禁止
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx)
{
@ -544,11 +543,11 @@ void CAN_INTErrPassiveDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTArbitrLostEn()
* : 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTArbitrLostEn()
* : 使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTArbitrLostEn(CAN_TypeDef *CANx)
{
@ -556,11 +555,11 @@ void CAN_INTArbitrLostEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTArbitrLostDis()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTArbitrLostDis()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx)
{
@ -568,11 +567,11 @@ void CAN_INTArbitrLostDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTBusErrorEn()
* : 线使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTBusErrorEn()
* : 线使
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTBusErrorEn(CAN_TypeDef *CANx)
{
@ -580,11 +579,11 @@ void CAN_INTBusErrorEn(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTBusErrorDis()
* : 线
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
* : CAN_INTBusErrorDis()
* : 线
* : CAN_TypeDef * CANx CAN接口CAN
* :
* :
******************************************************************************************************************************************/
void CAN_INTBusErrorDis(CAN_TypeDef *CANx)
{
@ -592,11 +591,11 @@ void CAN_INTBusErrorDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* : CAN_INTStat()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t
* : CANx->IF读取清零ISR中只能读取一次
* : CAN_INTStat()
* :
* : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t
* : CANx->IF读取清零ISR中只能读取一次
******************************************************************************************************************************************/
uint32_t CAN_INTStat(CAN_TypeDef *CANx)
{

View File

@ -4,23 +4,28 @@
#define CAN_FRAME_STD 0
#define CAN_FRAME_EXT 1
typedef struct {
typedef struct
{
uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
uint8_t CAN_BS1; //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
uint8_t CAN_BS2; //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t Baudrate; //波特率即位传输速率取值1--1000000
uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
union {
union
{
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
struct { // 0 must match 1 don't care
struct
{ // 0 must match 1 don't care
uint16_t FilterMask16b1;
uint16_t FilterMask16b2;
};
};
union {
union
{
uint32_t FilterCheck32b;
struct {
struct
{
uint16_t FilterCheck16b1;
uint16_t FilterCheck16b2;
};
@ -69,7 +74,8 @@ typedef struct {
#define CAN_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器
typedef struct {
typedef struct
{
uint32_t id; //消息ID
uint8_t format; //帧格式CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t remote; //消息是否为远程帧
@ -77,7 +83,6 @@ typedef struct {
uint8_t data[8]; //接收到的数据
} CAN_RXMessage;
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
void CAN_Open(CAN_TypeDef *CANx);
void CAN_Close(CAN_TypeDef *CANx);
@ -99,7 +104,6 @@ void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, ui
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_crc.c
* : SWM320单片机的CRC模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_crc.c
* : SWM320单片机的CRC模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -21,17 +21,16 @@
#include "SWM320.h"
#include "SWM320_crc.h"
/******************************************************************************************************************************************
* : CRC_Init()
* : CRC
* : CRC_TypeDef * CRCx CRC接口CRC
* uint32_t mode CRC32_IN32CRC32_IN16CRC32_IN8CRC16_IN16CRC16_IN8
* uint32_t out_not
* uint32_t out_rev
* uint32_t ini_val CRC初始值
* :
* :
* : CRC_Init()
* : CRC
* : CRC_TypeDef * CRCx CRC接口CRC
* uint32_t mode CRC32_IN32CRC32_IN16CRC32_IN8CRC16_IN16CRC16_IN8
* uint32_t out_not
* uint32_t out_rev
* uint32_t ini_val CRC初始值
* :
* :
******************************************************************************************************************************************/
void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
{

View File

@ -1,17 +1,14 @@
#ifndef __SWM320_CRC_H__
#define __SWM320_CRC_H__
#define CRC32_IN32 0 //CRC32算法输入数据32位
#define CRC32_IN16 2 //CRC32算法输入数据16位
#define CRC32_IN8 4 //CRC32算法输入数据 8位
#define CRC16_IN16 3 //CRC16算法输入数据16位
#define CRC16_IN8 5 //CRC16算法输入数据 8位
void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
/******************************************************************************************************************************************
* : CRC_Write()
* : CRC写入数据

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_dma.c
* : SWM320单片机的DMA功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_dma.c
* : SWM320单片机的DMA功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -22,23 +22,23 @@
#include "SWM320_dma.h"
/******************************************************************************************************************************************
* : DMA_CHM_Config()
* : DMA通道配置Flash和RAM间
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* uint32_t src_addr 200
* uint32_t src_addr_incr 0 1
* uint32_t dst_addr 200
* uint32_t dst_addr_incr 0 1
* uint32_t num_word 1024
* uint32_t int_en 使1 0
* :
* :
* : DMA_CHM_Config()
* : DMA通道配置Flash和RAM间
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* uint32_t src_addr 200
* uint32_t src_addr_incr 0 1
* uint32_t dst_addr 200
* uint32_t dst_addr_incr 0 1
* uint32_t num_word 1024
* uint32_t int_en 使1 0
* :
* :
******************************************************************************************************************************************/
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
{
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
DMA_CH_Close(chn); //配置前先关闭该通道
DMA_CH_Close(chn); //配置前先关闭该通道
DMA->CH[chn].SRC = src_addr;
DMA->CH[chn].DST = dst_addr;
@ -50,10 +50,12 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
(dst_addr_incr << DMA_AM_DSTAM_Pos) |
(0 << DMA_AM_BURST_Pos);
DMA->IF = (1 << chn); //清除中断标志
DMA->IF = (1 << chn); //清除中断标志
DMA->IE |= (1 << chn);
if(int_en) DMA->IM &= ~(1 << chn);
else DMA->IM |= (1 << chn);
if (int_en)
DMA->IM &= ~(1 << chn);
else
DMA->IM |= (1 << chn);
if (int_en)
{
@ -61,16 +63,16 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
}
else
{
//不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断
//不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断
}
}
/******************************************************************************************************************************************
* : DMA_CH_Open()
* : DMA通道打开
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
* : DMA_CH_Open()
* : DMA通道打开
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
******************************************************************************************************************************************/
void DMA_CH_Open(uint32_t chn)
{
@ -78,11 +80,11 @@ void DMA_CH_Open(uint32_t chn)
}
/******************************************************************************************************************************************
* : DMA_CH_Close()
* : DMA通道关闭
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
* : DMA_CH_Close()
* : DMA通道关闭
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
******************************************************************************************************************************************/
void DMA_CH_Close(uint32_t chn)
{
@ -90,11 +92,11 @@ void DMA_CH_Close(uint32_t chn)
}
/******************************************************************************************************************************************
* : DMA_CH_INTEn()
* : DMA中断使能
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
* : DMA_CH_INTEn()
* : DMA中断使能
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn)
{
@ -102,11 +104,11 @@ void DMA_CH_INTEn(uint32_t chn)
}
/******************************************************************************************************************************************
* : DMA_CH_INTDis()
* : DMA中断禁止
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
* : DMA_CH_INTDis()
* : DMA中断禁止
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
******************************************************************************************************************************************/
void DMA_CH_INTDis(uint32_t chn)
{
@ -114,11 +116,11 @@ void DMA_CH_INTDis(uint32_t chn)
}
/******************************************************************************************************************************************
* : DMA_CH_INTClr()
* : DMA中断标志清除
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
* : DMA_CH_INTClr()
* : DMA中断标志清除
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* :
* :
******************************************************************************************************************************************/
void DMA_CH_INTClr(uint32_t chn)
{
@ -126,11 +128,11 @@ void DMA_CH_INTClr(uint32_t chn)
}
/******************************************************************************************************************************************
* : DMA_CH_INTStat()
* : DMA中断状态查询
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : uint32_t 1 0
* :
* : DMA_CH_INTStat()
* : DMA中断状态查询
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t DMA_CH_INTStat(uint32_t chn)
{

View File

@ -1,12 +1,10 @@
#ifndef __SWM320_DMA_H__
#define __SWM320_DMA_H__
#define DMA_CH0 0
#define DMA_CH1 1
#define DMA_CH2 2
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置用于存储器间如Flash和RAM间搬运数据
void DMA_CH_Open(uint32_t chn); //DMA通道打开
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
@ -16,5 +14,4 @@ void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止数据搬运完成后
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询1 数据搬运完成 0 数据搬运未完成
#endif //__SWM320_DMA_H__

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_exti.c
* : SWM320单片机的外部中断功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_exti.c
* : SWM320单片机的外部中断功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*******************************************************************************************************************************************
* @attention
@ -21,57 +21,57 @@
#include "SWM320_exti.h"
/******************************************************************************************************************************************
* : EXTI_Init()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t mode EXTI_FALL_EDGEEXTI_RISE_EDGEEXTI_BOTH_EDGEEXTI_LOW_LEVELEXTI_HIGH_LEVEL
* :
* : GPIOAGPIOBGPIOCGPIOM的PIN0--7NVIC中的引脚中断GPIOA0_IRQnNVIC的组中断GPIOA_IRQn
* NVIC_EnableIRQ()使NVIC中断NVIC_EnableIRQ(GPIOA0_IRQn)NVIC_EnableIRQ(GPIOA_IRQn)
* : EXTI_Init()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t mode EXTI_FALL_EDGEEXTI_RISE_EDGEEXTI_BOTH_EDGEEXTI_LOW_LEVELEXTI_HIGH_LEVEL
* :
* : GPIOAGPIOBGPIOCGPIOM的PIN0--7NVIC中的引脚中断GPIOA0_IRQnNVIC的组中断GPIOA_IRQn
* NVIC_EnableIRQ()使NVIC中断NVIC_EnableIRQ(GPIOA0_IRQn)NVIC_EnableIRQ(GPIOA_IRQn)
******************************************************************************************************************************************/
void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
{
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
if (mode & 0x10)
{
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
if (mode & 0x01)
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
else
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
}
else
{
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
if (mode & 0x02)
{
GPIOx->INTBE |= (0x01 << n); //双边沿触发
GPIOx->INTBE |= (0x01 << n); //双边沿触发
}
else
{
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
if (mode & 0x01)
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
else
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
}
}
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
}
/******************************************************************************************************************************************
* : EXTI_Open()
* : 使
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
* : EXTI_Open()
* : 使
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
******************************************************************************************************************************************/
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -79,12 +79,12 @@ void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : EXTI_Close()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
* : EXTI_Close()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
******************************************************************************************************************************************/
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -92,12 +92,12 @@ void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : EXTI_State()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : uint32_t 1 0
* :
* : EXTI_State()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -105,12 +105,12 @@ uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : EXTI_RawState()
* : //
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : uint32_t 1 / 0 /
* :
* : EXTI_RawState()
* : //
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : uint32_t 1 / 0 /
* :
******************************************************************************************************************************************/
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -118,12 +118,12 @@ uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : EXTI_Clear()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* : 沿
* : EXTI_Clear()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* : 沿
******************************************************************************************************************************************/
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
{

View File

@ -9,12 +9,10 @@ uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#endif //__SWM320_EXTI_H__

View File

@ -19,13 +19,11 @@
#include "SWM320.h"
#include "SWM320_flash.h"
IAP_Cache_Reset_t IAP_Cache_Reset = (IAP_Cache_Reset_t)0x11000601;
IAP_Flash_Param_t IAP_Flash_Param = (IAP_Flash_Param_t)0x11000681;
IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781;
IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
/******************************************************************************************************************************************
* : FLASH_Erase()
* : Flash擦除

View File

@ -1,14 +1,11 @@
#ifndef __SWM320_FLASH_H__
#define __SWM320_FLASH_H__
void FLASH_Erase(uint32_t addr);
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
void Flash_Param_at_xMHz(uint32_t x);
typedef void (*IAP_Cache_Reset_t)(void);
typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
typedef void (*IAP_Flash_Erase_t)(uint32_t sector);
@ -19,5 +16,4 @@ extern IAP_Flash_Param_t IAP_Flash_Param;
extern IAP_Flash_Erase_t IAP_Flash_Erase;
extern IAP_Flash_Write_t IAP_Flash_Write;
#endif //__SWM320_FLASH_H__

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_gpio.c
* : SWM320单片机的通用输入输出功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_gpio.c
* : SWM320单片机的通用输入输出功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -21,17 +21,16 @@
#include "SWM320.h"
#include "SWM320_gpio.h"
/******************************************************************************************************************************************
* : GPIO_Init()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t dir 0 1
* uint32_t pull_up 0 1
* uint32_t pull_down 0 1
* :
* : GPIOAGPIOCGPIOMGPIOP只有上拉GPIOBGPION只有下拉PN0PN1PN2三个引脚有上拉没下拉
* : GPIO_Init()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t dir 0 1
* uint32_t pull_up 0 1
* uint32_t pull_down 0 1
* :
* : GPIOAGPIOCGPIOMGPIOP只有上拉GPIOBGPION只有下拉PN0PN1PN2三个引脚有上拉没下拉
******************************************************************************************************************************************/
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
{
@ -40,7 +39,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOA):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOA->DIR |= (0x01 << n);
@ -59,7 +58,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOB):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOB->DIR |= (0x01 << n);
@ -78,7 +77,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOC):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOC->DIR |= (0x01 << n);
@ -97,7 +96,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOM):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOM->DIR |= (0x01 << n);
@ -116,7 +115,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPION):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPION->DIR |= (0x01 << n);
@ -135,7 +134,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOP):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOP->DIR |= (0x01 << n);
@ -154,12 +153,12 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
}
/******************************************************************************************************************************************
* : GPIO_SetBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
* : GPIO_SetBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
******************************************************************************************************************************************/
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -167,12 +166,12 @@ void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_ClrBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
* : GPIO_ClrBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
******************************************************************************************************************************************/
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -180,12 +179,12 @@ void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_InvBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
* : GPIO_InvBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* :
* :
******************************************************************************************************************************************/
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -193,12 +192,12 @@ void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_GetBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : 0 1
* :
* : GPIO_GetBit()
* :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : 0 1
* :
******************************************************************************************************************************************/
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -206,13 +205,13 @@ uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_SetBits()
* : n开始的w位连续引脚的电平置高
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
* : GPIO_SetBits()
* : n开始的w位连续引脚的电平置高
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
******************************************************************************************************************************************/
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -224,13 +223,13 @@ void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_ClrBits()
* : n开始的w位连续引脚的电平置低
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
* : GPIO_ClrBits()
* : n开始的w位连续引脚的电平置低
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
******************************************************************************************************************************************/
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -242,13 +241,13 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_InvBits()
* : n开始的w位连续引脚的电平反转
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
* : GPIO_InvBits()
* : n开始的w位连续引脚的电平反转
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* :
* :
******************************************************************************************************************************************/
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -260,14 +259,14 @@ void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_GetBits()
* : n开始的w位连续引脚的电平状态
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* : n开始的w位连续引脚的电平状态 0 1
* 0n的电平状态1n+1... ...w位表示引脚n+w的电平状态
* :
* : GPIO_GetBits()
* : n开始的w位连续引脚的电平状态
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w
* : n开始的w位连续引脚的电平状态 0 1
* 0n的电平状态1n+1... ...w位表示引脚n+w的电平状态
* :
******************************************************************************************************************************************/
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -279,12 +278,12 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_AtomicSetBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicSetBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -292,12 +291,12 @@ void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_AtomicClrBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicClrBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -305,12 +304,12 @@ void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_AtomicInvBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicInvBit()
* : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@ -318,13 +317,13 @@ void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* : GPIO_AtomicSetBits()
* : n开始的w位连续引脚的电平置高--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicSetBits()
* : n开始的w位连续引脚的电平置高--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -338,13 +337,13 @@ void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_AtomicClrBits()
* : n开始的w位连续引脚的电平置低--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicClrBits()
* : n开始的w位连续引脚的电平置低--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@ -358,13 +357,13 @@ void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* : GPIO_AtomicInvBits()
* : n开始的w位连续引脚的电平反转--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
* : GPIO_AtomicInvBits()
* : n开始的w位连续引脚的电平反转--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w
* :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{

View File

@ -1,7 +1,6 @@
#ifndef __SWM320_GPIO_H__
#define __SWM320_GPIO_H__
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
@ -20,5 +19,4 @@ void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
#endif //__SWM320_GPIO_H__

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_i2c.c
* : SWM320单片机的I2C串行接口功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_i2c.c
* : SWM320单片机的I2C串行接口功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -22,12 +22,12 @@
#include "SWM320_i2c.h"
/******************************************************************************************************************************************
* : I2C_Init()
* : I2C初始化
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* I2C_InitStructure * initStruct I2C相关设定值的结构体
* :
* :
* : I2C_Init()
* : I2C初始化
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* I2C_InitStructure * initStruct I2C相关设定值的结构体
* :
* :
******************************************************************************************************************************************/
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
{
@ -42,13 +42,13 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
break;
}
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
if (initStruct->Master == 1)
{
I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
@ -86,7 +86,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
(initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
@ -126,11 +126,11 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
}
/******************************************************************************************************************************************
* : I2C_Open()
* : I2C打开
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
* : I2C_Open()
* : I2C打开
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
******************************************************************************************************************************************/
void I2C_Open(I2C_TypeDef *I2Cx)
{
@ -138,11 +138,11 @@ void I2C_Open(I2C_TypeDef * I2Cx)
}
/******************************************************************************************************************************************
* : I2C_Close()
* : I2C关闭
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
* : I2C_Close()
* : I2C关闭
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
******************************************************************************************************************************************/
void I2C_Close(I2C_TypeDef *I2Cx)
{
@ -150,66 +150,70 @@ void I2C_Close(I2C_TypeDef * I2Cx)
}
/******************************************************************************************************************************************
* : I2C_Start()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t addr
* : uint8_t 1 ACK 0 NACK
* :
* : I2C_Start()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t addr
* : uint8_t 1 ACK 0 NACK
* :
******************************************************************************************************************************************/
uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr)
{
I2Cx->MSTDAT = addr;
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
(1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
(1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
__NOP(); //等待发送完成
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
* : I2C_Stop()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
* : I2C_Stop()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* :
* :
******************************************************************************************************************************************/
void I2C_Stop(I2C_TypeDef *I2Cx)
{
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
__NOP(); //等待发送完成
}
/******************************************************************************************************************************************
* : I2C_Write()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t data
* : uint8_t 1 ACK 0 NACK
* :
* : I2C_Write()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t data
* : uint8_t 1 ACK 0 NACK
* :
******************************************************************************************************************************************/
uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data)
{
I2Cx->MSTDAT = data;
I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
__NOP(); //等待发送完成
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
* : I2C_Read()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t ack 1 ACK 0 NACK
* : uint8_t
* :
* : I2C_Read()
* :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t ack 1 ACK 0 NACK
* : uint8_t
* :
******************************************************************************************************************************************/
uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack)
{
I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待接收完成
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
__NOP(); //等待接收完成
return I2Cx->MSTDAT;
}

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_I2C_H__
#define __SWM320_I2C_H__
typedef struct {
typedef struct
{
uint8_t Master; //1 主机模式
uint8_t Addr7b; //1 7位地址 0 10位地址
@ -17,7 +18,6 @@ typedef struct {
uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
} I2C_InitStructure;
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
void I2C_Open(I2C_TypeDef *I2Cx);

View File

@ -54,8 +54,10 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
LCDx->IE = 1;
LCDx->IF = 1; //清除标志
if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
else LCD_INTDis(LCDx);
if (initStruct->IntEOTEn)
LCD_INTEn(LCDx);
else
LCD_INTDis(LCDx);
switch ((uint32_t)LCDx)
{

View File

@ -1,27 +1,26 @@
#ifndef __SWM320_LCD_H__
#define __SWM320_LCD_H__
typedef struct
{
uint16_t HnPixel; //水平方向像素个数最大取值1024
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
uint8_t Hfp; //horizonal front porch最大取值32
uint8_t Hbp; //horizonal back porch 最大取值128
uint8_t Vfp; //vertical front porch 最大取值8
uint8_t Vbp; //vertical back porch 最大取值32
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK取值LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
typedef struct {
uint16_t HnPixel; //水平方向像素个数最大取值1024
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
uint8_t Hfp; //horizonal front porch最大取值32
uint8_t Hbp; //horizonal back porch 最大取值128
uint8_t Vfp; //vertical front porch 最大取值8
uint8_t Vbp; //vertical back porch 最大取值32
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK取值LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
uint8_t IntEOTEn; //End of Transter传输完成中断使能
uint8_t IntEOTEn; //End of Transter传输完成中断使能
} LCD_InitStructure;
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
#define LCD_HSYNC_2DOTCLK 1
#define LCD_HSYNC_3DOTCLK 2
#define LCD_HSYNC_4DOTCLK 3
@ -59,7 +58,6 @@ typedef struct {
#define LCD_CLKDIV_62 30
#define LCD_CLKDIV_64 31
void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
void LCD_Start(LCD_TypeDef *LCDx);
uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
@ -69,5 +67,4 @@ void LCD_INTDis(LCD_TypeDef * LCDx);
void LCD_INTClr(LCD_TypeDef *LCDx);
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
#endif //__SWM320_LCD_H__

View File

@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* : SWM320_norflash.c
* : SWM320单片机的NOR Flash驱动程序
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
* : SWM320_norflash.c
* : SWM320单片机的NOR Flash驱动程序
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
*
*
*******************************************************************************************************************************************
@ -21,26 +21,28 @@
#include "SWM320.h"
#include "SWM320_norflash.h"
/******************************************************************************************************************************************
* : NORFL_Init()
* : NOR Flash控制器初始化
* : NORFL_InitStructure * initStruct NOR Flash控制器相关设定值的结构体
* :
* :
* : NORFL_Init()
* : NOR Flash控制器初始化
* : NORFL_InitStructure * initStruct NOR Flash控制器相关设定值的结构体
* :
* :
******************************************************************************************************************************************/
void NORFL_Init(NORFL_InitStructure *initStruct)
{
uint32_t i;
// 配置SRAM前需要刷新下SDRAM控制器
do {
// 配置SRAM前需要刷新下SDRAM控制器
do
{
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
while(SDRAMC->REFDONE == 0);
while (SDRAMC->REFDONE == 0)
;
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
} while (0);
@ -51,19 +53,23 @@ void NORFL_Init(NORFL_InitStructure * initStruct)
(initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
NORFLC->IE = 3;
NORFLC->IF = 3; // 清除中断标志
if(initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
if(initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
NORFLC->IF = 3; // 清除中断标志
if (initStruct->OperFinishIEn)
NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
else
NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
if (initStruct->OperTimeoutIEn)
NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
else
NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
}
/******************************************************************************************************************************************
* : NORFL_ChipErase()
* : NOR Flash整片擦除
* :
* : uint32_t 0 1
* :
* : NORFL_ChipErase()
* : NOR Flash整片擦除
* :
* : uint32_t 0 1
* :
******************************************************************************************************************************************/
uint32_t NORFL_ChipErase(void)
{
@ -72,10 +78,13 @@ uint32_t NORFL_ChipErase(void)
NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@ -83,11 +92,11 @@ uint32_t NORFL_ChipErase(void)
}
/******************************************************************************************************************************************
* : NORFL_SectorErase()
* : NOR Flash扇区擦除
* : uint32_t addr
* : uint32_t 0 1
* : MX29LV128DB 88K25564K MX29LV128DT 25564K88K
* : NORFL_SectorErase()
* : NOR Flash扇区擦除
* : uint32_t addr
* : uint32_t 0 1
* : MX29LV128DB 88K25564K MX29LV128DT 25564K88K
******************************************************************************************************************************************/
uint32_t NORFL_SectorErase(uint32_t addr)
{
@ -97,10 +106,13 @@ uint32_t NORFL_SectorErase(uint32_t addr)
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@ -108,12 +120,12 @@ uint32_t NORFL_SectorErase(uint32_t addr)
}
/******************************************************************************************************************************************
* : NORFL_Write()
* : NOR Flash写
* : uint32_t addr
* uint32_t data
* : uint32_t 0 1
* : 线16线8
* : NORFL_Write()
* : NOR Flash写
* : uint32_t addr
* uint32_t data
* : uint32_t 0 1
* : 线16线8
******************************************************************************************************************************************/
uint32_t NORFL_Write(uint32_t addr, uint32_t data)
{
@ -123,10 +135,13 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@ -134,11 +149,11 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
}
/******************************************************************************************************************************************
* : NORFL_Read()
* : NOR Flash读
* : uint32_t addr
* : uint32_t
* : 线16线8
* : NORFL_Read()
* : NOR Flash读
* : uint32_t addr
* : uint32_t
* : 线16线8
******************************************************************************************************************************************/
uint32_t NORFL_Read(uint32_t addr)
{
@ -149,11 +164,11 @@ uint32_t NORFL_Read(uint32_t addr)
}
/******************************************************************************************************************************************
* : NORFL_ReadID()
* : NOR Flash读ID
* : uint32_t id_addr ID地址
* : uint16_t ID
* :
* : NORFL_ReadID()
* : NOR Flash读ID
* : uint32_t id_addr ID地址
* : uint16_t ID
* :
******************************************************************************************************************************************/
uint16_t NORFL_ReadID(uint32_t id_addr)
{
@ -166,7 +181,7 @@ uint16_t NORFL_ReadID(uint32_t id_addr)
id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
return id;
}

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_NORFLASH_H__
#define __SWM320_NORFLASH_H__
typedef struct {
typedef struct
{
uint8_t DataWidth; // 8、16
uint8_t WELowPulseTime; // WE# pulse width单位为系统时钟周期最大值为7
@ -11,8 +12,6 @@ typedef struct {
uint8_t OperTimeoutIEn;
} NORFL_InitStructure;
void NORFL_Init(NORFL_InitStructure *initStruct);
uint32_t NORFL_ChipErase(void);
uint32_t NORFL_SectorErase(uint32_t addr);
@ -20,14 +19,11 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data);
uint32_t NORFL_Read(uint32_t addr);
uint16_t NORFL_ReadID(uint32_t id_addr);
/* 当前版本总线读只支持字读
#define NORFL_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
#define NORFL_CMD_READ 0
#define NORFL_CMD_RESET 1
#define NORFL_CMD_AUTO_SELECT 2

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_port.h"
/******************************************************************************************************************************************
* : PORT_Init()
* : "SWM320_port.h"

View File

@ -54,7 +54,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTA_PIN12_GPIO 0
#define PORTA_PIN12_ADC0_IN4 3
#define PORTB_PIN0_GPIO 0
#define PORTB_PIN0_FUNMUX 1
#define PORTB_PIN0_SD_DETECT 2
@ -104,7 +103,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTB_PIN12_GPIO 0
#define PORTC_PIN0_GPIO 0
#define PORTC_PIN0_FUNMUX 1
@ -133,7 +131,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTC_PIN7_FUNMUX 1
#define PORTC_PIN7_ADC1_IN0 3
#define PORTM_PIN0_GPIO 0
#define PORTM_PIN0_FUNMUX 1
#define PORTM_PIN0_NORFL_D15 2
@ -222,7 +219,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTM_PIN21_FUNMUX 1
#define PORTM_PIN21_SDRAM_CKE 2
#define PORTN_PIN0_GPIO 0
#define PORTN_PIN0_FUNMUX 1
#define PORTN_PIN0_LCD_D0 2
@ -308,7 +304,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTN_PIN19_LCD_WR 2
#define PORTN_PIN19_LCD_HSYNC 2
#define PORTP_PIN0_GPIO 0
#define PORTP_PIN0_FUNMUX 1
#define PORTP_PIN0_NORFL_A0 2
@ -423,8 +418,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define PORTP_PIN23_FUNMUX 1
#define PORTP_PIN23_NORFL_A23 2
/* 下面宏定义的取值全部在正确值的基础上“加100”以区分上面宏定义的值从而方便库函数的编写*/
/* 下面这些值是偶数编号引脚的功能取值如PIN0、PIN2、... */
#define FUNMUX0_UART0_RXD 100
@ -478,5 +471,4 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define FUNMUX1_UART2_RTS 123
#define FUNMUX1_UART3_RTS 124
#endif //__SWM320_PORT_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_pwm.h"
/******************************************************************************************************************************************
* : PWM_Init()
* : PWM初始化
@ -288,7 +287,6 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
return deadzone;
}
/******************************************************************************************************************************************
* : PWM_IntNCycleEn()
* : 使
@ -302,33 +300,45 @@ void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
break;
}
}
@ -346,33 +356,45 @@ void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
break;
}
}
@ -390,33 +412,45 @@ void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
break;
}
}
@ -436,40 +470,51 @@ uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
break;
}
return int_stat;
}
/******************************************************************************************************************************************
* : PWM_IntHEndEn()
* : 使
@ -483,33 +528,45 @@ void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
else PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
if (chn == PWM_CH_A)
PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
break;
}
}
@ -527,33 +584,45 @@ void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
if (chn == PWM_CH_A)
PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
break;
}
}
@ -571,33 +640,45 @@ void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
else PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
if (chn == PWM_CH_A)
PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
break;
}
}
@ -617,33 +698,45 @@ uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn)
switch ((uint32_t)PWMx)
{
case ((uint32_t)PWM0):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
break;
case ((uint32_t)PWM1):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
break;
case ((uint32_t)PWM2):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
break;
case ((uint32_t)PWM3):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
break;
case ((uint32_t)PWM4):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
break;
case ((uint32_t)PWM5):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
else int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
if (chn == PWM_CH_A)
int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
break;
}

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_PWM_H__
#define __SWM320_PWM_H__
typedef struct {
typedef struct
{
uint8_t clk_div; //PWM_CLKDIV_1、PWM_CLKDIV_8
uint8_t mode; //PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
@ -33,7 +34,6 @@ typedef struct {
#define PWM_CH_A 0
#define PWM_CH_B 1
void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct); //PWM初始化
void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //启动PWM开始PWM输出
void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //关闭PWM停止PWM输出
@ -54,5 +54,4 @@ void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中
void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断标志清除
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断是否发生
#endif //__SWM320_PWM_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_rtc.h"
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
/******************************************************************************************************************************************
* : RTC_Init()
@ -42,7 +41,8 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
RTC_Stop(RTCx);
while(RTCx->CFGABLE == 0);
while (RTCx->CFGABLE == 0)
;
RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
(initStruct->Minute << RTC_MINSEC_MIN_Pos);
@ -124,7 +124,8 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
******************************************************************************************************************************************/
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
{
while(RTCx->CFGABLE == 0);
while (RTCx->CFGABLE == 0)
;
RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
(alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
@ -133,13 +134,15 @@ void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
(alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
while(RTCx->LOAD & RTC_LOAD_ALARM_Msk);
while (RTCx->LOAD & RTC_LOAD_ALARM_Msk)
;
RTCx->IF = (1 << RTC_IF_ALARM_Pos);
RTCx->IE &= ~RTC_IE_ALARM_Msk;
RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
if(alarmStruct->AlarmIEn) NVIC_EnableIRQ(RTC_IRQn);
if (alarmStruct->AlarmIEn)
NVIC_EnableIRQ(RTC_IRQn);
}
/******************************************************************************************************************************************
@ -156,17 +159,20 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
uint32_t i, cnt = 0;
const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for(i = 1; i < month; i++) cnt += daysOfMonth[i];
for (i = 1; i < month; i++)
cnt += daysOfMonth[i];
cnt += date;
if((year%4 == 0) && ((year%100 != 0) || (year%400 == 0)) && (month >= 3)) cnt += 1;
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3))
cnt += 1;
cnt += (year - 1901) * 365;
for (i = 1901; i < year; i++)
{
if((i%4 == 0) && ((i%100 != 0) || (i%400 == 0))) cnt += 1;
if ((i % 4 == 0) && ((i % 100 != 0) || (i % 400 == 0)))
cnt += 1;
}
return (cnt + 1) % 7;

View File

@ -1,7 +1,6 @@
#ifndef __SWM320_RTC_H__
#define __SWM320_RTC_H__
#define RTC_SUN 0x01
#define RTC_MON 0x02
#define RTC_TUE 0x04
@ -10,8 +9,8 @@
#define RTC_FRI 0x20
#define RTC_SAT 0x40
typedef struct {
typedef struct
{
uint16_t Year;
uint8_t Month; //取值1--12
uint8_t Date; //取值1--31
@ -22,7 +21,8 @@ typedef struct {
uint8_t MinuteIEn;
} RTC_InitStructure;
typedef struct {
typedef struct
{
uint8_t Days; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT及其或运算组合
uint8_t Hour;
uint8_t Minute;
@ -30,7 +30,8 @@ typedef struct {
uint8_t AlarmIEn;
} RTC_AlarmStructure;
typedef struct {
typedef struct
{
uint16_t Year;
uint8_t Month;
uint8_t Date;
@ -48,7 +49,6 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
void RTC_IntSecondEn(RTC_TypeDef *RTCx);
void RTC_IntSecondDis(RTC_TypeDef *RTCx);
void RTC_IntSecondClr(RTC_TypeDef *RTCx);

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_sdio.h"
SD_CardInfo SD_cardInfo;
/******************************************************************************************************************************************
@ -57,19 +56,21 @@ uint32_t SDIO_Init(uint32_t freq)
(calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
(0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
while((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0);
while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0)
;
SDIO->IFE = 0xFFFFFFFF;
SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE
res = SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp); //CMD8: SEND_IF_COND, 检测工作电压、检测是否支持SD 2.0
if (res != SD_RES_OK)
return res;
if(resp == 0x1AA) SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
else SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
if (resp == 0x1AA)
SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
else
SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
do //ACMD41: SD_CMD_SD_APP_OP_COND
{
@ -77,7 +78,8 @@ uint32_t SDIO_Init(uint32_t freq)
if (res != SD_RES_OK)
return res;
if(resp != 0x120) return SD_RES_ERR; //不是SD卡可能是MMC卡
if (resp != 0x120)
return SD_RES_ERR; //不是SD卡可能是MMC卡
if (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp);
@ -85,31 +87,28 @@ uint32_t SDIO_Init(uint32_t freq)
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
} while (((resp >> 31) & 0x01) == 0); //上电没完成时resp[31] == 0
if(((resp >> 30) & 0x01) == 1) SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
if (((resp >> 30) & 0x01) == 1)
SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID获取CID
parseCID(resps);
SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR设置RCA
SD_cardInfo.RCA = resp >> 16;
SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD获取CSD
parseCSD(resps);
if(SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR; //本驱动只支持以512字节为单位的读写所以最大读写单位必须不小于512
if (SD_cardInfo.CardBlockSize < 0x200)
return SD_RES_ERR; //本驱动只支持以512字节为单位的读写所以最大读写单位必须不小于512
SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
(calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //初始化完成SDCLK切换到高速
SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: 选中卡从Standy模式进入Transfer模式
SDIO->IF = SDIO_IF_TRXDONE_Msk;
@ -119,7 +118,6 @@ uint32_t SDIO_Init(uint32_t freq)
SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节
SDIO->BLK = 512;
@ -140,19 +138,24 @@ uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
uint32_t res, i;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
if (res != SD_RES_OK)
return res;
while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
for(i = 0; i < 512/4; i++) SDIO->DATA = buff[i];
for (i = 0; i < 512 / 4; i++)
SDIO->DATA = buff[i];
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -172,8 +175,10 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
uint32_t res, i, j;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
if (res != SD_RES_OK)
@ -181,13 +186,16 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
for (i = 0; i < block_cnt; i++)
{
while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
for(j = 0; j < 512/4; j++) SDIO->DATA = buff[i*(512/4) + j];
for (j = 0; j < 512 / 4; j++)
SDIO->DATA = buff[i * (512 / 4) + j];
}
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -207,8 +215,10 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
uint32_t res;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
SDIO->DMA_MEM_ADDR = (uint32_t)buff;
@ -216,7 +226,8 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
if (res != SD_RES_OK)
return res;
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -235,19 +246,24 @@ uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
uint32_t res, i;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
if (res != SD_RES_OK)
return res;
while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
for(i = 0; i < 512/4; i++) buff[i] = SDIO->DATA;
for (i = 0; i < 512 / 4; i++)
buff[i] = SDIO->DATA;
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -267,8 +283,10 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
uint32_t res, i, j;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
if (res != SD_RES_OK)
@ -276,13 +294,16 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
for (i = 0; i < block_cnt; i++)
{
while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
for(j = 0; j < 512/4; j++) buff[i*(512/4) + j] = SDIO->DATA;
for (j = 0; j < 512 / 4; j++)
buff[i * (512 / 4) + j] = SDIO->DATA;
}
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -302,8 +323,10 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
uint32_t res;
uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
else addr = block_addr * 512;
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
addr = block_addr;
else
addr = block_addr * 512;
SDIO->DMA_MEM_ADDR = (uint32_t)buff;
@ -311,7 +334,8 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
if (res != SD_RES_OK)
return res;
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
__NOP();
SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK;
@ -383,7 +407,6 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
return SD_RES_OK;
}
void parseCID(uint32_t CID_Tab[4])
{
uint8_t tmp = 0;
@ -580,15 +603,24 @@ uint32_t calcSDCLKDiv(uint32_t freq)
uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
uint32_t regdiv = 0;
if(clkdiv > 128) regdiv = 0x80;
else if(clkdiv > 64) regdiv = 0x40;
else if(clkdiv > 32) regdiv = 0x20;
else if(clkdiv > 16) regdiv = 0x10;
else if(clkdiv > 8) regdiv = 0x08;
else if(clkdiv > 4) regdiv = 0x04;
else if(clkdiv > 2) regdiv = 0x02;
else if(clkdiv > 1) regdiv = 0x01;
else regdiv = 0x00;
if (clkdiv > 128)
regdiv = 0x80;
else if (clkdiv > 64)
regdiv = 0x40;
else if (clkdiv > 32)
regdiv = 0x20;
else if (clkdiv > 16)
regdiv = 0x10;
else if (clkdiv > 8)
regdiv = 0x08;
else if (clkdiv > 4)
regdiv = 0x04;
else if (clkdiv > 2)
regdiv = 0x02;
else if (clkdiv > 1)
regdiv = 0x01;
else
regdiv = 0x00;
return regdiv;
}

View File

@ -1,7 +1,6 @@
#ifndef __SWM320_SDIO_H__
#define __SWM320_SDIO_H__
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
@ -34,7 +33,6 @@
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
#define SD_RESP_NO 0 //0 无响应
#define SD_RESP_32b 2 //2 32位响应
#define SD_RESP_128b 1 //1 128位响应
@ -47,7 +45,6 @@
#define SD_RES_ERR 1
#define SD_RES_TIMEOUT 2
typedef struct
{
__IO uint8_t CSDStruct; // CSD structure
@ -99,7 +96,6 @@ typedef struct
__IO uint16_t ManufactDate; // Manufacturing Date
} SD_CID;
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
@ -109,7 +105,6 @@ typedef struct
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
typedef struct
{
SD_CSD SD_csd;
@ -120,7 +115,6 @@ typedef struct
uint8_t CardType;
} SD_CardInfo;
extern SD_CardInfo SD_cardInfo;
uint32_t SDIO_Init(uint32_t freq);

View File

@ -55,17 +55,28 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
switch (initStruct->CellSize)
{
case SDRAM_CELLSIZE_16Mb: row_n = 11; break;
case SDRAM_CELLSIZE_64Mb: row_n = 12; break;
case SDRAM_CELLSIZE_128Mb: row_n = 12; break;
case SDRAM_CELLSIZE_256Mb: row_n = 13; break;
default: row_n = 13; break;
case SDRAM_CELLSIZE_16Mb:
row_n = 11;
break;
case SDRAM_CELLSIZE_64Mb:
row_n = 12;
break;
case SDRAM_CELLSIZE_128Mb:
row_n = 12;
break;
case SDRAM_CELLSIZE_256Mb:
row_n = 13;
break;
default:
row_n = 13;
break;
}
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
(((SystemCoreClock / 2) / 1000 * 64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
while(SDRAMC->REFDONE == 0);
while (SDRAMC->REFDONE == 0)
;
}
/******************************************************************************************************************************************
@ -82,7 +93,8 @@ void SDRAM_Enable(void)
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
for(i = 0; i < 100; i++) __NOP();
for (i = 0; i < 100; i++)
__NOP();
}
/******************************************************************************************************************************************
@ -99,5 +111,6 @@ void SDRAM_Disable(void)
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
for(i = 0; i < 100; i++) __NOP();
for (i = 0; i < 100; i++)
__NOP();
}

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_SDRAM_H__
#define __SWM320_SDRAM_H__
typedef struct {
typedef struct
{
uint8_t CellSize; // SDRAM颗粒的容量SDRAM_CELLSIZE_16Mb、SDRAM_CELLSIZE_64Mb、SDRAM_CELLSIZE_128Mb、SDRAM_CELLSIZE_256Mb
uint8_t CellBank; // SDRAM颗粒有几个bankSDRAM_CELLBANK_2、SDRAM_CELLBANK_4
uint8_t CellWidth; // SDRAM颗粒的位宽SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
@ -72,8 +73,6 @@ typedef struct {
#define SDRAM_TRP_6 6
#define SDRAM_TRP_7 7
void SDRAM_Init(SDRAM_InitStructure *initStruct);
void SDRAM_Enable(void);

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_spi.h"
/******************************************************************************************************************************************
* : SPI_Init()
* : SPI同步串行接口初始化FIFO触发设定
@ -150,7 +149,8 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
SPIx->DATA = data;
while((SPIx->STAT & SPI_STAT_WTC_Msk) == 0);
while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
;
}
/******************************************************************************************************************************************
@ -164,7 +164,8 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->DATA = data;
while(!(SPIx->STAT & SPI_STAT_RFNE_Msk));
while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
;
return SPIx->DATA;
}
@ -205,7 +206,6 @@ uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx)
return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* : SPI_INTRXHalfFullEn()
* : FIFO半满中断使能

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_SPI_H__
#define __SWM320_SPI_H__
typedef struct {
typedef struct
{
uint8_t FrameFormat; //帧格式SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下选择数据采样边沿SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下选择空闲时无数据传输时时钟线的电平SPI_LOW_LEVEL、SPI_HIGH_LEVEL
@ -32,8 +33,6 @@ typedef struct {
#define SPI_CLKDIV_256 6
#define SPI_CLKDIV_512 7
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开允许收发
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭禁止收发
@ -47,7 +46,6 @@ uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空如果不
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满如果不满则可以继续SPI_Write()
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
@ -79,5 +77,4 @@ void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
#endif //__SWM320_SPI_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_sram.h"
/******************************************************************************************************************************************
* : SRAM_Init()
* : SRAM控制器初始化
@ -34,18 +33,22 @@ void SRAM_Init(SRAM_InitStructure * initStruct)
uint32_t i;
// 配置SRAM前需要刷新下SDRAM控制器
do {
do
{
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
while(SDRAMC->REFDONE == 0);
while (SDRAMC->REFDONE == 0)
;
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
for(i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
} while (0);
SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
for(i = 0; i < 10; i++) __NOP();
for (i = 0; i < 10; i++)
__NOP();
SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
(initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |

View File

@ -1,12 +1,12 @@
#ifndef __SWM320_SRAM_H__
#define __SWM320_SRAM_H__
typedef struct {
typedef struct
{
uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16根据SRAM芯片所能跑的最高频率选择合适分频
uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
} SRAM_InitStructure;
#define SRAM_CLKDIV_4 3
#define SRAM_CLKDIV_5 4
#define SRAM_CLKDIV_6 5
@ -24,8 +24,6 @@ typedef struct {
#define SRAM_DATAWIDTH_8 1
#define SRAM_DATAWIDTH_16 0
void SRAM_Init(SRAM_InitStructure *initStruct);
#endif //__SWM320_SRAM_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_timr.h"
/******************************************************************************************************************************************
* : TIMR_Init()
* : TIMR定时器/
@ -50,7 +49,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
if(int_en) NVIC_EnableIRQ(TIMR0_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR0_IRQn);
break;
case ((uint32_t)TIMR1):
@ -58,7 +58,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
if(int_en) NVIC_EnableIRQ(TIMR1_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR1_IRQn);
break;
case ((uint32_t)TIMR2):
@ -66,7 +67,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
if(int_en) NVIC_EnableIRQ(TIMR2_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR2_IRQn);
break;
case ((uint32_t)TIMR3):
@ -74,7 +76,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
if(int_en) NVIC_EnableIRQ(TIMR3_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR3_IRQn);
break;
case ((uint32_t)TIMR4):
@ -82,7 +85,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
if(int_en) NVIC_EnableIRQ(TIMR4_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR4_IRQn);
break;
case ((uint32_t)TIMR5):
@ -90,7 +94,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
if(int_en) NVIC_EnableIRQ(TIMR5_IRQn);
if (int_en)
NVIC_EnableIRQ(TIMR5_IRQn);
break;
}
}
@ -380,7 +385,6 @@ uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
return 0;
}
/******************************************************************************************************************************************
* : Pulse_Init()
* :
@ -399,7 +403,8 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en)
TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
if(int_en) NVIC_EnableIRQ(PULSE_IRQn);
if (int_en)
NVIC_EnableIRQ(PULSE_IRQn);
}
/******************************************************************************************************************************************

View File

@ -19,8 +19,6 @@ void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx); //获取中断状态
#define PULSE_LOW 0
#define PULSE_HIGH 1
@ -28,5 +26,4 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en);
void Pulse_Start(void);
uint32_t Pulse_Done(void);
#endif //__SWM320_TIMR_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_uart.h"
/******************************************************************************************************************************************
* : UART_Init()
* : UART串口初始化
@ -67,10 +66,18 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
*/
switch ((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
{
case ((uint32_t)UART0): NVIC_DisableIRQ(UART0_IRQn); break;
case ((uint32_t)UART1): NVIC_DisableIRQ(UART1_IRQn); break;
case ((uint32_t)UART2): NVIC_DisableIRQ(UART2_IRQn); break;
case ((uint32_t)UART3): NVIC_DisableIRQ(UART3_IRQn); break;
case ((uint32_t)UART0):
NVIC_DisableIRQ(UART0_IRQn);
break;
case ((uint32_t)UART1):
NVIC_DisableIRQ(UART1_IRQn);
break;
case ((uint32_t)UART2):
NVIC_DisableIRQ(UART2_IRQn);
break;
case ((uint32_t)UART3):
NVIC_DisableIRQ(UART3_IRQn);
break;
}
UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
@ -183,7 +190,8 @@ uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
*data = (reg & UART_DATA_DATA_Msk);
if(reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
if (reg & UART_DATA_PAERR_Msk)
return UART_ERR_PARITY;
return 0;
}
@ -374,11 +382,17 @@ void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
{
uint32_t bits;
if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
else while(1);
if ((detectChar == 0xFF) || (detectChar == 0x1FF))
bits = 0;
else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
bits = 1;
else if ((detectChar == 0xF8) || (detectChar == 0x1F8))
bits = 2;
else if ((detectChar == 0x80) || (detectChar == 0x180))
bits = 3;
else
while (1)
;
UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_UART_H__
#define __SWM320_UART_H__
typedef struct {
typedef struct
{
uint32_t Baudrate;
uint8_t DataBits; //数据位位数可取值UART_DATA_8BIT、UART_DATA_9BIT
@ -20,7 +21,6 @@ typedef struct {
uint8_t TimeoutIEn; //超时中断RX FIFO非空且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
} UART_InitStructure;
#define UART_DATA_8BIT 0
#define UART_DATA_9BIT 1
@ -45,7 +45,6 @@ typedef struct {
#define UART_ERR_PARITY 2
#define UART_ERR_NOISE 3
void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART串口初始化
void UART_Open(UART_TypeDef *UARTx);
void UART_Close(UART_TypeDef *UARTx);
@ -57,7 +56,6 @@ uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空如果不空则可以继续UART_ReadByte()
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满如果不满则可以继续UART_WriteByte()
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
@ -75,7 +73,6 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx);
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
@ -90,5 +87,4 @@ void UART_INTTXDoneEn(UART_TypeDef * UARTx);
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
#endif //__SWM320_UART_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_wdt.h"
/******************************************************************************************************************************************
* : WDT_Init()
* : WDT看门狗初始化

View File

@ -12,7 +12,6 @@ void WDT_Feed(WDT_TypeDef * WDTx); //喂狗,重新从装载值开始倒计
int32_t WDT_GetValue(WDT_TypeDef *WDTx); //获取指定看门狗定时器的当前倒计时值
void WDT_INTClr(WDT_TypeDef *WDTx); //中断标志清除
uint32_t WDT_INTStat(WDT_TypeDef *WDTx); //中断状态查询