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

@ -8,7 +8,7 @@
*/ */
typedef enum IRQn typedef enum IRQn
{ {
/****** Cortex-M0 Processor Exceptions Numbers **********************************************/ /****** Cortex-M0 Processor Exceptions Numbers **********************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */
@ -18,7 +18,7 @@ typedef enum IRQn
PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */
/****** Cortex-M4 specific Interrupt Numbers ************************************************/ /****** Cortex-M4 specific Interrupt Numbers ************************************************/
GPIOA0_IRQn = 0, GPIOA0_IRQn = 0,
GPIOA1_IRQn = 1, GPIOA1_IRQn = 1,
GPIOA2_IRQn = 2, GPIOA2_IRQn = 2,
@ -100,19 +100,19 @@ typedef enum IRQn
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ #define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
#define __FPU_PRESENT 0 /*!< FPU present */ #define __FPU_PRESENT 0 /*!< FPU present */
#if defined ( __CC_ARM ) #if defined(__CC_ARM)
#pragma anon_unions #pragma anon_unions
#endif #endif
#include <stdio.h> #include <stdio.h>
#include "core_cm4.h" /* Cortex-M0 processor and core peripherals */ #include "core_cm4.h" /* Cortex-M0 processor and core peripherals */
#include "system_SWM320.h" #include "system_SWM320.h"
/******************************************************************************/ /******************************************************************************/
/* Device Specific Peripheral registers structures */ /* Device Specific Peripheral registers structures */
/******************************************************************************/ /******************************************************************************/
typedef struct { typedef struct
{
__IO uint32_t CLKSEL; //Clock Select __IO uint32_t CLKSEL; //Clock Select
__IO uint32_t CLKDIV; __IO uint32_t CLKDIV;
@ -127,29 +127,29 @@ typedef struct {
__IO uint32_t RTCWKEN; //[0] 1 使能RTC唤醒功能 __IO uint32_t RTCWKEN; //[0] 1 使能RTC唤醒功能
uint32_t RESERVED[52+64]; uint32_t RESERVED[52 + 64];
__IO uint32_t PAWKEN; //Port A Wakeup Enable __IO uint32_t PAWKEN; //Port A Wakeup Enable
__IO uint32_t PBWKEN; __IO uint32_t PBWKEN;
__IO uint32_t PCWKEN; __IO uint32_t PCWKEN;
uint32_t RESERVED2[1+4]; uint32_t RESERVED2[1 + 4];
__IO uint32_t PAWKSR; //Port A Wakeup Status Register写1清零 __IO uint32_t PAWKSR; //Port A Wakeup Status Register写1清零
__IO uint32_t PBWKSR; __IO uint32_t PBWKSR;
__IO uint32_t PCWKSR; __IO uint32_t PCWKSR;
uint32_t RESERVED3[64-10]; uint32_t RESERVED3[64 - 10];
__IO uint32_t RSTCR; //Reset Control Register __IO uint32_t RSTCR; //Reset Control Register
__IO uint32_t RSTSR; //Reset Status Register __IO uint32_t RSTSR; //Reset Status Register
uint32_t RESERVED4[61+64]; uint32_t RESERVED4[61 + 64];
__IO uint32_t BKP[3]; //数据备份寄存器 __IO uint32_t BKP[3]; //数据备份寄存器
//RTC Power Domain: 0x4001E000 //RTC Power Domain: 0x4001E000
uint32_t RESERVED5[(0x4001E000-0x40000508)/4-1]; uint32_t RESERVED5[(0x4001E000 - 0x40000508) / 4 - 1];
__IO uint32_t RTCBKP[8]; //RTC电源域数据备份寄存器 __IO uint32_t RTCBKP[8]; //RTC电源域数据备份寄存器
@ -162,7 +162,7 @@ typedef struct {
__IO uint32_t RTCLDOTRIM; //RTC Power Domain LDO Trim __IO uint32_t RTCLDOTRIM; //RTC Power Domain LDO Trim
//Analog Control: 0x40031000 //Analog Control: 0x40031000
uint32_t RESERVED7[(0x40031000-0x4001E030)/4-1]; uint32_t RESERVED7[(0x40031000 - 0x4001E030) / 4 - 1];
__IO uint32_t HRCCR; //High speed RC Control Register __IO uint32_t HRCCR; //High speed RC Control Register
@ -181,7 +181,6 @@ typedef struct {
__IO uint32_t ADC1IN7; __IO uint32_t ADC1IN7;
} SYS_TypeDef; } SYS_TypeDef;
#define SYS_CLKSEL_LFCK_Pos 0 //Low Frequency Clock Source 0 LRC 1 PLL #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_LFCK_Msk (0x01 << SYS_CLKSEL_LFCK_Pos)
#define SYS_CLKSEL_HFCK_Pos 1 //High Frequency Clock Source 0 HRC 1 XTAL #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_Pos 0 //LRC U调控制位
#define SYS_LRCTRIM1_U_Msk (0x7FFF << SYS_LRCTRIM1_U_Pos) #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_Pos 0 //Double Frequency 0 20MHz 1 40MHz
#define SYS_HRCCR_DBL_Msk (0x01 << SYS_HRCCR_DBL_Pos) #define SYS_HRCCR_DBL_Msk (0x01 << SYS_HRCCR_DBL_Pos)
#define SYS_HRCCR_OFF_Pos 1 //High speed RC Off #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_Pos 2
#define SYS_PLLCR_OFF_Msk (0x01 << SYS_PLLCR_OFF_Pos) #define SYS_PLLCR_OFF_Msk (0x01 << SYS_PLLCR_OFF_Pos)
#define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器 #define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器 \
//VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV //VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV \
//PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV //PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
#define SYS_PLLDIV_FBDIV_Msk (0x1FF << SYS_PLLDIV_FBDIV_Pos) #define SYS_PLLDIV_FBDIV_Msk (0x1FF << SYS_PLLDIV_FBDIV_Pos)
#define SYS_PLLDIV_ADDIV_Pos 9 //ADC时钟基即VCO输出分频后的时钟经ADDIV分频后作为ADC的转换时钟 #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_Pos 4 //ADC1模块模拟通道7所用IO开关
#define SYS_ADC1IN7_IOON_Msk (0x01 << SYS_ADC1IN7_IOON_Pos) #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、模拟、数字等功能 __IO uint32_t PORTA_SEL; //给PORTA_SEL[2n+2:2n]赋相应的值将PORTA.PINn引脚配置成GPIO、模拟、数字等功能
//当赋值为PORTA_PINn_FUNMUX时PORTA.PINn引脚可通过PORTA_MUX寄存器连接到各种数字外设 //当赋值为PORTA_PINn_FUNMUX时PORTA.PINn引脚可通过PORTA_MUX寄存器连接到各种数字外设
__IO uint32_t PORTB_SEL; __IO uint32_t PORTB_SEL;
@ -501,7 +497,6 @@ typedef struct {
__IO uint32_t PORTP_INEN; __IO uint32_t PORTP_INEN;
} PORT_TypeDef; } PORT_TypeDef;
#define PORT_PORTA_PULLU_PIN0_Pos 0 #define PORT_PORTA_PULLU_PIN0_Pos 0
#define PORT_PORTA_PULLU_PIN0_Msk (0x01 << PORT_PORTA_PULLU_PIN0_Pos) #define PORT_PORTA_PULLU_PIN0_Msk (0x01 << PORT_PORTA_PULLU_PIN0_Pos)
#define PORT_PORTA_PULLU_PIN1_Pos 1 #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_Pos 23
#define PORT_PORTP_INEN_PIN23_Msk (0x01 << PORT_PORTP_INEN_PIN23_Pos) #define PORT_PORTP_INEN_PIN23_Msk (0x01 << PORT_PORTP_INEN_PIN23_Pos)
typedef struct
{
typedef struct {
__IO uint32_t DATA; __IO uint32_t DATA;
#define PIN0 0 #define PIN0 0
#define PIN1 1 #define PIN1 1
@ -1189,7 +1182,6 @@ typedef struct {
__IO uint32_t INTCLR; //写1清除中断标志只对边沿触发中断有用 __IO uint32_t INTCLR; //写1清除中断标志只对边沿触发中断有用
} GPIO_TypeDef; } GPIO_TypeDef;
#define GPIO_DATA_PIN0_Pos 0 #define GPIO_DATA_PIN0_Pos 0
#define GPIO_DATA_PIN0_Msk (0x01 << GPIO_DATA_PIN0_Pos) #define GPIO_DATA_PIN0_Msk (0x01 << GPIO_DATA_PIN0_Pos)
#define GPIO_DATA_PIN1_Pos 1 #define GPIO_DATA_PIN1_Pos 1
@ -1631,10 +1623,8 @@ typedef struct {
#define GPIO_INTCLR_PIN23_Pos 23 #define GPIO_INTCLR_PIN23_Pos 23
#define GPIO_INTCLR_PIN23_Msk (0x01 << GPIO_INTCLR_PIN23_Pos) #define GPIO_INTCLR_PIN23_Msk (0x01 << GPIO_INTCLR_PIN23_Pos)
typedef struct
{
typedef struct {
__IO uint32_t LDVAL; //定时器加载值,使能后定时器从此数值开始向下递减计数 __IO uint32_t LDVAL; //定时器加载值,使能后定时器从此数值开始向下递减计数
__I uint32_t CVAL; //定时器当前值LDVAL-CVAL 可计算出计时时长 __I uint32_t CVAL; //定时器当前值LDVAL-CVAL 可计算出计时时长
@ -1642,7 +1632,6 @@ typedef struct {
__IO uint32_t CTRL; __IO uint32_t CTRL;
} TIMR_TypeDef; } TIMR_TypeDef;
#define TIMR_CTRL_EN_Pos 0 //此位赋1导致TIMR从LDVAL开始向下递减计数 #define TIMR_CTRL_EN_Pos 0 //此位赋1导致TIMR从LDVAL开始向下递减计数
#define TIMR_CTRL_EN_Msk (0x01 << TIMR_CTRL_EN_Pos) #define TIMR_CTRL_EN_Msk (0x01 << TIMR_CTRL_EN_Pos)
#define TIMR_CTRL_CLKSRC_Pos 1 //时钟源0 内部系统时钟 1 外部引脚脉冲计数 #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_Pos 2 //1 TIMRx的计数时钟为TIMRx-1的溢出信号
#define TIMR_CTRL_CASCADE_Msk (0x01 << TIMR_CTRL_CASCADE_Pos) #define TIMR_CTRL_CASCADE_Msk (0x01 << TIMR_CTRL_CASCADE_Pos)
typedef struct
typedef struct { {
__IO uint32_t PCTRL; //Pulse Control脉宽测量模块控制寄存器 __IO uint32_t PCTRL; //Pulse Control脉宽测量模块控制寄存器
__I uint32_t PCVAL; //脉宽测量定时器当前值 __I uint32_t PCVAL; //脉宽测量定时器当前值
@ -1665,7 +1654,6 @@ typedef struct {
__IO uint32_t HALT; __IO uint32_t HALT;
} TIMRG_TypeDef; } TIMRG_TypeDef;
#define TIMRG_PCTRL_EN_Pos 0 //开始测量脉宽脉宽内32位计数器从0开始向上计数 #define TIMRG_PCTRL_EN_Pos 0 //开始测量脉宽脉宽内32位计数器从0开始向上计数
#define TIMRG_PCTRL_EN_Msk (0x01 << TIMRG_PCTRL_EN_Pos) #define TIMRG_PCTRL_EN_Msk (0x01 << TIMRG_PCTRL_EN_Pos)
#define TIMRG_PCTRL_HIGH_Pos 1 //0 测量低电平长度 1 测量高电平长度 #define TIMRG_PCTRL_HIGH_Pos 1 //0 测量低电平长度 1 测量高电平长度
@ -1716,10 +1704,8 @@ typedef struct {
#define TIMRG_HALT_TIMR5_Pos 5 #define TIMRG_HALT_TIMR5_Pos 5
#define TIMRG_HALT_TIMR5_Msk (0x01 << TIMRG_HALT_TIMR5_Pos) #define TIMRG_HALT_TIMR5_Msk (0x01 << TIMRG_HALT_TIMR5_Pos)
typedef struct
{
typedef struct {
__IO uint32_t DATA; __IO uint32_t DATA;
__IO uint32_t CTRL; __IO uint32_t CTRL;
@ -1730,14 +1716,14 @@ typedef struct {
__IO uint32_t LINCR; __IO uint32_t LINCR;
union { union
{
__IO uint32_t CTSCR; __IO uint32_t CTSCR;
__IO uint32_t RTSCR; __IO uint32_t RTSCR;
}; };
} UART_TypeDef; } UART_TypeDef;
#define UART_DATA_DATA_Pos 0 #define UART_DATA_DATA_Pos 0
#define UART_DATA_DATA_Msk (0x1FF << UART_DATA_DATA_Pos) #define UART_DATA_DATA_Msk (0x1FF << UART_DATA_DATA_Pos)
#define UART_DATA_VALID_Pos 9 //当DATA字段有有效的接收数据时该位硬件置1读取数据后自动清零 #define UART_DATA_VALID_Pos 9 //当DATA字段有有效的接收数据时该位硬件置1读取数据后自动清零
@ -1780,7 +1766,7 @@ typedef struct {
#define UART_CTRL_STOP2b_Pos 22 //1 2位停止位 0 1位停止位 #define UART_CTRL_STOP2b_Pos 22 //1 2位停止位 0 1位停止位
#define UART_CTRL_STOP2b_Msk (0x03 << UART_CTRL_STOP2b_Pos) #define UART_CTRL_STOP2b_Msk (0x03 << UART_CTRL_STOP2b_Pos)
#define UART_CTRL_TOTIME_Pos 24 //TimeOut 时长 = TOTIME/(BAUDRAUD/10) 秒 #define UART_CTRL_TOTIME_Pos 24 //TimeOut 时长 = TOTIME/(BAUDRAUD/10) 秒
#define UART_CTRL_TOTIME_Msk (0xFFu<< UART_CTRL_TOTIME_Pos) #define UART_CTRL_TOTIME_Msk (0xFFu << UART_CTRL_TOTIME_Pos)
#define UART_BAUD_BAUD_Pos 0 //串口波特率 = SYS_Freq/16/BAUD - 1 #define UART_BAUD_BAUD_Pos 0 //串口波特率 = SYS_Freq/16/BAUD - 1
#define UART_BAUD_BAUD_Msk (0x3FFF << UART_BAUD_BAUD_Pos) #define UART_BAUD_BAUD_Msk (0x3FFF << UART_BAUD_BAUD_Pos)
@ -1804,9 +1790,9 @@ typedef struct {
#define UART_BAUD_RXIF_Msk (0x01 << UART_BAUD_RXIF_Pos) #define UART_BAUD_RXIF_Msk (0x01 << UART_BAUD_RXIF_Pos)
#define UART_BAUD_ABREN_Pos 23 //Auto Baudrate Enable写1启动自动波特率校准完成后自动清零 #define UART_BAUD_ABREN_Pos 23 //Auto Baudrate Enable写1启动自动波特率校准完成后自动清零
#define UART_BAUD_ABREN_Msk (0x01 << UART_BAUD_ABREN_Pos) #define UART_BAUD_ABREN_Msk (0x01 << UART_BAUD_ABREN_Pos)
#define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit用于计算波特率的检测位长0 1位通过测起始位 脉宽计算波特率要求发送端发送0xFF #define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit用于计算波特率的检测位长0 1位通过测起始位 脉宽计算波特率要求发送端发送0xFF \
// 1 2位通过测起始位加1位数据位脉宽计算波特率要求发送端发送0xFE // 1 210xFE \
// 1 4位通过测起始位加3位数据位脉宽计算波特率要求发送端发送0xF8 // 1 430xF8 \
// 1 8位通过测起始位加7位数据位脉宽计算波特率要求发送端发送0x80 // 1 8位通过测起始位加7位数据位脉宽计算波特率要求发送端发送0x80
#define UART_BAUD_ABRBIT_Msk (0x03 << UART_BAUD_ABRBIT_Pos) #define UART_BAUD_ABRBIT_Msk (0x03 << UART_BAUD_ABRBIT_Pos)
#define UART_BAUD_ABRERR_Pos 26 //Auto Baudrate Error0 自动波特率校准成功 1 自动波特率校准失败 #define UART_BAUD_ABRERR_Pos 26 //Auto Baudrate Error0 自动波特率校准成功 1 自动波特率校准失败
@ -1821,7 +1807,7 @@ typedef struct {
#define UART_FIFO_RXTHR_Pos 16 //RX FIFO ThresholdRX中断触发门限中断使能时 RXLVL >= RXTHR 触发RX中断 #define UART_FIFO_RXTHR_Pos 16 //RX FIFO ThresholdRX中断触发门限中断使能时 RXLVL >= RXTHR 触发RX中断
#define UART_FIFO_RXTHR_Msk (0xFF << UART_FIFO_RXTHR_Pos) #define UART_FIFO_RXTHR_Msk (0xFF << UART_FIFO_RXTHR_Pos)
#define UART_FIFO_TXTHR_Pos 24 //TX FIFO ThresholdTX中断触发门限中断使能时 TXLVL <= TXTHR 触发TX中断 #define UART_FIFO_TXTHR_Pos 24 //TX FIFO ThresholdTX中断触发门限中断使能时 TXLVL <= TXTHR 触发TX中断
#define UART_FIFO_TXTHR_Msk (0xFFu<< UART_FIFO_TXTHR_Pos) #define UART_FIFO_TXTHR_Msk (0xFFu << UART_FIFO_TXTHR_Pos)
#define UART_LINCR_BRKDETIE_Pos 0 //检测到LIN Break中断使能 #define UART_LINCR_BRKDETIE_Pos 0 //检测到LIN Break中断使能
#define UART_LINCR_BRKDETIE_Msk (0x01 << UART_LINCR_BRKDETIE_Pos) #define UART_LINCR_BRKDETIE_Msk (0x01 << UART_LINCR_BRKDETIE_Pos)
@ -1850,10 +1836,8 @@ typedef struct {
#define UART_RTSCR_STAT_Pos 8 //RTS信号的当前状态 #define UART_RTSCR_STAT_Pos 8 //RTS信号的当前状态
#define UART_RTSCR_STAT_Msk (0x01 << UART_RTSCR_STAT_Pos) #define UART_RTSCR_STAT_Msk (0x01 << UART_RTSCR_STAT_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CTRL; __IO uint32_t CTRL;
__IO uint32_t DATA; __IO uint32_t DATA;
@ -1865,7 +1849,6 @@ typedef struct {
__IO uint32_t IF; __IO uint32_t IF;
} SPI_TypeDef; } SPI_TypeDef;
#define SPI_CTRL_CLKDIV_Pos 0 //Clock Divider, SPI工作时钟 = SYS_Freq/pow(2, CLKDIV+2) #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_CLKDIV_Msk (0x07 << SPI_CTRL_CLKDIV_Pos)
#define SPI_CTRL_EN_Pos 3 #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_Pos 9 //Frame Transmit CompleteWTC置位时若TX FIFO是空的则FTC置位
#define SPI_IF_FTC_Msk (0x01 << SPI_IF_FTC_Pos) #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 CLKDIV; //[15:0] 须将内部工作频率分到SCL频率的5倍即CLKDIV = SYS_Freq/5/SCL_Freq - 1
__IO uint32_t CTRL; __IO uint32_t CTRL;
@ -1961,7 +1942,6 @@ typedef struct {
__IO uint32_t SLVRX; __IO uint32_t SLVRX;
} I2C_TypeDef; } I2C_TypeDef;
#define I2C_CTRL_MSTIE_Pos 6 #define I2C_CTRL_MSTIE_Pos 6
#define I2C_CTRL_MSTIE_Msk (0x01 << I2C_CTRL_MSTIE_Pos) #define I2C_CTRL_MSTIE_Msk (0x01 << I2C_CTRL_MSTIE_Pos)
#define I2C_CTRL_EN_Pos 7 #define I2C_CTRL_EN_Pos 7
@ -2024,10 +2004,8 @@ typedef struct {
#define I2C_SLVIF_ACTIVE_Pos 6 //slave 有效 #define I2C_SLVIF_ACTIVE_Pos 6 //slave 有效
#define I2C_SLVIF_ACTIVE_Msk (0x01 << I2C_SLVIF_ACTIVE_Pos) #define I2C_SLVIF_ACTIVE_Msk (0x01 << I2C_SLVIF_ACTIVE_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CTRL; __IO uint32_t CTRL;
__IO uint32_t START; __IO uint32_t START;
@ -2036,7 +2014,8 @@ typedef struct {
__IO uint32_t IF; __IO uint32_t IF;
struct { struct
{
__IO uint32_t STAT; __IO uint32_t STAT;
__IO uint32_t DATA; __IO uint32_t DATA;
@ -2055,7 +2034,6 @@ typedef struct {
__IO uint32_t CALIBEN; __IO uint32_t CALIBEN;
} ADC_TypeDef; } ADC_TypeDef;
#define ADC_CTRL_CH0_Pos 0 //通道选中 #define ADC_CTRL_CH0_Pos 0 //通道选中
#define ADC_CTRL_CH0_Msk (0x01 << ADC_CTRL_CH0_Pos) #define ADC_CTRL_CH0_Msk (0x01 << ADC_CTRL_CH0_Pos)
#define ADC_CTRL_CH1_Pos 1 #define ADC_CTRL_CH1_Pos 1
@ -2083,7 +2061,7 @@ typedef struct {
#define ADC_CTRL_CLKSRC_Pos 15 //0 VCO 1 HRC #define ADC_CTRL_CLKSRC_Pos 15 //0 VCO 1 HRC
#define ADC_CTRL_CLKSRC_Msk (0x01 << ADC_CTRL_CLKSRC_Pos) #define ADC_CTRL_CLKSRC_Msk (0x01 << ADC_CTRL_CLKSRC_Pos)
#define ADC_CTRL_FIFOCLR_Pos 24 //[24] CH0_FIFO_CLR [25] CH1_FIFO_CLR ... [31] CH7_FIFO_CLR #define ADC_CTRL_FIFOCLR_Pos 24 //[24] CH0_FIFO_CLR [25] CH1_FIFO_CLR ... [31] CH7_FIFO_CLR
#define ADC_CTRL_FIFOCLR_Msk (0xFFu<< ADC_CTRL_FIFOCLR_Pos) #define ADC_CTRL_FIFOCLR_Msk (0xFFu << ADC_CTRL_FIFOCLR_Pos)
#define ADC_START_GO_Pos 0 //软件触发模式下写1启动ADC采样和转换在单次模式下转换完成后硬件自动清零在扫描模式下必须软件写0停止ADC转换 #define ADC_START_GO_Pos 0 //软件触发模式下写1启动ADC采样和转换在单次模式下转换完成后硬件自动清零在扫描模式下必须软件写0停止ADC转换
#define ADC_START_GO_Msk (0x01 << ADC_START_GO_Pos) #define ADC_START_GO_Msk (0x01 << ADC_START_GO_Pos)
@ -2153,7 +2131,7 @@ typedef struct {
#define ADC_IE_CH7HFULL_Pos 30 #define ADC_IE_CH7HFULL_Pos 30
#define ADC_IE_CH7HFULL_Msk (0x01 << ADC_IE_CH7HFULL_Pos) #define ADC_IE_CH7HFULL_Msk (0x01 << ADC_IE_CH7HFULL_Pos)
#define ADC_IE_CH7FULL_Pos 31 #define ADC_IE_CH7FULL_Pos 31
#define ADC_IE_CH7FULL_Msk (0x01u<< ADC_IE_CH7FULL_Pos) #define ADC_IE_CH7FULL_Msk (0x01u << ADC_IE_CH7FULL_Pos)
#define ADC_IF_CH0EOC_Pos 0 //写1清零 #define ADC_IF_CH0EOC_Pos 0 //写1清零
#define ADC_IF_CH0EOC_Msk (0x01 << ADC_IF_CH0EOC_Pos) #define ADC_IF_CH0EOC_Msk (0x01 << ADC_IF_CH0EOC_Pos)
@ -2247,22 +2225,20 @@ typedef struct {
#define ADC_CTRL2_CLKDIV_Pos 24 //时钟分频只在时钟源为HRC时有效 #define ADC_CTRL2_CLKDIV_Pos 24 //时钟分频只在时钟源为HRC时有效
#define ADC_CTRL2_CLKDIV_Msk (0x1F << ADC_CTRL2_CLKDIV_Pos) #define ADC_CTRL2_CLKDIV_Msk (0x1F << ADC_CTRL2_CLKDIV_Pos)
#define ADC_CTRL2_PGAVCM_Pos 29 #define ADC_CTRL2_PGAVCM_Pos 29
#define ADC_CTRL2_PGAVCM_Msk (0x07u<< ADC_CTRL2_PGAVCM_Pos) #define ADC_CTRL2_PGAVCM_Msk (0x07u << ADC_CTRL2_PGAVCM_Pos)
#define ADC_CALIBSET_OFFSET_Pos 0 #define ADC_CALIBSET_OFFSET_Pos 0
#define ADC_CALIBSET_OFFSET_Msk (0x1FF<< ADC_CALIBSET_OFFSET_Pos) #define ADC_CALIBSET_OFFSET_Msk (0x1FF << ADC_CALIBSET_OFFSET_Pos)
#define ADC_CALIBSET_K_Pos 16 #define ADC_CALIBSET_K_Pos 16
#define ADC_CALIBSET_K_Msk (0x1FF<< ADC_CALIBSET_K_Pos) #define ADC_CALIBSET_K_Msk (0x1FF << ADC_CALIBSET_K_Pos)
#define ADC_CALIBEN_OFFSET_Pos 0 #define ADC_CALIBEN_OFFSET_Pos 0
#define ADC_CALIBEN_OFFSET_Msk (0x01 << ADC_CALIBEN_OFFSET_Pos) #define ADC_CALIBEN_OFFSET_Msk (0x01 << ADC_CALIBEN_OFFSET_Pos)
#define ADC_CALIBEN_K_Pos 1 #define ADC_CALIBEN_K_Pos 1
#define ADC_CALIBEN_K_Msk (0x01 << ADC_CALIBEN_K_Pos) #define ADC_CALIBEN_K_Msk (0x01 << ADC_CALIBEN_K_Pos)
typedef struct
{
typedef struct {
__IO uint32_t MODE; //0 普通模式A、B两路输出互相独立 __IO uint32_t MODE; //0 普通模式A、B两路输出互相独立
//1 互补模式A、B两路输出都由PERA、HIGHA控制B路输出与A路输出极性相反且DZA、DZB控制A、B路输出上升沿推迟时间 //1 互补模式A、B两路输出都由PERA、HIGHA控制B路输出与A路输出极性相反且DZA、DZB控制A、B路输出上升沿推迟时间
//2 单次模式,同普通模式,但一个周期后自动停止 //2 单次模式,同普通模式,但一个周期后自动停止
@ -2284,14 +2260,13 @@ typedef struct {
__IO uint32_t INIOUT; //Init Output level初始输出电平 __IO uint32_t INIOUT; //Init Output level初始输出电平
} PWM_TypeDef; } PWM_TypeDef;
#define PWM_INIOUT_PWMA_Pos 0 #define PWM_INIOUT_PWMA_Pos 0
#define PWM_INIOUT_PWMA_Msk (0x01 << PWM_INIOUT_PWMA_Pos) #define PWM_INIOUT_PWMA_Msk (0x01 << PWM_INIOUT_PWMA_Pos)
#define PWM_INIOUT_PWMB_Pos 1 #define PWM_INIOUT_PWMB_Pos 1
#define PWM_INIOUT_PWMB_Msk (0x01 << PWM_INIOUT_PWMB_Pos) #define PWM_INIOUT_PWMB_Msk (0x01 << PWM_INIOUT_PWMB_Pos)
typedef struct
typedef struct { {
__IO uint32_t FORCEH; __IO uint32_t FORCEH;
__IO uint32_t ADTRG0A; __IO uint32_t ADTRG0A;
@ -2327,7 +2302,6 @@ typedef struct {
__IO uint32_t IRS; //Interrupt Raw Stat __IO uint32_t IRS; //Interrupt Raw Stat
} PWMG_TypeDef; } PWMG_TypeDef;
#define PWMG_FORCEH_PWM0_Pos 0 #define PWMG_FORCEH_PWM0_Pos 0
#define PWMG_FORCEH_PWM0_Msk (0x01 << PWMG_FORCEH_PWM0_Pos) #define PWMG_FORCEH_PWM0_Msk (0x01 << PWMG_FORCEH_PWM0_Pos)
#define PWMG_FORCEH_PWM1_Pos 1 #define PWMG_FORCEH_PWM1_Pos 1
@ -2396,7 +2370,6 @@ typedef struct {
#define PWMG_CHEN_PWM5B_Pos 11 #define PWMG_CHEN_PWM5B_Pos 11
#define PWMG_CHEN_PWM5B_Msk (0x01 << PWMG_CHEN_PWM5B_Pos) #define PWMG_CHEN_PWM5B_Msk (0x01 << PWMG_CHEN_PWM5B_Pos)
#define PWMG_IE_NEWP0A_Pos 0 #define PWMG_IE_NEWP0A_Pos 0
#define PWMG_IE_NEWP0A_Msk (0x01 << PWMG_IE_NEWP0A_Pos) #define PWMG_IE_NEWP0A_Msk (0x01 << PWMG_IE_NEWP0A_Pos)
#define PWMG_IE_NEWP0B_Pos 1 #define PWMG_IE_NEWP0B_Pos 1
@ -2601,10 +2574,8 @@ typedef struct {
#define PWMG_IRS_HALT_Pos 24 #define PWMG_IRS_HALT_Pos 24
#define PWMG_IRS_HALT_Msk (0x01 << PWMG_IRS_HALT_Pos) #define PWMG_IRS_HALT_Msk (0x01 << PWMG_IRS_HALT_Pos)
typedef struct
{
typedef struct {
__IO uint32_t EN; //[0] ENABLE __IO uint32_t EN; //[0] ENABLE
__IO uint32_t IE; //只有为1时IF[CHx]在DMA传输结束时才能变为1否则将一直保持在0 __IO uint32_t IE; //只有为1时IF[CHx]在DMA传输结束时才能变为1否则将一直保持在0
@ -2615,7 +2586,8 @@ typedef struct {
uint32_t RESERVED[12]; uint32_t RESERVED[12];
struct { struct
{
__IO uint32_t CR; __IO uint32_t CR;
__IO uint32_t AM; //Adress Mode __IO uint32_t AM; //Adress Mode
@ -2644,7 +2616,6 @@ typedef struct {
} CH[3]; } CH[3];
} DMA_TypeDef; } DMA_TypeDef;
#define DMA_IE_CH0_Pos 0 #define DMA_IE_CH0_Pos 0
#define DMA_IE_CH0_Msk (0x01 << DMA_IE_CH0_Pos) #define DMA_IE_CH0_Msk (0x01 << DMA_IE_CH0_Pos)
#define DMA_IE_CH1_Pos 1 #define DMA_IE_CH1_Pos 1
@ -2712,10 +2683,8 @@ typedef struct {
#define DMA_AM_BURST_Pos 16 #define DMA_AM_BURST_Pos 16
#define DMA_AM_BURST_Msk (0x01 << DMA_AM_BURST_Pos) #define DMA_AM_BURST_Msk (0x01 << DMA_AM_BURST_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CR; //Control Register __IO uint32_t CR; //Control Register
__O uint32_t CMD; //Command Register __O uint32_t CMD; //Command Register
@ -2744,8 +2713,10 @@ typedef struct {
__IO uint32_t TXERR; //TX错误计数 __IO uint32_t TXERR; //TX错误计数
union { union
struct { //在复位时可读写,正常工作模式下不可访问 {
struct
{ //在复位时可读写,正常工作模式下不可访问
__IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器 __IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器
__IO uint32_t AMR[4]; //Acceptance Mask Register, 验收屏蔽寄存器对应位写0ID必须和验收寄存器匹配 __IO uint32_t AMR[4]; //Acceptance Mask Register, 验收屏蔽寄存器对应位写0ID必须和验收寄存器匹配
@ -2753,14 +2724,17 @@ typedef struct {
uint32_t RESERVED[5]; uint32_t RESERVED[5];
} FILTER; } FILTER;
union { //在正常工作模式下可读写,复位时不可访问 union
struct { { //在正常工作模式下可读写,复位时不可访问
struct
{
__O uint32_t INFO; __O uint32_t INFO;
__O uint32_t DATA[12]; __O uint32_t DATA[12];
} TXFRAME; } TXFRAME;
struct { struct
{
__I uint32_t INFO; __I uint32_t INFO;
__I uint32_t DATA[12]; __I uint32_t DATA[12];
@ -2772,14 +2746,14 @@ typedef struct {
uint32_t RESERVED3[66]; uint32_t RESERVED3[66];
struct { //TXFRAME的读接口 struct
{ //TXFRAME的读接口
__I uint32_t INFO; __I uint32_t INFO;
__I uint32_t DATA[12]; __I uint32_t DATA[12];
} TXFRAME_R; } TXFRAME_R;
} CAN_TypeDef; } CAN_TypeDef;
#define CAN_CR_RST_Pos 0 #define CAN_CR_RST_Pos 0
#define CAN_CR_RST_Msk (0x01 << CAN_CR_RST_Pos) #define CAN_CR_RST_Msk (0x01 << CAN_CR_RST_Pos)
#define CAN_CR_LOM_Pos 1 //Listen Only Mode #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_Pos 7 //Frame Format0 标准帧格式 1 扩展帧格式
#define CAN_INFO_FF_Msk (0x01 << CAN_INFO_FF_Pos) #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 IE; //[0] 为0的时候IF[0]维持为0
__IO uint32_t IF; //[0] 当完成指定长度的数据传输时置1写1清零 __IO uint32_t IF; //[0] 当完成指定长度的数据传输时置1写1清零
@ -2900,16 +2872,15 @@ typedef struct {
__IO uint32_t PRECMDV; //在MPU接口中发送数据前RS拉低的那一拍数据总线上的值 __IO uint32_t PRECMDV; //在MPU接口中发送数据前RS拉低的那一拍数据总线上的值
} LCD_TypeDef; } LCD_TypeDef;
#define LCD_START_GO_Pos 1 //写1开始传输数据数据传输结束后自动清零 #define LCD_START_GO_Pos 1 //写1开始传输数据数据传输结束后自动清零
#define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos) #define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos)
#define LCD_START_BURST_Pos 2 #define LCD_START_BURST_Pos 2
#define LCD_START_BURST_Msk (0x01 << LCD_START_BURST_Pos) #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 //当portrait为1时表示水平方向的像素个数0表示1个最大为767
#define LCD_CR0_VPIX_Msk (0x3FF << LCD_CR0_VPIX_Pos) #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 //当portrait为1时表示垂直方向的像素个数0表示1个最大为1023
#define LCD_CR0_HPIX_Msk (0x3FF << LCD_CR0_HPIX_Pos) #define LCD_CR0_HPIX_Msk (0x3FF << LCD_CR0_HPIX_Pos)
#define LCD_CR0_DCLK_Pos 20 //0 DOTCLK一直翻转 1 DOTCLK在空闲时停在1 #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_Pos 26 //1 输出DOTCLK反向应用于用DOTCLK下降沿采样数据的屏
#define LCD_CR1_DCLKINV_Msk (0x01 << LCD_CR1_DCLKINV_Pos) #define LCD_CR1_DCLKINV_Msk (0x01 << LCD_CR1_DCLKINV_Pos)
typedef struct
{
typedef struct {
__IO uint32_t DMA_MEM_ADDR; __IO uint32_t DMA_MEM_ADDR;
__IO uint32_t BLK; //Block Size and Count __IO uint32_t BLK; //Block Size and Count
@ -2965,7 +2934,6 @@ typedef struct {
__IO uint32_t MAXCURR; __IO uint32_t MAXCURR;
} SDIO_TypeDef; } SDIO_TypeDef;
#define SDIO_BLK_SIZE_Pos 0 //0x200 512字节 0x400 1024字节 0x800 2048字节 #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_SIZE_Msk (0xFFF << SDIO_BLK_SIZE_Pos)
#define SDIO_BLK_COUNT_Pos 16 //0 Stop Transfer 1 1块 2 2块 ... ... #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_Pos 28
#define SDIO_IM_RESPERR_Msk (0x01 << SDIO_IM_RESPERR_Pos) #define SDIO_IM_RESPERR_Msk (0x01 << SDIO_IM_RESPERR_Pos)
typedef struct
{
typedef struct {
__IO uint32_t DATA; __IO uint32_t DATA;
__IO uint32_t ADDR; __IO uint32_t ADDR;
__IO uint32_t ERASE; __IO uint32_t ERASE;
@ -3164,9 +3130,8 @@ typedef struct {
__IO uint32_t STAT; __IO uint32_t STAT;
} FLASH_Typedef; } FLASH_Typedef;
#define FLASH_ERASE_REQ_Pos 31 #define FLASH_ERASE_REQ_Pos 31
#define FLASH_ERASE_REQ_Msk (0x01u<< FLASH_ERASE_REQ_Pos) #define FLASH_ERASE_REQ_Msk (0x01u << FLASH_ERASE_REQ_Pos)
#define FLASH_CACHE_PROG_Pos 2 #define FLASH_CACHE_PROG_Pos 2
#define FLASH_CACHE_PROG_Msk (0x01 << FLASH_CACHE_PROG_Pos) #define FLASH_CACHE_PROG_Msk (0x01 << FLASH_CACHE_PROG_Pos)
@ -3182,14 +3147,11 @@ typedef struct {
#define FALSH_STAT_FIFO_FULL_Pos 4 #define FALSH_STAT_FIFO_FULL_Pos 4
#define FLASH_STAT_FIFO_FULL_Msk (0x01 << FALSH_STAT_FIFO_FULL_Pos) #define FLASH_STAT_FIFO_FULL_Msk (0x01 << FALSH_STAT_FIFO_FULL_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CR; __IO uint32_t CR;
} SRAMC_TypeDef; } SRAMC_TypeDef;
#define SRAMC_CR_RWTIME_Pos 0 //读写操作持续多少个时钟周期。0表示1个时钟周期。最小设置为4 #define SRAMC_CR_RWTIME_Pos 0 //读写操作持续多少个时钟周期。0表示1个时钟周期。最小设置为4
#define SRAMC_CR_RWTIME_Msk (0x0F << SRAMC_CR_RWTIME_Pos) #define SRAMC_CR_RWTIME_Msk (0x0F << SRAMC_CR_RWTIME_Pos)
#define SRAMC_CR_BYTEIF_Pos 4 //外部SRAM数据宽度0 16位 1 8位 #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_Pos 5 //1 ADDR[23:22]为地址线 0 ADDR[23]为高字节使能ADDR[22]为低字节使能
#define SRAMC_CR_HBLBDIS_Msk (0x01 << SRAMC_CR_HBLBDIS_Pos) #define SRAMC_CR_HBLBDIS_Msk (0x01 << SRAMC_CR_HBLBDIS_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CR0; __IO uint32_t CR0;
__IO uint32_t CR1; __IO uint32_t CR1;
@ -3213,7 +3174,6 @@ typedef struct {
__IO uint32_t REFDONE; //[0] Frefresh Done上电初始化完成 __IO uint32_t REFDONE; //[0] Frefresh Done上电初始化完成
} SDRAMC_TypeDef; } SDRAMC_TypeDef;
#define SDRAMC_CR0_BURSTLEN_Pos 0 //必须取2表示Burst Length为4 #define SDRAMC_CR0_BURSTLEN_Pos 0 //必须取2表示Burst Length为4
#define SDRAMC_CR0_BURSTLEN_Msk (0x07 << SDRAMC_CR0_BURSTLEN_Pos) #define SDRAMC_CR0_BURSTLEN_Msk (0x07 << SDRAMC_CR0_BURSTLEN_Pos)
#define SDRAMC_CR0_CASDELAY_Pos 4 //CAS Latency 2 2 3 3 #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_Pos 2
#define SDRAMC_LATCH_WAITST_Msk (0x01 << SDRAMC_LATCH_WAITST_Pos) #define SDRAMC_LATCH_WAITST_Msk (0x01 << SDRAMC_LATCH_WAITST_Pos)
typedef struct
{
typedef struct {
__IO uint32_t IE; __IO uint32_t IE;
__IO uint32_t IF; //写1清零 __IO uint32_t IF; //写1清零
@ -3271,7 +3229,6 @@ typedef struct {
__IO uint32_t CMD; __IO uint32_t CMD;
} NORFLC_TypeDef; } NORFLC_TypeDef;
#define NORFLC_IE_FINISH_Pos 0 #define NORFLC_IE_FINISH_Pos 0
#define NORFLC_IE_FINISH_Msk (0x01 << NORFLC_IE_FINISH_Pos) #define NORFLC_IE_FINISH_Msk (0x01 << NORFLC_IE_FINISH_Pos)
#define NORFLC_IE_TIMEOUT_Pos 1 #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_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) #define NORFLC_CMD_CMD_Msk (0x07 << NORFLC_CMD_CMD_Pos)
typedef struct
{
typedef struct {
__IO uint32_t CR; __IO uint32_t CR;
__O uint32_t DATAIN; __O uint32_t DATAIN;
@ -3312,7 +3267,6 @@ typedef struct {
__I uint32_t RESULT; __I uint32_t RESULT;
} CRC_TypeDef; } CRC_TypeDef;
#define CRC_CR_EN_Pos 0 #define CRC_CR_EN_Pos 0
#define CRC_CR_EN_Msk (0x01 << CRC_CR_EN_Pos) #define CRC_CR_EN_Msk (0x01 << CRC_CR_EN_Pos)
#define CRC_CR_OREV_Pos 1 //输出结果是否翻转 #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_Pos 4 //输入数据有效位数 0 32位 1 16位 2 8位
#define CRC_CR_IBITS_Msk (0x03 << CRC_CR_IBITS_Pos) #define CRC_CR_IBITS_Msk (0x03 << CRC_CR_IBITS_Pos)
typedef struct
{
typedef struct {
__IO uint32_t MINSEC; //分秒计数 __IO uint32_t MINSEC; //分秒计数
__IO uint32_t DATHUR; //日时计数 __IO uint32_t DATHUR; //日时计数
@ -3355,7 +3307,6 @@ typedef struct {
__IO uint32_t TRIMM; //时钟微调整 __IO uint32_t TRIMM; //时钟微调整
} RTC_TypeDef; } RTC_TypeDef;
#define RTC_LOAD_TIME_Pos 0 #define RTC_LOAD_TIME_Pos 0
#define RTC_LOAD_TIME_Msk (0x01 << RTC_LOAD_TIME_Pos) #define RTC_LOAD_TIME_Msk (0x01 << RTC_LOAD_TIME_Pos)
#define RTC_LOAD_ALARM_Pos 1 #define RTC_LOAD_ALARM_Pos 1
@ -3425,16 +3376,14 @@ typedef struct {
#define RTC_TRIM_DEC_Pos 8 #define RTC_TRIM_DEC_Pos 8
#define RTC_TRIM_DEC_Msk (0x01 << RTC_TRIM_DEC_Pos) #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以此类推 //cycles=0时不进行微调整cycles=1则n为2cycles=7则n为8以此类推
#define RTC_TRIMM_CYCLE_Msk (0x07 << RTC_TRIMM_CYCLE_Pos) #define RTC_TRIMM_CYCLE_Msk (0x07 << RTC_TRIMM_CYCLE_Pos)
#define RTC_TRIMM_INC_Pos 3 #define RTC_TRIMM_INC_Pos 3
#define RTC_TRIMM_INC_Msk (0x01 << RTC_TRIMM_INC_Pos) #define RTC_TRIMM_INC_Msk (0x01 << RTC_TRIMM_INC_Pos)
typedef struct
{
typedef struct {
__IO uint32_t LOAD; //喂狗使计数器装载LOAD值 __IO uint32_t LOAD; //喂狗使计数器装载LOAD值
__I uint32_t VALUE; __I uint32_t VALUE;
@ -3446,13 +3395,11 @@ typedef struct {
__IO uint32_t FEED; //写0x55喂狗 __IO uint32_t FEED; //写0x55喂狗
} WDT_TypeDef; } WDT_TypeDef;
#define WDT_CR_EN_Pos 0 #define WDT_CR_EN_Pos 0
#define WDT_CR_EN_Msk (0x01 << WDT_CR_EN_Pos) #define WDT_CR_EN_Msk (0x01 << WDT_CR_EN_Pos)
#define WDT_CR_RSTEN_Pos 1 #define WDT_CR_RSTEN_Pos 1
#define WDT_CR_RSTEN_Msk (0x01 << WDT_CR_RSTEN_Pos) #define WDT_CR_RSTEN_Msk (0x01 << WDT_CR_RSTEN_Pos)
/******************************************************************************/ /******************************************************************************/
/* Peripheral memory map */ /* Peripheral memory map */
/******************************************************************************/ /******************************************************************************/
@ -3529,77 +3476,73 @@ typedef struct {
#define CAN_BASE (APB_BASE + 0x20000) #define CAN_BASE (APB_BASE + 0x20000)
/******************************************************************************/ /******************************************************************************/
/* Peripheral declaration */ /* Peripheral declaration */
/******************************************************************************/ /******************************************************************************/
#define SYS ((SYS_TypeDef *) SYS_BASE) #define SYS ((SYS_TypeDef *)SYS_BASE)
#define PORT ((PORT_TypeDef *) PORT_BASE) #define PORT ((PORT_TypeDef *)PORT_BASE)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOM ((GPIO_TypeDef *) GPIOM_BASE) #define GPIOM ((GPIO_TypeDef *)GPIOM_BASE)
#define GPION ((GPIO_TypeDef *) GPION_BASE) #define GPION ((GPIO_TypeDef *)GPION_BASE)
#define GPIOP ((GPIO_TypeDef *) GPIOP_BASE) #define GPIOP ((GPIO_TypeDef *)GPIOP_BASE)
#define TIMR0 ((TIMR_TypeDef *) TIMR0_BASE) #define TIMR0 ((TIMR_TypeDef *)TIMR0_BASE)
#define TIMR1 ((TIMR_TypeDef *) TIMR1_BASE) #define TIMR1 ((TIMR_TypeDef *)TIMR1_BASE)
#define TIMR2 ((TIMR_TypeDef *) TIMR2_BASE) #define TIMR2 ((TIMR_TypeDef *)TIMR2_BASE)
#define TIMR3 ((TIMR_TypeDef *) TIMR3_BASE) #define TIMR3 ((TIMR_TypeDef *)TIMR3_BASE)
#define TIMR4 ((TIMR_TypeDef *) TIMR4_BASE) #define TIMR4 ((TIMR_TypeDef *)TIMR4_BASE)
#define TIMR5 ((TIMR_TypeDef *) TIMR5_BASE) #define TIMR5 ((TIMR_TypeDef *)TIMR5_BASE)
#define TIMRG ((TIMRG_TypeDef*) TIMRG_BASE) #define TIMRG ((TIMRG_TypeDef *)TIMRG_BASE)
#define UART0 ((UART_TypeDef *) UART0_BASE) #define UART0 ((UART_TypeDef *)UART0_BASE)
#define UART1 ((UART_TypeDef *) UART1_BASE) #define UART1 ((UART_TypeDef *)UART1_BASE)
#define UART2 ((UART_TypeDef *) UART2_BASE) #define UART2 ((UART_TypeDef *)UART2_BASE)
#define UART3 ((UART_TypeDef *) UART3_BASE) #define UART3 ((UART_TypeDef *)UART3_BASE)
#define SPI0 ((SPI_TypeDef *) SPI0_BASE) #define SPI0 ((SPI_TypeDef *)SPI0_BASE)
#define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI1 ((SPI_TypeDef *)SPI1_BASE)
#define I2C0 ((I2C_TypeDef *) I2C0_BASE) #define I2C0 ((I2C_TypeDef *)I2C0_BASE)
#define I2C1 ((I2C_TypeDef *) I2C1_BASE) #define I2C1 ((I2C_TypeDef *)I2C1_BASE)
#define ADC0 ((ADC_TypeDef *) ADC0_BASE) #define ADC0 ((ADC_TypeDef *)ADC0_BASE)
#define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC1 ((ADC_TypeDef *)ADC1_BASE)
#define PWM0 ((PWM_TypeDef *) PWM0_BASE) #define PWM0 ((PWM_TypeDef *)PWM0_BASE)
#define PWM1 ((PWM_TypeDef *) PWM1_BASE) #define PWM1 ((PWM_TypeDef *)PWM1_BASE)
#define PWM2 ((PWM_TypeDef *) PWM2_BASE) #define PWM2 ((PWM_TypeDef *)PWM2_BASE)
#define PWM3 ((PWM_TypeDef *) PWM3_BASE) #define PWM3 ((PWM_TypeDef *)PWM3_BASE)
#define PWM4 ((PWM_TypeDef *) PWM4_BASE) #define PWM4 ((PWM_TypeDef *)PWM4_BASE)
#define PWM5 ((PWM_TypeDef *) PWM5_BASE) #define PWM5 ((PWM_TypeDef *)PWM5_BASE)
#define PWMG ((PWMG_TypeDef *) PWMG_BASE) #define PWMG ((PWMG_TypeDef *)PWMG_BASE)
#define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SDIO ((SDIO_TypeDef *)SDIO_BASE)
#define DMA ((DMA_TypeDef *) DMA_BASE) #define DMA ((DMA_TypeDef *)DMA_BASE)
#define CAN ((CAN_TypeDef *) CAN_BASE) #define CAN ((CAN_TypeDef *)CAN_BASE)
#define LCD ((LCD_TypeDef *) LCD_BASE) #define LCD ((LCD_TypeDef *)LCD_BASE)
#define CRC ((CRC_TypeDef *) CRC_BASE) #define CRC ((CRC_TypeDef *)CRC_BASE)
#define RTC ((RTC_TypeDef *) RTC_BASE) #define RTC ((RTC_TypeDef *)RTC_BASE)
#define WDT ((WDT_TypeDef *) WDT_BASE) #define WDT ((WDT_TypeDef *)WDT_BASE)
#define FLASH ((FLASH_Typedef*) FLASH_BASE) #define FLASH ((FLASH_Typedef *)FLASH_BASE)
#define SRAMC ((SRAMC_TypeDef*) SRAMC_BASE) #define SRAMC ((SRAMC_TypeDef *)SRAMC_BASE)
#define NORFLC ((NORFLC_TypeDef*) NORFLC_BASE) #define NORFLC ((NORFLC_TypeDef *)NORFLC_BASE)
#define SDRAMC ((SDRAMC_TypeDef*) SDRAMC_BASE) #define SDRAMC ((SDRAMC_TypeDef *)SDRAMC_BASE)
typedef void (* Func_void_void) (void);
typedef void (*Func_void_void)(void);
#include "SWM320_port.h" #include "SWM320_port.h"
#include "SWM320_gpio.h" #include "SWM320_gpio.h"
@ -3622,5 +3565,4 @@ typedef void (* Func_void_void) (void);
#include "SWM320_rtc.h" #include "SWM320_rtc.h"
#include "SWM320_wdt.h" #include "SWM320_wdt.h"
#endif //__SWM320_H__ #endif //__SWM320_H__

View File

@ -21,7 +21,6 @@
#include <stdint.h> #include <stdint.h>
#include "SWM320.h" #include "SWM320.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* *
*****************************************************************************************************************************************/ *****************************************************************************************************************************************/
@ -33,18 +32,15 @@
#define SYS_CLK SYS_CLK_PLL #define SYS_CLK SYS_CLK_PLL
#define SYS_CLK_DIV_1 0 #define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1 #define SYS_CLK_DIV_2 1
#define SYS_CLK_DIV SYS_CLK_DIV_1 #define SYS_CLK_DIV SYS_CLK_DIV_1
#define __HSI (20000000UL) //高速内部时钟 #define __HSI (20000000UL) //高速内部时钟
#define __LSI ( 32000UL) //低速内部时钟 #define __LSI (32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟 #define __HSE (20000000UL) //高速外部时钟
/********************************** PLL 设定 ********************************************** /********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV * VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV * PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
@ -55,19 +51,15 @@
#define PLL_FB_DIV 60 #define PLL_FB_DIV 60
#define PLL_OUT_DIV8 0 #define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1 #define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2 #define PLL_OUT_DIV2 2
#define PLL_OUT_DIV PLL_OUT_DIV8 #define PLL_OUT_DIV PLL_OUT_DIV8
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock) uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second 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 * : This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
@ -77,17 +69,17 @@ uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SystemCoreClockUpdate(void) void SystemCoreClockUpdate(void)
{ {
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK if (SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK
{ {
if(SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL if (SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL
{ {
SystemCoreClock = __HSE; SystemCoreClock = __HSE;
} }
else //HFCK <= HRC else //HFCK <= HRC
{ {
if(SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz if (SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz
{ {
SystemCoreClock = __HSI*2; SystemCoreClock = __HSI * 2;
} }
else //HRC = 20MHz else //HRC = 20MHz
{ {
@ -97,9 +89,9 @@ void SystemCoreClockUpdate(void)
} }
else //SYS_CLK <= LFCK else //SYS_CLK <= LFCK
{ {
if(SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL if (SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL
{ {
if(SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC if (SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC
{ {
SystemCoreClock = __HSI; SystemCoreClock = __HSI;
} }
@ -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; CyclesPerUs = SystemCoreClock / 1000000;
} }
@ -134,7 +127,7 @@ void SystemInit(void)
Flash_Param_at_xMHz(120); Flash_Param_at_xMHz(120);
switch(SYS_CLK) switch (SYS_CLK)
{ {
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器 case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
switchCLK_20MHz(); switchCLK_20MHz();
@ -162,15 +155,15 @@ void SystemInit(void)
SystemCoreClockUpdate(); SystemCoreClockUpdate();
if(SystemCoreClock > 80000000) if (SystemCoreClock > 80000000)
{ {
Flash_Param_at_xMHz(120); Flash_Param_at_xMHz(120);
} }
else if(SystemCoreClock > 40000000) else if (SystemCoreClock > 40000000)
{ {
Flash_Param_at_xMHz(80); Flash_Param_at_xMHz(80);
} }
else if(SystemCoreClock > 30000000) else if (SystemCoreClock > 30000000)
{ {
Flash_Param_at_xMHz(40); Flash_Param_at_xMHz(40);
} }
@ -187,7 +180,8 @@ void switchCLK_20MHz(void)
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) | SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz (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 &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK 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) | SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz (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 &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK 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); 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_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
@ -226,7 +222,8 @@ void switchCLK_XTAL(void)
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos); 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_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
@ -239,7 +236,8 @@ void switchCLK_PLL(void)
PLLInit(); PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos); 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 |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
@ -249,20 +247,22 @@ void PLLInit(void)
{ {
uint32_t i; uint32_t i;
if(SYS_PLL_SRC == SYS_CLK_20MHz) if (SYS_PLL_SRC == SYS_CLK_20MHz)
{ {
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) | SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz (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 SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
} }
else if(SYS_PLL_SRC == SYS_CLK_XTAL) else if (SYS_PLL_SRC == SYS_CLK_XTAL)
{ {
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos); 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 SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
} }
@ -272,9 +272,10 @@ void PLLInit(void)
SYS_PLLDIV_OUTDIV_Msk); SYS_PLLDIV_OUTDIV_Msk);
SYS->PLLDIV |= (PLL_IN_DIV << SYS_PLLDIV_INDIV_Pos) | SYS->PLLDIV |= (PLL_IN_DIV << SYS_PLLDIV_INDIV_Pos) |
(PLL_FB_DIV << SYS_PLLDIV_FBDIV_Pos) | (PLL_FB_DIV << SYS_PLLDIV_FBDIV_Pos) |
(PLL_OUT_DIV<< SYS_PLLDIV_OUTDIV_Pos); (PLL_OUT_DIV << SYS_PLLDIV_OUTDIV_Pos);
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos); SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
while(SYS->PLLLOCK == 0); //等待PLL锁定 while (SYS->PLLLOCK == 0)
; //等待PLL锁定
} }

View File

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

View File

@ -19,7 +19,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_adc.h" #include "SWM320_adc.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : ADC_Init() * : ADC_Init()
* : ADC模数转换器初始化 * : ADC模数转换器初始化
@ -28,9 +27,9 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct) void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
{ {
switch((uint32_t)ADCx) switch ((uint32_t)ADCx)
{ {
case ((uint32_t)ADC0): case ((uint32_t)ADC0):
SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos);
@ -43,7 +42,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
ADC_Close(ADCx); //一些关键寄存器只能在ADC关闭时设置 ADC_Close(ADCx); //一些关键寄存器只能在ADC关闭时设置
if(initStruct->clk_src == ADC_CLKSRC_HRC) if (initStruct->clk_src == ADC_CLKSRC_HRC)
{ {
ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos); ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos);
@ -52,7 +51,8 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
} }
else else
{ {
if(SYS->PLLCR & SYS_PLLCR_OFF_Msk) PLLInit(); if (SYS->PLLCR & SYS_PLLCR_OFF_Msk)
PLLInit();
ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos); ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
@ -72,7 +72,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
(6 << ADC_CTRL2_PGAGAIN_Pos) | (6 << ADC_CTRL2_PGAGAIN_Pos) |
((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos); ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
ADCx->CTRL &= ~( 0xFF << ADC_CTRL_CH0_Pos); ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos); ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk); ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
@ -126,10 +126,10 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
(((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) | (((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
(((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos); (((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
switch((uint32_t)ADCx) switch ((uint32_t)ADCx)
{ {
case ((uint32_t)ADC0): case ((uint32_t)ADC0):
if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn) if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
{ {
NVIC_EnableIRQ(ADC0_IRQn); NVIC_EnableIRQ(ADC0_IRQn);
} }
@ -140,7 +140,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
break; break;
case ((uint32_t)ADC1): case ((uint32_t)ADC1):
if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn) if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
{ {
NVIC_EnableIRQ(ADC1_IRQn); NVIC_EnableIRQ(ADC1_IRQn);
} }
@ -159,7 +159,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_Open(ADC_TypeDef * ADCx) void ADC_Open(ADC_TypeDef *ADCx)
{ {
ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos); ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
} }
@ -171,7 +171,7 @@ void ADC_Open(ADC_TypeDef * ADCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_Close(ADC_TypeDef * ADCx) void ADC_Close(ADC_TypeDef *ADCx)
{ {
ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos); ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
} }
@ -183,7 +183,7 @@ void ADC_Close(ADC_TypeDef * ADCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_Start(ADC_TypeDef * ADCx) void ADC_Start(ADC_TypeDef *ADCx)
{ {
ADCx->START |= (0x01 << ADC_START_GO_Pos); ADCx->START |= (0x01 << ADC_START_GO_Pos);
} }
@ -195,7 +195,7 @@ void ADC_Start(ADC_TypeDef * ADCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_Stop(ADC_TypeDef * ADCx) void ADC_Stop(ADC_TypeDef *ADCx)
{ {
ADCx->START &= ~(0x01 << ADC_START_GO_Pos); ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
} }
@ -204,16 +204,32 @@ static uint32_t chn2idx(uint32_t chn)
{ {
uint32_t idx = 0; uint32_t idx = 0;
switch(chn) switch (chn)
{ {
case 0x01: idx = 0; break; case 0x01:
case 0x02: idx = 1; break; idx = 0;
case 0x04: idx = 2; break; break;
case 0x08: idx = 3; break; case 0x02:
case 0x10: idx = 4; break; idx = 1;
case 0x20: idx = 5; break; break;
case 0x40: idx = 6; break; case 0x04:
case 0x80: idx = 7; break; 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; return idx;
@ -227,7 +243,7 @@ static uint32_t chn2idx(uint32_t chn)
* : uint32_t * : uint32_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t dat = 0; uint32_t dat = 0;
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
@ -247,7 +263,7 @@ uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
@ -262,13 +278,12 @@ uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns) void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
{ {
ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos); ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos); ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : ADC_IntEOCEn() * : ADC_IntEOCEn()
* : 使 * : 使
@ -277,11 +292,11 @@ void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE |= (0x01 << (idx*4)); ADCx->IE |= (0x01 << (idx * 4));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -292,11 +307,11 @@ void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE &= ~(0x01 << (idx*4)); ADCx->IE &= ~(0x01 << (idx * 4));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -307,11 +322,11 @@ void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IF = (0x01 << (idx*4)); ADCx->IF = (0x01 << (idx * 4));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -322,11 +337,11 @@ void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
return (ADCx->IF & (0x01 << (idx*4))) ? 1 : 0; return (ADCx->IF & (0x01 << (idx * 4))) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -337,11 +352,11 @@ uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE |= (0x01 << (idx*4+1)); ADCx->IE |= (0x01 << (idx * 4 + 1));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -352,11 +367,11 @@ void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE &= ~(0x01 << (idx*4+1)); ADCx->IE &= ~(0x01 << (idx * 4 + 1));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -367,11 +382,11 @@ void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IF = (0x01 << (idx*4+1)); ADCx->IF = (0x01 << (idx * 4 + 1));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -382,11 +397,11 @@ void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
return (ADCx->IF & (0x01 << (idx*4+1))) ? 1 : 0; return (ADCx->IF & (0x01 << (idx * 4 + 1))) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -397,11 +412,11 @@ uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE |= (0x01 << (idx*4+2)); ADCx->IE |= (0x01 << (idx * 4 + 2));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -412,11 +427,11 @@ void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE &= ~(0x01 << (idx*4+2)); ADCx->IE &= ~(0x01 << (idx * 4 + 2));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -427,11 +442,11 @@ void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IF = (0x01 << (idx*4+2)); ADCx->IF = (0x01 << (idx * 4 + 2));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -442,11 +457,11 @@ void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
return (ADCx->IF & (0x01 << (idx*4+2))) ? 1 : 0; return (ADCx->IF & (0x01 << (idx * 4 + 2))) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -457,11 +472,11 @@ uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE |= (0x01 << (idx*4+3)); ADCx->IE |= (0x01 << (idx * 4 + 3));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -472,11 +487,11 @@ void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IE &= ~(0x01 << (idx*4+3)); ADCx->IE &= ~(0x01 << (idx * 4 + 3));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -487,11 +502,11 @@ void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn) void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
ADCx->IF = (0x01 << (idx*4+3)); ADCx->IF = (0x01 << (idx * 4 + 3));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -502,9 +517,9 @@ void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn) uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
{ {
uint32_t idx = chn2idx(chn); uint32_t idx = chn2idx(chn);
return (ADCx->IF & (0x01 << (idx*4+3))) ? 1 : 0; return (ADCx->IF & (0x01 << (idx * 4 + 3))) ? 1 : 0;
} }

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_ADC_H__ #ifndef __SWM320_ADC_H__
#define __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_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 clk_div; //ADC转换时钟分频取值1--31
uint8_t pga_ref; //PGA基准PGA_REF_INTERNAL、PGA_REF_EXTERNAL uint8_t pga_ref; //PGA基准PGA_REF_INTERNAL、PGA_REF_EXTERNAL
@ -42,38 +43,35 @@ typedef struct {
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生ADC_REFP和ADC_REFN可悬空 #define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生ADC_REFP和ADC_REFN可悬空
#define PGA_REF_EXTERNAL 0 //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转换
void ADC_Start(ADC_TypeDef *ADCx); //启动指定ADC开始模数转换
void ADC_Stop(ADC_TypeDef *ADCx); //关闭指定ADC停止模数转换
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct); //ADC模数转换器初始化 uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn); //从指定通道读取转换结果
void ADC_Open(ADC_TypeDef * ADCx); //ADC开启可以软件启动、或硬件触发ADC转换 uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn); //指定通道是否End Of Conversion
void ADC_Close(ADC_TypeDef * ADCx); //ADC关闭无法软件启动、或硬件触发ADC转换
void ADC_Start(ADC_TypeDef * ADCx); //启动指定ADC开始模数转换
void ADC_Stop(ADC_TypeDef * ADCx); //关闭指定ADC停止模数转换
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn); //从指定通道读取转换结果 void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns);
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End Of Conversion
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); //转换完成中断标志清除
uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断状态
void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断使能
void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断禁止
void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断标志清除
uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断状态
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断使能 void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断使能
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断禁止 void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断禁止
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断标志清除 void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断标志清除
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断状态 uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断状态
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断使能
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断禁止
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断标志清除
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断状态
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断使能
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断禁止
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断标志清除
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn);//FIFO半满中断状态
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断使能
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满中断状态
void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断使能
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__ #endif //__SWM320_ADC_H__

View File

@ -1,10 +1,10 @@
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SWM320_can.c * : SWM320_can.c
* : SWM320单片机的CAN模块驱动库 * : SWM320单片机的CAN模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1 * : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* : * :
* : V1.1.0 20171025 * : V1.1.0 20171025
* : * :
* *
* *
******************************************************************************************************************************************* *******************************************************************************************************************************************
@ -21,25 +21,24 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_can.h" #include "SWM320_can.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_Init() * : CAN_Init()
* : CAN接口初始化 * : CAN接口初始化
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* CAN_InitStructure * initStruct CAN接口相关设定值的结构体 * CAN_InitStructure * initStruct CAN接口相关设定值的结构体
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct) void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct)
{ {
switch((uint32_t)CANx) switch ((uint32_t)CANx)
{ {
case ((uint32_t)CAN): case ((uint32_t)CAN):
SYS->CLKEN |= (0x01 << SYS_CLKEN_CAN_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_CAN_Pos);
break; 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 &= ~(CAN_CR_LOM_Msk | CAN_CR_STM_Msk | CAN_CR_AFM_Msk);
CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) | CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) |
@ -60,9 +59,9 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
(initStruct->CAN_BS2 << CAN_BT1_TSEG2_Pos); (initStruct->CAN_BS2 << CAN_BT1_TSEG2_Pos);
CANx->BT0 = (initStruct->CAN_SJW << CAN_BT0_SJW_Pos) | 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); ((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->TXERR = 0;
CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) | CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) |
@ -70,10 +69,10 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
(initStruct->ArbitrLostIEn << CAN_IE_ARBLOST_Pos) | (initStruct->ArbitrLostIEn << CAN_IE_ARBLOST_Pos) |
(initStruct->ErrPassiveIEn << CAN_IE_ERRPASS_Pos); (initStruct->ErrPassiveIEn << CAN_IE_ERRPASS_Pos);
switch((uint32_t)CANx) switch ((uint32_t)CANx)
{ {
case ((uint32_t)CAN): case ((uint32_t)CAN):
if(initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn) if (initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn)
{ {
NVIC_EnableIRQ(CAN_IRQn); NVIC_EnableIRQ(CAN_IRQn);
} }
@ -86,46 +85,46 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_Open() * : CAN_Open()
* : CAN接口打开 * : CAN接口打开
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_Open(CAN_TypeDef * CANx) void CAN_Open(CAN_TypeDef *CANx)
{ {
CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式 CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_Close() * : CAN_Close()
* : CAN接口关闭 * : CAN接口关闭
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_Close(CAN_TypeDef * CANx) void CAN_Close(CAN_TypeDef *CANx)
{ {
CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据 CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_Transmit() * : CAN_Transmit()
* : CAN发送数据 * : CAN发送数据
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT * uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID * uint32_t id ID
* uint8_t data[] * uint8_t data[]
* uint32_t size * uint32_t size
* uint32_t once 使NAK * 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) void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
{ {
uint32_t i; uint32_t i;
if(format == CAN_FRAME_STD) if (format == CAN_FRAME_STD)
{ {
CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) | CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
(0 << CAN_INFO_RTR_Pos) | (0 << CAN_INFO_RTR_Pos) |
@ -134,9 +133,9 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
CANx->TXFRAME.DATA[0] = id >> 3; CANx->TXFRAME.DATA[0] = id >> 3;
CANx->TXFRAME.DATA[1] = id << 5; CANx->TXFRAME.DATA[1] = id << 5;
for(i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
CANx->TXFRAME.DATA[i+2] = data[i]; CANx->TXFRAME.DATA[i + 2] = data[i];
} }
} }
else //if(format == CAN_FRAME_EXT) else //if(format == CAN_FRAME_EXT)
@ -150,19 +149,19 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
CANx->TXFRAME.DATA[2] = id >> 5; CANx->TXFRAME.DATA[2] = id >> 5;
CANx->TXFRAME.DATA[3] = id << 3; CANx->TXFRAME.DATA[3] = id << 3;
for(i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
CANx->TXFRAME.DATA[i+4] = data[i]; CANx->TXFRAME.DATA[i + 4] = data[i];
} }
} }
if(CANx->CR & CAN_CR_STM_Msk) if (CANx->CR & CAN_CR_STM_Msk)
{ {
CANx->CMD = (1 << CAN_CMD_SRR_Pos); CANx->CMD = (1 << CAN_CMD_SRR_Pos);
} }
else else
{ {
if(once == 0) if (once == 0)
{ {
CANx->CMD = (1 << CAN_CMD_TXREQ_Pos); CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
} }
@ -174,18 +173,18 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_TransmitRequest() * : CAN_TransmitRequest()
* : CAN发送远程请求 * : CAN发送远程请求
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* uint32_t format CAN_FRAME_STD CAN_FRAME_EXT * uint32_t format CAN_FRAME_STD CAN_FRAME_EXT
* uint32_t id ID * uint32_t id ID
* uint32_t once 使NAK * uint32_t once 使NAK
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once) void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once)
{ {
if(format == CAN_FRAME_STD) if (format == CAN_FRAME_STD)
{ {
CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) | CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
(1 << CAN_INFO_RTR_Pos) | (1 << CAN_INFO_RTR_Pos) |
@ -206,7 +205,7 @@ void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint3
CANx->TXFRAME.DATA[3] = id << 3; CANx->TXFRAME.DATA[3] = id << 3;
} }
if(once == 0) if (once == 0)
{ {
CANx->CMD = (1 << CAN_CMD_TXREQ_Pos); CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
} }
@ -217,14 +216,14 @@ void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint3
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_Receive() * : CAN_Receive()
* : CAN接收数据 * : CAN接收数据
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* CAN_RXMessage *msg * CAN_RXMessage *msg
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg) void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
{ {
uint32_t i; uint32_t i;
msg->format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos; msg->format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
@ -232,22 +231,22 @@ void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos; msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos; msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
if(msg->format == CAN_FRAME_STD) if (msg->format == CAN_FRAME_STD)
{ {
msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5); msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5);
for(i = 0; i < msg->size; i++) for (i = 0; i < msg->size; i++)
{ {
msg->data[i] = CANx->RXFRAME.DATA[i+2]; msg->data[i] = CANx->RXFRAME.DATA[i + 2];
} }
} }
else //if(msg->format == CAN_FRAME_EXT) else //if(msg->format == CAN_FRAME_EXT)
{ {
msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3); msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3);
for(i = 0; i < msg->size; i++) for (i = 0; i < msg->size; i++)
{ {
msg->data[i] = CANx->RXFRAME.DATA[i+4]; msg->data[i] = CANx->RXFRAME.DATA[i + 4];
} }
} }
@ -255,96 +254,96 @@ void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_TXComplete() * : CAN_TXComplete()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0 * : uint32_t 1 0
* : Abort也会触发发送完成 * : Abort也会触发发送完成
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t CAN_TXComplete(CAN_TypeDef * CANx) uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
{ {
return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0; return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_TXSuccess() * : CAN_TXSuccess()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t CAN_TXSuccess(CAN_TypeDef * CANx) uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
{ {
return (CANx->SR & CAN_SR_TXOK_Msk) ? 1 : 0; return (CANx->SR & CAN_SR_TXOK_Msk) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_AbortTransmit() * : CAN_AbortTransmit()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_AbortTransmit(CAN_TypeDef * CANx) void CAN_AbortTransmit(CAN_TypeDef *CANx)
{ {
CANx->CMD = (1 << CAN_CMD_ABTTX_Pos); CANx->CMD = (1 << CAN_CMD_ABTTX_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_TXBufferReady() * : CAN_TXBufferReady()
* : TX Buffer是否准备好可以写入消息 * : TX Buffer是否准备好可以写入消息
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx) uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
{ {
return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0; return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_RXDataAvailable() * : CAN_RXDataAvailable()
* : RX FIFO中是否有数据可读出 * : RX FIFO中是否有数据可读出
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx) uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
{ {
return (CANx->SR & CAN_SR_RXDA_Msk) ? 1 : 0; return (CANx->SR & CAN_SR_RXDA_Msk) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_SetBaudrate() * : CAN_SetBaudrate()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* uint32_t baudrate * uint32_t baudrate
* uint32_t CAN_BS1 CAN_BS1_1tqCAN_BS1_2tq... ... CAN_BS1_16tq * 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_BS2 CAN_BS2_1tqCAN_BS2_2tq... ... CAN_BS2_8tq
* uint32_t CAN_SJW CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq * uint32_t CAN_SJW CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq
* : * :
* : CAN_Close()CAN模块 * : CAN_Close()CAN模块
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW) void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW)
{ {
CANx->BT1 = (0 << CAN_BT1_SAM_Pos) | CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
(CAN_BS1 << CAN_BT1_TSEG1_Pos) | (CAN_BS1 << CAN_BT1_TSEG1_Pos) |
(CAN_BS2 << CAN_BT1_TSEG2_Pos); (CAN_BS2 << CAN_BT1_TSEG2_Pos);
CANx->BT0 = (CAN_SJW << CAN_BT0_SJW_Pos) | CANx->BT0 = (CAN_SJW << CAN_BT0_SJW_Pos) |
((SystemCoreClock/2/baudrate/(1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos); ((SystemCoreClock / 2 / baudrate / (1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_SetFilter32b() * : CAN_SetFilter32b()
* : 132 * : 132
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* uint32_t check mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤 * uint32_t check mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* uint32_t mask * uint32_t mask
* : * :
* : CAN_Close()CAN模块 * : CAN_Close()CAN模块
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask) void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask)
{ {
CANx->CR &= ~CAN_CR_AFM_Msk; CANx->CR &= ~CAN_CR_AFM_Msk;
CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos); CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
@ -361,17 +360,17 @@ void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_SetFilter16b() * : CAN_SetFilter16b()
* : 216 * : 216
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* uint16_t check1 mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤 * uint16_t check1 mask一起决定了接收到的Message是否是自己需要的check & (~mask) == ID & (~mask)Message通过过滤
* uint16_t mask1 * uint16_t mask1
* uint16_t check2 * uint16_t check2
* uint16_t mask2 * 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) void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
{ {
CANx->CR &= ~CAN_CR_AFM_Msk; CANx->CR &= ~CAN_CR_AFM_Msk;
CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos); CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
@ -388,217 +387,217 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint1
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTRXNotEmptyEn() * : CAN_INTRXNotEmptyEn()
* : RX FIFO中有数据时使 * : RX FIFO中有数据时使
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx) void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_RXDA_Pos); CANx->IE |= (1 << CAN_IE_RXDA_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTRXNotEmptyDis() * : CAN_INTRXNotEmptyDis()
* : RX FIFO中有数据时 * : RX FIFO中有数据时
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx) void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_RXDA_Pos); CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTTXBufEmptyEn() * : CAN_INTTXBufEmptyEn()
* : TX Buffer空时触发中断使能 * : TX Buffer空时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx) void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_TXBR_Pos); CANx->IE |= (1 << CAN_IE_TXBR_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTTXBufEmptyDis() * : CAN_INTTXBufEmptyDis()
* : TX Buffer空时触发中断禁止 * : TX Buffer空时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx) void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_TXBR_Pos); CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTErrWarningEn() * : CAN_INTErrWarningEn()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断使能 * : TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTErrWarningEn(CAN_TypeDef * CANx) void CAN_INTErrWarningEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_ERRWARN_Pos); CANx->IE |= (1 << CAN_IE_ERRWARN_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTErrWarningDis() * : CAN_INTErrWarningDis()
* : TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止 * : TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTErrWarningDis(CAN_TypeDef * CANx) void CAN_INTErrWarningDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos); CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTRXOverflowEn() * : CAN_INTRXOverflowEn()
* : RX FIFO 使 * : RX FIFO 使
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx) void CAN_INTRXOverflowEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_RXOV_Pos); CANx->IE |= (1 << CAN_IE_RXOV_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTRXOverflowDis() * : CAN_INTRXOverflowDis()
* : RX FIFO * : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx) void CAN_INTRXOverflowDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_RXOV_Pos); CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTRXOverflowClear() * : CAN_INTRXOverflowClear()
* : RX FIFO * : RX FIFO
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx) void CAN_INTRXOverflowClear(CAN_TypeDef *CANx)
{ {
CANx->CMD = (1 << CAN_CMD_CLROV_Pos); CANx->CMD = (1 << CAN_CMD_CLROV_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTWakeupEn() * : CAN_INTWakeupEn()
* : 使 * : 使
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTWakeupEn(CAN_TypeDef * CANx) void CAN_INTWakeupEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_WKUP_Pos); CANx->IE |= (1 << CAN_IE_WKUP_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTWakeupDis() * : CAN_INTWakeupDis()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTWakeupDis(CAN_TypeDef * CANx) void CAN_INTWakeupDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_WKUP_Pos); CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTErrPassiveEn() * : CAN_INTErrPassiveEn()
* : TXERR/RXERR计数值达到127时中断使能 * : TXERR/RXERR计数值达到127时中断使能
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx) void CAN_INTErrPassiveEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_ERRPASS_Pos); CANx->IE |= (1 << CAN_IE_ERRPASS_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTErrPassiveDis() * : CAN_INTErrPassiveDis()
* : TXERR/RXERR计数值达到127时中断禁止 * : TXERR/RXERR计数值达到127时中断禁止
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx) void CAN_INTErrPassiveDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos); CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTArbitrLostEn() * : CAN_INTArbitrLostEn()
* : 使 * : 使
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTArbitrLostEn(CAN_TypeDef * CANx) void CAN_INTArbitrLostEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_ARBLOST_Pos); CANx->IE |= (1 << CAN_IE_ARBLOST_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTArbitrLostDis() * : CAN_INTArbitrLostDis()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTArbitrLostDis(CAN_TypeDef * CANx) void CAN_INTArbitrLostDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos); CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTBusErrorEn() * : CAN_INTBusErrorEn()
* : 线使 * : 线使
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTBusErrorEn(CAN_TypeDef * CANx) void CAN_INTBusErrorEn(CAN_TypeDef *CANx)
{ {
CANx->IE |= (1 << CAN_IE_BUSERR_Pos); CANx->IE |= (1 << CAN_IE_BUSERR_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTBusErrorDis() * : CAN_INTBusErrorDis()
* : 线 * : 线
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void CAN_INTBusErrorDis(CAN_TypeDef * CANx) void CAN_INTBusErrorDis(CAN_TypeDef *CANx)
{ {
CANx->IE &= ~(1 << CAN_IE_BUSERR_Pos); CANx->IE &= ~(1 << CAN_IE_BUSERR_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CAN_INTStat() * : CAN_INTStat()
* : * :
* : CAN_TypeDef * CANx CAN接口CAN * : CAN_TypeDef * CANx CAN接口CAN
* : uint32_t * : uint32_t
* : CANx->IF读取清零ISR中只能读取一次 * : CANx->IF读取清零ISR中只能读取一次
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t CAN_INTStat(CAN_TypeDef * CANx) uint32_t CAN_INTStat(CAN_TypeDef *CANx)
{ {
return CANx->IF; return CANx->IF;
} }

View File

@ -4,23 +4,28 @@
#define CAN_FRAME_STD 0 #define CAN_FRAME_STD 0
#define CAN_FRAME_EXT 1 #define CAN_FRAME_EXT 1
typedef struct { typedef struct
{
uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST 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_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_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 uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t Baudrate; //波特率即位传输速率取值1--1000000 uint32_t Baudrate; //波特率即位传输速率取值1--1000000
uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
union { union
{
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤 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 FilterMask16b1;
uint16_t FilterMask16b2; uint16_t FilterMask16b2;
}; };
}; };
union { union
{
uint32_t FilterCheck32b; uint32_t FilterCheck32b;
struct { struct
{
uint16_t FilterCheck16b1; uint16_t FilterCheck16b1;
uint16_t FilterCheck16b2; uint16_t FilterCheck16b2;
}; };
@ -69,7 +74,8 @@ typedef struct {
#define CAN_FILTER_16b 0 //两个16位过滤器 #define CAN_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器 #define CAN_FILTER_32b 1 //一个32位过滤器
typedef struct { typedef struct
{
uint32_t id; //消息ID uint32_t id; //消息ID
uint8_t format; //帧格式CAN_FRAME_STD、CAN_FRAME_EXT uint8_t format; //帧格式CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t remote; //消息是否为远程帧 uint8_t remote; //消息是否为远程帧
@ -77,54 +83,52 @@ typedef struct {
uint8_t data[8]; //接收到的数据 uint8_t data[8]; //接收到的数据
} CAN_RXMessage; } CAN_RXMessage;
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
void CAN_Open(CAN_TypeDef *CANx);
void CAN_Close(CAN_TypeDef *CANx);
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct); void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
void CAN_Open(CAN_TypeDef * CANx); void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once);
void CAN_Close(CAN_TypeDef * CANx); void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg);
void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once); uint32_t CAN_TXComplete(CAN_TypeDef *CANx);
void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once); uint32_t CAN_TXSuccess(CAN_TypeDef *CANx);
void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg);
uint32_t CAN_TXComplete(CAN_TypeDef * CANx); void CAN_AbortTransmit(CAN_TypeDef *CANx);
uint32_t CAN_TXSuccess(CAN_TypeDef * CANx);
void CAN_AbortTransmit(CAN_TypeDef * CANx); uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx);
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx);
uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx); void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx);
void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW); 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_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask); void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2); void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx); void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx); void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx); void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx); void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
void CAN_INTErrWarningEn(CAN_TypeDef * CANx); void CAN_INTWakeupEn(CAN_TypeDef *CANx);
void CAN_INTErrWarningDis(CAN_TypeDef * CANx); void CAN_INTWakeupDis(CAN_TypeDef *CANx);
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx); void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx); void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx);
void CAN_INTWakeupEn(CAN_TypeDef * CANx); void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
void CAN_INTWakeupDis(CAN_TypeDef * CANx); void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx); void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx); void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
void CAN_INTArbitrLostEn(CAN_TypeDef * CANx); uint32_t CAN_INTStat(CAN_TypeDef *CANx);
void CAN_INTArbitrLostDis(CAN_TypeDef * CANx);
void CAN_INTBusErrorEn(CAN_TypeDef * CANx);
void CAN_INTBusErrorDis(CAN_TypeDef * CANx);
uint32_t CAN_INTStat(CAN_TypeDef * CANx);
#endif //__SWM320_CAN_H__ #endif //__SWM320_CAN_H__

View File

@ -1,10 +1,10 @@
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SWM320_crc.c * : SWM320_crc.c
* : SWM320单片机的CRC模块驱动库 * : SWM320单片机的CRC模块驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1 * : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* : * :
* : V1.1.0 20171025 * : V1.1.0 20171025
* : * :
* *
* *
******************************************************************************************************************************************* *******************************************************************************************************************************************
@ -21,21 +21,20 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_crc.h" #include "SWM320_crc.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CRC_Init() * : CRC_Init()
* : CRC * : CRC
* : CRC_TypeDef * CRCx CRC接口CRC * : CRC_TypeDef * CRCx CRC接口CRC
* uint32_t mode CRC32_IN32CRC32_IN16CRC32_IN8CRC16_IN16CRC16_IN8 * uint32_t mode CRC32_IN32CRC32_IN16CRC32_IN8CRC16_IN16CRC16_IN8
* uint32_t out_not * uint32_t out_not
* uint32_t out_rev * uint32_t out_rev
* uint32_t ini_val CRC初始值 * 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) void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
{ {
switch((uint32_t)CRCx) switch ((uint32_t)CRCx)
{ {
case ((uint32_t)CRC): case ((uint32_t)CRC):
SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);

View File

@ -1,16 +1,13 @@
#ifndef __SWM320_CRC_H__ #ifndef __SWM320_CRC_H__
#define __SWM320_CRC_H__ #define __SWM320_CRC_H__
#define CRC32_IN32 0 //CRC32算法输入数据32位 #define CRC32_IN32 0 //CRC32算法输入数据32位
#define CRC32_IN16 2 //CRC32算法输入数据16位 #define CRC32_IN16 2 //CRC32算法输入数据16位
#define CRC32_IN8 4 //CRC32算法输入数据 8位 #define CRC32_IN8 4 //CRC32算法输入数据 8位
#define CRC16_IN16 3 //CRC16算法输入数据16位 #define CRC16_IN16 3 //CRC16算法输入数据16位
#define CRC16_IN8 5 //CRC16算法输入数据 8位 #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);
void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : CRC_Write() * : CRC_Write()

View File

@ -1,10 +1,10 @@
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SWM320_dma.c * : SWM320_dma.c
* : SWM320单片机的DMA功能驱动库 * : SWM320单片机的DMA功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1 * : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* : * :
* : V1.1.0 20171025 * : V1.1.0 20171025
* : * :
* *
* *
******************************************************************************************************************************************* *******************************************************************************************************************************************
@ -22,55 +22,57 @@
#include "SWM320_dma.h" #include "SWM320_dma.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CHM_Config() * : DMA_CHM_Config()
* : DMA通道配置Flash和RAM间 * : DMA通道配置Flash和RAM间
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* uint32_t src_addr 200 * uint32_t src_addr 200
* uint32_t src_addr_incr 0 1 * uint32_t src_addr_incr 0 1
* uint32_t dst_addr 200 * uint32_t dst_addr 200
* uint32_t dst_addr_incr 0 1 * uint32_t dst_addr_incr 0 1
* uint32_t num_word 1024 * uint32_t num_word 1024
* uint32_t int_en 使1 0 * 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) 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].SRC = src_addr;
DMA->CH[chn].DST = dst_addr; DMA->CH[chn].DST = dst_addr;
DMA->CH[chn].CR = ((num_word*4-1) << DMA_CR_LEN_Pos) | DMA->CH[chn].CR = ((num_word * 4 - 1) << DMA_CR_LEN_Pos) |
(0 << DMA_CR_AUTORE_Pos); (0 << DMA_CR_AUTORE_Pos);
DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) | DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
(dst_addr_incr << DMA_AM_DSTAM_Pos) | (dst_addr_incr << DMA_AM_DSTAM_Pos) |
(0 << DMA_AM_BURST_Pos); (0 << DMA_AM_BURST_Pos);
DMA->IF = (1 << chn); //清除中断标志 DMA->IF = (1 << chn); //清除中断标志
DMA->IE |= (1 << chn); DMA->IE |= (1 << chn);
if(int_en) DMA->IM &= ~(1 << chn); if (int_en)
else DMA->IM |= (1 << chn); DMA->IM &= ~(1 << chn);
else
DMA->IM |= (1 << chn);
if(int_en) if (int_en)
{ {
NVIC_EnableIRQ(DMA_IRQn); NVIC_EnableIRQ(DMA_IRQn);
} }
else else
{ {
//不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断 //不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断
} }
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_Open() * : DMA_CH_Open()
* : DMA通道打开 * : DMA通道打开
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void DMA_CH_Open(uint32_t chn) void DMA_CH_Open(uint32_t chn)
{ {
@ -78,11 +80,11 @@ void DMA_CH_Open(uint32_t chn)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_Close() * : DMA_CH_Close()
* : DMA通道关闭 * : DMA通道关闭
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void DMA_CH_Close(uint32_t chn) void DMA_CH_Close(uint32_t chn)
{ {
@ -90,11 +92,11 @@ void DMA_CH_Close(uint32_t chn)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_INTEn() * : DMA_CH_INTEn()
* : DMA中断使能 * : DMA中断使能
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn) void DMA_CH_INTEn(uint32_t chn)
{ {
@ -102,11 +104,11 @@ void DMA_CH_INTEn(uint32_t chn)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_INTDis() * : DMA_CH_INTDis()
* : DMA中断禁止 * : DMA中断禁止
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void DMA_CH_INTDis(uint32_t chn) void DMA_CH_INTDis(uint32_t chn)
{ {
@ -114,11 +116,11 @@ void DMA_CH_INTDis(uint32_t chn)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_INTClr() * : DMA_CH_INTClr()
* : DMA中断标志清除 * : DMA中断标志清除
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void DMA_CH_INTClr(uint32_t chn) void DMA_CH_INTClr(uint32_t chn)
{ {
@ -126,11 +128,11 @@ void DMA_CH_INTClr(uint32_t chn)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : DMA_CH_INTStat() * : DMA_CH_INTStat()
* : DMA中断状态查询 * : DMA中断状态查询
* : uint32_t chn DMA_CH0DMA_CH1DMA_CH2 * : uint32_t chn DMA_CH0DMA_CH1DMA_CH2
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t DMA_CH_INTStat(uint32_t chn) uint32_t DMA_CH_INTStat(uint32_t chn)
{ {

View File

@ -1,12 +1,10 @@
#ifndef __SWM320_DMA_H__ #ifndef __SWM320_DMA_H__
#define __SWM320_DMA_H__ #define __SWM320_DMA_H__
#define DMA_CH0 0 #define DMA_CH0 0
#define DMA_CH1 1 #define DMA_CH1 1
#define DMA_CH2 2 #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_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_Open(uint32_t chn); //DMA通道打开
void DMA_CH_Close(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中断标志清除 void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询1 数据搬运完成 0 数据搬运未完成 uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询1 数据搬运完成 0 数据搬运未完成
#endif //__SWM320_DMA_H__ #endif //__SWM320_DMA_H__

View File

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

View File

@ -1,14 +1,13 @@
#ifndef __SWM320_EXTI_H__ #ifndef __SWM320_EXTI_H__
#define __SWM320_EXTI_H__ #define __SWM320_EXTI_H__
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化 void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断打开(即使能) void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能) void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
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); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
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_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断 #define EXTI_RISE_EDGE 0x01 //上升沿触发中断
@ -16,5 +15,4 @@ void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断 #define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断 #define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#endif //__SWM320_EXTI_H__ #endif //__SWM320_EXTI_H__

View File

@ -19,13 +19,11 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_flash.h" #include "SWM320_flash.h"
IAP_Cache_Reset_t IAP_Cache_Reset = (IAP_Cache_Reset_t)0x11000601; 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_Param_t IAP_Flash_Param = (IAP_Flash_Param_t)0x11000681;
IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781; IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781;
IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801; IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : FLASH_Erase() * : FLASH_Erase()
* : Flash擦除 * : Flash擦除
@ -57,7 +55,7 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
{ {
__disable_irq(); __disable_irq();
IAP_Flash_Write(addr, (uint32_t)buff, count/4); IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
IAP_Cache_Reset(); IAP_Cache_Reset();
@ -74,7 +72,7 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
void Flash_Param_at_xMHz(uint32_t x) void Flash_Param_at_xMHz(uint32_t x)
{ {
__disable_irq(); __disable_irq();
switch(x) switch (x)
{ {
case 30: case 30:
IAP_Flash_Param(0x489, 0xabf41f25); IAP_Flash_Param(0x489, 0xabf41f25);

View File

@ -1,14 +1,11 @@
#ifndef __SWM320_FLASH_H__ #ifndef __SWM320_FLASH_H__
#define __SWM320_FLASH_H__ #define __SWM320_FLASH_H__
void FLASH_Erase(uint32_t addr); void FLASH_Erase(uint32_t addr);
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count); void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
void Flash_Param_at_xMHz(uint32_t x); void Flash_Param_at_xMHz(uint32_t x);
typedef void (*IAP_Cache_Reset_t)(void); typedef void (*IAP_Cache_Reset_t)(void);
typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1); typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
typedef void (*IAP_Flash_Erase_t)(uint32_t sector); 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_Erase_t IAP_Flash_Erase;
extern IAP_Flash_Write_t IAP_Flash_Write; extern IAP_Flash_Write_t IAP_Flash_Write;
#endif //__SWM320_FLASH_H__ #endif //__SWM320_FLASH_H__

View File

@ -1,10 +1,10 @@
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SWM320_gpio.c * : SWM320_gpio.c
* : SWM320单片机的通用输入输出功能驱动库 * : SWM320单片机的通用输入输出功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1 * : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* : * :
* : V1.1.0 20171025 * : V1.1.0 20171025
* : * :
* *
* *
******************************************************************************************************************************************* *******************************************************************************************************************************************
@ -21,27 +21,26 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_gpio.h" #include "SWM320_gpio.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_Init() * : GPIO_Init()
* : * :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t dir 0 1 * uint32_t dir 0 1
* uint32_t pull_up 0 1 * uint32_t pull_up 0 1
* uint32_t pull_down 0 1 * uint32_t pull_down 0 1
* : * :
* : GPIOAGPIOCGPIOMGPIOP只有上拉GPIOBGPION只有下拉PN0PN1PN2三个引脚有上拉没下拉 * : GPIOAGPIOCGPIOMGPIOP只有上拉GPIOBGPION只有下拉PN0PN1PN2三个引脚有上拉没下拉
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down) void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
{ {
switch((uint32_t)GPIOx) switch ((uint32_t)GPIOx)
{ {
case ((uint32_t)GPIOA): case ((uint32_t)GPIOA):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos); 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) if (dir == 1)
{ {
GPIOA->DIR |= (0x01 << n); GPIOA->DIR |= (0x01 << n);
} }
@ -50,7 +49,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPIOA->DIR &= ~(0x01 << n); GPIOA->DIR &= ~(0x01 << n);
} }
if(pull_up == 1) if (pull_up == 1)
PORT->PORTA_PULLU |= (0x01 << n); PORT->PORTA_PULLU |= (0x01 << n);
else else
PORT->PORTA_PULLU &= ~(0x01 << n); PORT->PORTA_PULLU &= ~(0x01 << n);
@ -59,8 +58,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOB): case ((uint32_t)GPIOB):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos); 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) if (dir == 1)
{ {
GPIOB->DIR |= (0x01 << n); GPIOB->DIR |= (0x01 << n);
} }
@ -69,7 +68,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPIOB->DIR &= ~(0x01 << n); GPIOB->DIR &= ~(0x01 << n);
} }
if(pull_down == 1) if (pull_down == 1)
PORT->PORTB_PULLD |= (0x01 << n); PORT->PORTB_PULLD |= (0x01 << n);
else else
PORT->PORTB_PULLD &= ~(0x01 << n); PORT->PORTB_PULLD &= ~(0x01 << n);
@ -78,8 +77,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOC): case ((uint32_t)GPIOC):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos); 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) if (dir == 1)
{ {
GPIOC->DIR |= (0x01 << n); GPIOC->DIR |= (0x01 << n);
} }
@ -88,7 +87,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPIOC->DIR &= ~(0x01 << n); GPIOC->DIR &= ~(0x01 << n);
} }
if(pull_up == 1) if (pull_up == 1)
PORT->PORTC_PULLU |= (0x01 << n); PORT->PORTC_PULLU |= (0x01 << n);
else else
PORT->PORTC_PULLU &= ~(0x01 << n); PORT->PORTC_PULLU &= ~(0x01 << n);
@ -97,8 +96,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOM): case ((uint32_t)GPIOM):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos); 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) if (dir == 1)
{ {
GPIOM->DIR |= (0x01 << n); GPIOM->DIR |= (0x01 << n);
} }
@ -107,7 +106,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPIOM->DIR &= ~(0x01 << n); GPIOM->DIR &= ~(0x01 << n);
} }
if(pull_up == 1) if (pull_up == 1)
PORT->PORTM_PULLU |= (0x01 << n); PORT->PORTM_PULLU |= (0x01 << n);
else else
PORT->PORTM_PULLU &= ~(0x01 << n); PORT->PORTM_PULLU &= ~(0x01 << n);
@ -116,8 +115,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPION): case ((uint32_t)GPION):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos); 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) if (dir == 1)
{ {
GPION->DIR |= (0x01 << n); GPION->DIR |= (0x01 << n);
} }
@ -126,7 +125,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPION->DIR &= ~(0x01 << n); GPION->DIR &= ~(0x01 << n);
} }
if(pull_down == 1) if (pull_down == 1)
PORT->PORTN_PULLD |= (0x01 << n); PORT->PORTN_PULLD |= (0x01 << n);
else else
PORT->PORTN_PULLD &= ~(0x01 << n); PORT->PORTN_PULLD &= ~(0x01 << n);
@ -135,8 +134,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOP): case ((uint32_t)GPIOP):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos); 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) if (dir == 1)
{ {
GPIOP->DIR |= (0x01 << n); GPIOP->DIR |= (0x01 << n);
} }
@ -145,7 +144,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
GPIOP->DIR &= ~(0x01 << n); GPIOP->DIR &= ~(0x01 << n);
} }
if(pull_up == 1) if (pull_up == 1)
PORT->PORTP_PULLU |= (0x01 << n); PORT->PORTP_PULLU |= (0x01 << n);
else else
PORT->PORTP_PULLU &= ~(0x01 << n); PORT->PORTP_PULLU &= ~(0x01 << n);
@ -154,67 +153,67 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_SetBit() * : GPIO_SetBit()
* : * :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
GPIOx->DATA |= (0x01 << n); GPIOx->DATA |= (0x01 << n);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_ClrBit() * : GPIO_ClrBit()
* : * :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
GPIOx->DATA &= ~(0x01 << n); GPIOx->DATA &= ~(0x01 << n);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_InvBit() * : GPIO_InvBit()
* : * :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
GPIOx->DATA ^= (0x01 << n); GPIOx->DATA ^= (0x01 << n);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_GetBit() * : GPIO_GetBit()
* : * :
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* : 0 1 * : 0 1
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n) uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
return ((GPIOx->DATA >> n) & 0x01); return ((GPIOx->DATA >> n) & 0x01);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_SetBits() * : GPIO_SetBits()
* : n开始的w位连续引脚的电平置高 * : n开始的w位连续引脚的电平置高
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w * uint32_t w
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -224,15 +223,15 @@ void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_ClrBits() * : GPIO_ClrBits()
* : n开始的w位连续引脚的电平置低 * : n开始的w位连续引脚的电平置低
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w * uint32_t w
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -242,15 +241,15 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_InvBits() * : GPIO_InvBits()
* : n开始的w位连续引脚的电平反转 * : n开始的w位连续引脚的电平反转
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w * uint32_t w
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -260,16 +259,16 @@ void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_GetBits() * : GPIO_GetBits()
* : n开始的w位连续引脚的电平状态 * : n开始的w位连续引脚的电平状态
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOMGPIONGPIOP
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN22PIN23
* uint32_t w * uint32_t w
* : n开始的w位连续引脚的电平状态 0 1 * : n开始的w位连续引脚的电平状态 0 1
* 0n的电平状态1n+1... ...w位表示引脚n+w的电平状态 * 0n的电平状态1n+1... ...w位表示引脚n+w的电平状态
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -279,54 +278,54 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicSetBit() * : GPIO_AtomicSetBit()
* : --ISR打断 * : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1; *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicClrBit() * : GPIO_AtomicClrBit()
* : --ISR打断 * : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0; *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicInvBit() * : GPIO_AtomicInvBit()
* : --ISR打断 * : --ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n) void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{ {
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)); *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4));
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicSetBits() * : GPIO_AtomicSetBits()
* : n开始的w位连续引脚的电平置高--ISR打断 * : n开始的w位连续引脚的电平置高--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w * uint32_t w
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -338,15 +337,15 @@ void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicClrBits() * : GPIO_AtomicClrBits()
* : n开始的w位连续引脚的电平置低--ISR打断 * : n开始的w位连续引脚的电平置低--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w * uint32_t w
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;
@ -358,15 +357,15 @@ void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : GPIO_AtomicInvBits() * : GPIO_AtomicInvBits()
* : n开始的w位连续引脚的电平反转--ISR打断 * : n开始的w位连续引脚的电平反转--ISR打断
* : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD * : GPIO_TypeDef * GPIOx GPIO端口GPIOAGPIOBGPIOCGPIOD
* uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15 * uint32_t n GPIO引脚PIN0PIN1PIN2... ... PIN14PIN15
* uint32_t w * uint32_t w
* : * :
* : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作 * : GPIOx的16个引脚中ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w) void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{ {
uint32_t bits; uint32_t bits;

View File

@ -1,24 +1,22 @@
#ifndef __SWM320_GPIO_H__ #ifndef __SWM320_GPIO_H__
#define __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_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); //将参数指定的引脚电平置高
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置低
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置高 void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平反转
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置低 uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平反转 void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n); //读取参数指定的引脚的电平状态 void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高 void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低 uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n);
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n);
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n);
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);
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n);
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n);
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n);
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__ #endif //__SWM320_GPIO_H__

View File

@ -1,10 +1,10 @@
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SWM320_i2c.c * : SWM320_i2c.c
* : SWM320单片机的I2C串行接口功能驱动库 * : SWM320单片机的I2C串行接口功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1 * : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* : * :
* : V1.1.0 20171025 * : V1.1.0 20171025
* : * :
* *
* *
******************************************************************************************************************************************* *******************************************************************************************************************************************
@ -22,16 +22,16 @@
#include "SWM320_i2c.h" #include "SWM320_i2c.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Init() * : I2C_Init()
* : I2C初始化 * : I2C初始化
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* I2C_InitStructure * initStruct I2C相关设定值的结构体 * I2C_InitStructure * initStruct I2C相关设定值的结构体
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct) void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
{ {
switch((uint32_t)I2Cx) switch ((uint32_t)I2Cx)
{ {
case ((uint32_t)I2C0): case ((uint32_t)I2C0):
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
@ -42,20 +42,20 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
break; break;
} }
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置 I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
if(initStruct->Master == 1) if (initStruct->Master == 1)
{ {
I2Cx->CLKDIV = SystemCoreClock/5/initStruct->MstClk; 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 &= ~I2C_CTRL_MSTIE_Msk;
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos); I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
switch((uint32_t)I2Cx) switch ((uint32_t)I2Cx)
{ {
case ((uint32_t)I2C0): case ((uint32_t)I2C0):
if(initStruct->MstIEn) if (initStruct->MstIEn)
{ {
NVIC_EnableIRQ(I2C0_IRQn); NVIC_EnableIRQ(I2C0_IRQn);
} }
@ -66,7 +66,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
break; break;
case ((uint32_t)I2C1): case ((uint32_t)I2C1):
if(initStruct->MstIEn) if (initStruct->MstIEn)
{ {
NVIC_EnableIRQ(I2C1_IRQn); NVIC_EnableIRQ(I2C1_IRQn);
} }
@ -86,7 +86,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) | (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
(initStruct->SlvAddr << I2C_SLVCR_ADDR_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 | 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); I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) | I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
@ -96,10 +96,10 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) | ((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos); ((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
switch((uint32_t)I2Cx) switch ((uint32_t)I2Cx)
{ {
case ((uint32_t)I2C0): case ((uint32_t)I2C0):
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn | if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn) initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
{ {
NVIC_EnableIRQ(I2C0_IRQn); NVIC_EnableIRQ(I2C0_IRQn);
@ -111,7 +111,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
break; break;
case ((uint32_t)I2C1): case ((uint32_t)I2C1):
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn | if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn) initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
{ {
NVIC_EnableIRQ(I2C1_IRQn); NVIC_EnableIRQ(I2C1_IRQn);
@ -126,90 +126,94 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Open() * : I2C_Open()
* : I2C打开 * : I2C打开
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void I2C_Open(I2C_TypeDef * I2Cx) void I2C_Open(I2C_TypeDef *I2Cx)
{ {
I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos); I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Close() * : I2C_Close()
* : I2C关闭 * : I2C关闭
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void I2C_Close(I2C_TypeDef * I2Cx) void I2C_Close(I2C_TypeDef *I2Cx)
{ {
I2Cx->CTRL &= ~I2C_CTRL_EN_Msk; I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Start() * : I2C_Start()
* : * :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t addr * uint8_t addr
* : uint8_t 1 ACK 0 NACK * : uint8_t 1 ACK 0 NACK
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint8_t I2C_Start(I2C_TypeDef * I2Cx, uint8_t addr) uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr)
{ {
I2Cx->MSTDAT = addr; I2Cx->MSTDAT = addr;
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) | I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
(1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址 (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; return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Stop() * : I2C_Stop()
* : * :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void I2C_Stop(I2C_TypeDef * I2Cx) void I2C_Stop(I2C_TypeDef *I2Cx)
{ {
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos); 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_Write()
* : * :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t data * uint8_t data
* : uint8_t 1 ACK 0 NACK * : uint8_t 1 ACK 0 NACK
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint8_t I2C_Write(I2C_TypeDef * I2Cx, uint8_t data) uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data)
{ {
I2Cx->MSTDAT = data; I2Cx->MSTDAT = data;
I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos); 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; return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : I2C_Read() * : I2C_Read()
* : * :
* : I2C_TypeDef * I2Cx I2CI2C0I2C1 * : I2C_TypeDef * I2Cx I2CI2C0I2C1
* uint8_t ack 1 ACK 0 NACK * uint8_t ack 1 ACK 0 NACK
* : uint8_t * : uint8_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint8_t I2C_Read(I2C_TypeDef * I2Cx, uint8_t ack) uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack)
{ {
I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) | I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
((ack ? 0 : 1) << I2C_MSTCMD_ACK_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; return I2Cx->MSTDAT;
} }

View File

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

View File

@ -31,9 +31,9 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct) void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
{ {
switch((uint32_t)LCDx) switch ((uint32_t)LCDx)
{ {
case ((uint32_t)LCD): case ((uint32_t)LCD):
SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
@ -54,13 +54,15 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
LCDx->IE = 1; LCDx->IE = 1;
LCDx->IF = 1; //清除标志 LCDx->IF = 1; //清除标志
if(initStruct->IntEOTEn) LCD_INTEn(LCDx); if (initStruct->IntEOTEn)
else LCD_INTDis(LCDx); LCD_INTEn(LCDx);
else
LCD_INTDis(LCDx);
switch((uint32_t)LCDx) switch ((uint32_t)LCDx)
{ {
case ((uint32_t)LCD): case ((uint32_t)LCD):
if(initStruct->IntEOTEn) if (initStruct->IntEOTEn)
{ {
NVIC_EnableIRQ(LCD_IRQn); NVIC_EnableIRQ(LCD_IRQn);
} }
@ -79,7 +81,7 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void LCD_Start(LCD_TypeDef * LCDx) void LCD_Start(LCD_TypeDef *LCDx)
{ {
LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos); LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
} }
@ -91,7 +93,7 @@ void LCD_Start(LCD_TypeDef * LCDx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t LCD_IsBusy(LCD_TypeDef * LCDx) uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
{ {
return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0; return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
} }
@ -103,7 +105,7 @@ uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void LCD_INTEn(LCD_TypeDef * LCDx) void LCD_INTEn(LCD_TypeDef *LCDx)
{ {
LCDx->IM = 0; LCDx->IM = 0;
} }
@ -115,7 +117,7 @@ void LCD_INTEn(LCD_TypeDef * LCDx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void LCD_INTDis(LCD_TypeDef * LCDx) void LCD_INTDis(LCD_TypeDef *LCDx)
{ {
LCDx->IM = 1; LCDx->IM = 1;
} }
@ -127,7 +129,7 @@ void LCD_INTDis(LCD_TypeDef * LCDx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void LCD_INTClr(LCD_TypeDef * LCDx) void LCD_INTClr(LCD_TypeDef *LCDx)
{ {
LCDx->IF = 1; LCDx->IF = 1;
} }
@ -139,7 +141,7 @@ void LCD_INTClr(LCD_TypeDef * LCDx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t LCD_INTStat(LCD_TypeDef * LCDx) uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
{ {
return (LCDx->IF & 0x01) ? 1 : 0; return (LCDx->IF & 0x01) ? 1 : 0;
} }

View File

@ -1,27 +1,26 @@
#ifndef __SWM320_LCD_H__ #ifndef __SWM320_LCD_H__
#define __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 { uint8_t IntEOTEn; //End of Transter传输完成中断使能
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传输完成中断使能
} LCD_InitStructure; } LCD_InitStructure;
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据 #define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
#define LCD_HSYNC_2DOTCLK 1 #define LCD_HSYNC_2DOTCLK 1
#define LCD_HSYNC_3DOTCLK 2 #define LCD_HSYNC_3DOTCLK 2
#define LCD_HSYNC_4DOTCLK 3 #define LCD_HSYNC_4DOTCLK 3
@ -59,15 +58,13 @@ typedef struct {
#define LCD_CLKDIV_62 30 #define LCD_CLKDIV_62 30
#define LCD_CLKDIV_64 31 #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);
void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct); void LCD_INTEn(LCD_TypeDef *LCDx);
void LCD_Start(LCD_TypeDef * LCDx); void LCD_INTDis(LCD_TypeDef *LCDx);
uint32_t LCD_IsBusy(LCD_TypeDef * LCDx); void LCD_INTClr(LCD_TypeDef *LCDx);
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
void LCD_INTEn(LCD_TypeDef * LCDx);
void LCD_INTDis(LCD_TypeDef * LCDx);
void LCD_INTClr(LCD_TypeDef * LCDx);
uint32_t LCD_INTStat(LCD_TypeDef * LCDx);
#endif //__SWM320_LCD_H__ #endif //__SWM320_LCD_H__

View File

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

View File

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

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_port.h" #include "SWM320_port.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : PORT_Init() * : PORT_Init()
* : "SWM320_port.h" * : "SWM320_port.h"
@ -35,108 +34,108 @@
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en) void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
{ {
switch((uint32_t)PORTx) switch ((uint32_t)PORTx)
{ {
case ((uint32_t)PORTA): case ((uint32_t)PORTA):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTA_MUX0 &= ~(0x1F << (n*5)); PORT->PORTA_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTA_MUX0 |= (func-100) << (n*5); PORT->PORTA_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTA_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTA_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTA_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTA_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
} }
PORT->PORTA_SEL &= ~(0x03 << (n*2)); PORT->PORTA_SEL &= ~(0x03 << (n * 2));
PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n*2); PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n * 2);
PORT->PORTA_INEN &= ~(0x01 << n); PORT->PORTA_INEN &= ~(0x01 << n);
PORT->PORTA_INEN |= (digit_in_en << n); PORT->PORTA_INEN |= (digit_in_en << n);
break; break;
case ((uint32_t)PORTB): case ((uint32_t)PORTB):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTB_MUX0 &= ~(0x1F << (n*5)); PORT->PORTB_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTB_MUX0 |= (func-100) << (n*5); PORT->PORTB_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTB_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTB_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTB_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTB_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
} }
PORT->PORTB_SEL &= ~(0x03 << (n*2)); PORT->PORTB_SEL &= ~(0x03 << (n * 2));
PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n*2); PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n * 2);
PORT->PORTB_INEN &= ~(0x01 << n); PORT->PORTB_INEN &= ~(0x01 << n);
PORT->PORTB_INEN |= (digit_in_en << n); PORT->PORTB_INEN |= (digit_in_en << n);
break; break;
case ((uint32_t)PORTC): case ((uint32_t)PORTC):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTC_MUX0 &= ~(0x1F << (n*5)); PORT->PORTC_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTC_MUX0 |= (func-100) << (n*5); PORT->PORTC_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTC_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTC_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTC_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTC_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
} }
PORT->PORTC_SEL &= ~(0x03 << (n*2)); PORT->PORTC_SEL &= ~(0x03 << (n * 2));
PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n*2); PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n * 2);
PORT->PORTC_INEN &= ~(0x01 << n); PORT->PORTC_INEN &= ~(0x01 << n);
PORT->PORTC_INEN |= (digit_in_en << n); PORT->PORTC_INEN |= (digit_in_en << n);
break; break;
case ((uint32_t)PORTM): case ((uint32_t)PORTM):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTM_MUX0 &= ~(0x1F << (n*5)); PORT->PORTM_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTM_MUX0 |= (func-100) << (n*5); PORT->PORTM_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTM_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTM_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTM_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTM_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
else if(n < PIN18) else if (n < PIN18)
{ {
PORT->PORTM_MUX2 &= ~(0x1F << ((n-12)*5)); PORT->PORTM_MUX2 &= ~(0x1F << ((n - 12) * 5));
PORT->PORTM_MUX2 |= (func-100) << ((n-12)*5); PORT->PORTM_MUX2 |= (func - 100) << ((n - 12) * 5);
} }
else if(n < PIN24) else if (n < PIN24)
{ {
PORT->PORTM_MUX3 &= ~(0x1F << ((n-18)*5)); PORT->PORTM_MUX3 &= ~(0x1F << ((n - 18) * 5));
PORT->PORTM_MUX3 |= (func-100) << ((n-18)*5); PORT->PORTM_MUX3 |= (func - 100) << ((n - 18) * 5);
} }
} }
if(n < 16) if (n < 16)
{ {
PORT->PORTM_SEL0 &= ~(0x03 << (n*2)); PORT->PORTM_SEL0 &= ~(0x03 << (n * 2));
PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n*2); PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
} }
else else
{ {
PORT->PORTM_SEL1 &= ~(0x03 << ((n-16)*2)); PORT->PORTM_SEL1 &= ~(0x03 << ((n - 16) * 2));
PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2); PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
} }
PORT->PORTM_INEN &= ~(0x01 << n); PORT->PORTM_INEN &= ~(0x01 << n);
@ -144,34 +143,34 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
break; break;
case ((uint32_t)PORTN): case ((uint32_t)PORTN):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTN_MUX0 &= ~(0x1F << (n*5)); PORT->PORTN_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTN_MUX0 |= (func-100) << (n*5); PORT->PORTN_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTN_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTN_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTN_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTN_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
else if(n < PIN18) else if (n < PIN18)
{ {
PORT->PORTN_MUX2 &= ~(0x1F << ((n-12)*5)); PORT->PORTN_MUX2 &= ~(0x1F << ((n - 12) * 5));
PORT->PORTN_MUX2 |= (func-100) << ((n-12)*5); PORT->PORTN_MUX2 |= (func - 100) << ((n - 12) * 5);
} }
} }
if(n < 16) if (n < 16)
{ {
PORT->PORTN_SEL0 &= ~(0x03 << (n*2)); PORT->PORTN_SEL0 &= ~(0x03 << (n * 2));
PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n*2); PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
} }
else else
{ {
PORT->PORTN_SEL1 &= ~(0x03 << ((n-16)*2)); PORT->PORTN_SEL1 &= ~(0x03 << ((n - 16) * 2));
PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2); PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
} }
PORT->PORTN_INEN &= ~(0x01 << n); PORT->PORTN_INEN &= ~(0x01 << n);
@ -179,39 +178,39 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
break; break;
case ((uint32_t)PORTP): case ((uint32_t)PORTP):
if(func > 99) if (func > 99)
{ {
if(n < PIN6) if (n < PIN6)
{ {
PORT->PORTP_MUX0 &= ~(0x1F << (n*5)); PORT->PORTP_MUX0 &= ~(0x1F << (n * 5));
PORT->PORTP_MUX0 |= (func-100) << (n*5); PORT->PORTP_MUX0 |= (func - 100) << (n * 5);
} }
else if(n < PIN12) else if (n < PIN12)
{ {
PORT->PORTP_MUX1 &= ~(0x1F << ((n-6)*5)); PORT->PORTP_MUX1 &= ~(0x1F << ((n - 6) * 5));
PORT->PORTP_MUX1 |= (func-100) << ((n-6)*5); PORT->PORTP_MUX1 |= (func - 100) << ((n - 6) * 5);
} }
else if(n < PIN18) else if (n < PIN18)
{ {
PORT->PORTP_MUX2 &= ~(0x1F << ((n-12)*5)); PORT->PORTP_MUX2 &= ~(0x1F << ((n - 12) * 5));
PORT->PORTP_MUX2 |= (func-100) << ((n-12)*5); PORT->PORTP_MUX2 |= (func - 100) << ((n - 12) * 5);
} }
else if(n < PIN24) else if (n < PIN24)
{ {
PORT->PORTP_MUX3 &= ~(0x1F << ((n-18)*5)); PORT->PORTP_MUX3 &= ~(0x1F << ((n - 18) * 5));
PORT->PORTP_MUX3 |= (func-100) << ((n-18)*5); PORT->PORTP_MUX3 |= (func - 100) << ((n - 18) * 5);
} }
} }
if(n < 16) if (n < 16)
{ {
PORT->PORTP_SEL0 &= ~(0x03 << (n*2)); PORT->PORTP_SEL0 &= ~(0x03 << (n * 2));
PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n*2); PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
} }
else else
{ {
PORT->PORTP_SEL1 &= ~(0x03 << ((n-16)*2)); PORT->PORTP_SEL1 &= ~(0x03 << ((n - 16) * 2));
PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2); PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
} }
PORT->PORTP_INEN &= ~(0x01 << n); PORT->PORTP_INEN &= ~(0x01 << n);

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_GPIO 0
#define PORTA_PIN12_ADC0_IN4 3 #define PORTA_PIN12_ADC0_IN4 3
#define PORTB_PIN0_GPIO 0 #define PORTB_PIN0_GPIO 0
#define PORTB_PIN0_FUNMUX 1 #define PORTB_PIN0_FUNMUX 1
#define PORTB_PIN0_SD_DETECT 2 #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 PORTB_PIN12_GPIO 0
#define PORTC_PIN0_GPIO 0 #define PORTC_PIN0_GPIO 0
#define PORTC_PIN0_FUNMUX 1 #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_FUNMUX 1
#define PORTC_PIN7_ADC1_IN0 3 #define PORTC_PIN7_ADC1_IN0 3
#define PORTM_PIN0_GPIO 0 #define PORTM_PIN0_GPIO 0
#define PORTM_PIN0_FUNMUX 1 #define PORTM_PIN0_FUNMUX 1
#define PORTM_PIN0_NORFL_D15 2 #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_FUNMUX 1
#define PORTM_PIN21_SDRAM_CKE 2 #define PORTM_PIN21_SDRAM_CKE 2
#define PORTN_PIN0_GPIO 0 #define PORTN_PIN0_GPIO 0
#define PORTN_PIN0_FUNMUX 1 #define PORTN_PIN0_FUNMUX 1
#define PORTN_PIN0_LCD_D0 2 #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_WR 2
#define PORTN_PIN19_LCD_HSYNC 2 #define PORTN_PIN19_LCD_HSYNC 2
#define PORTP_PIN0_GPIO 0 #define PORTP_PIN0_GPIO 0
#define PORTP_PIN0_FUNMUX 1 #define PORTP_PIN0_FUNMUX 1
#define PORTP_PIN0_NORFL_A0 2 #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_FUNMUX 1
#define PORTP_PIN23_NORFL_A23 2 #define PORTP_PIN23_NORFL_A23 2
/* 下面宏定义的取值全部在正确值的基础上“加100”以区分上面宏定义的值从而方便库函数的编写*/ /* 下面宏定义的取值全部在正确值的基础上“加100”以区分上面宏定义的值从而方便库函数的编写*/
/* 下面这些值是偶数编号引脚的功能取值如PIN0、PIN2、... */ /* 下面这些值是偶数编号引脚的功能取值如PIN0、PIN2、... */
#define FUNMUX0_UART0_RXD 100 #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_UART2_RTS 123
#define FUNMUX1_UART3_RTS 124 #define FUNMUX1_UART3_RTS 124
#endif //__SWM320_PORT_H__ #endif //__SWM320_PORT_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_pwm.h" #include "SWM320_pwm.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : PWM_Init() * : PWM_Init()
* : PWM初始化 * : PWM初始化
@ -30,7 +29,7 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct) void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
{ {
uint32_t bit_offset = 0; uint32_t bit_offset = 0;
@ -57,43 +56,43 @@ void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
PWMG->IM = 0x00000000; PWMG->IM = 0x00000000;
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
bit_offset = 0; bit_offset = 0;
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
bit_offset = 2; bit_offset = 2;
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
bit_offset = 4; bit_offset = 4;
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
bit_offset = 6; bit_offset = 6;
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
bit_offset = 8; bit_offset = 8;
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
bit_offset = 10; bit_offset = 10;
break; break;
} }
PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))); //清除中断标志 PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))); //清除中断标志
PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))); PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13)));
PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset+1)) | PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset + 1)) |
(initStruct->HEndAIEn << (bit_offset+12)) | (initStruct->HEndBIEn << (bit_offset+13)); (initStruct->HEndAIEn << (bit_offset + 12)) | (initStruct->HEndBIEn << (bit_offset + 13));
if(initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn) if (initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
{ {
NVIC_EnableIRQ(PWM_IRQn); NVIC_EnableIRQ(PWM_IRQn);
} }
else if((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))))) == 0) else if ((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))))) == 0)
{ {
NVIC_DisableIRQ(PWM_IRQn); NVIC_DisableIRQ(PWM_IRQn);
} }
@ -108,31 +107,31 @@ void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB) void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos); PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
break; break;
} }
@ -147,31 +146,31 @@ void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB) void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos)); PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
break; break;
} }
@ -186,11 +185,11 @@ void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle) void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
{ {
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
PWMx->PERA = cycle; PWMx->PERA = cycle;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
PWMx->PERB = cycle; PWMx->PERB = cycle;
} }
@ -202,13 +201,13 @@ void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle)
* : uint16_t * : uint16_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn) uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
{ {
uint16_t cycle = 0; uint16_t cycle = 0;
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
cycle = PWMx->PERA; cycle = PWMx->PERA;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
cycle = PWMx->PERB; cycle = PWMx->PERB;
return cycle; return cycle;
@ -223,11 +222,11 @@ uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty) void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
{ {
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
PWMx->HIGHA = hduty; PWMx->HIGHA = hduty;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
PWMx->HIGHB = hduty; PWMx->HIGHB = hduty;
} }
@ -239,13 +238,13 @@ void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
* : uint16_t * : uint16_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn) uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
{ {
uint16_t hduty = 0; uint16_t hduty = 0;
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
hduty = PWMx->HIGHA; hduty = PWMx->HIGHA;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
hduty = PWMx->HIGHB; hduty = PWMx->HIGHB;
return hduty; return hduty;
@ -260,11 +259,11 @@ uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone) void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
{ {
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
PWMx->DZA = deadzone; PWMx->DZA = deadzone;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
PWMx->DZB = deadzone; PWMx->DZB = deadzone;
} }
@ -276,19 +275,18 @@ void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone)
* : uint8_t * : uint8_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn) uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
{ {
uint8_t deadzone = 0; uint8_t deadzone = 0;
if(chn == PWM_CH_A) if (chn == PWM_CH_A)
deadzone = PWMx->DZA; deadzone = PWMx->DZA;
else if(chn == PWM_CH_B) else if (chn == PWM_CH_B)
deadzone = PWMx->DZB; deadzone = PWMx->DZB;
return deadzone; return deadzone;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : PWM_IntNCycleEn() * : PWM_IntNCycleEn()
* : 使 * : 使
@ -297,38 +295,50 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos); PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
break; break;
} }
} }
@ -341,38 +351,50 @@ void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
break; break;
} }
} }
@ -385,38 +407,50 @@ void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
break; break;
} }
} }
@ -429,47 +463,58 @@ void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn) uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
{ {
uint32_t int_stat = 0; uint32_t int_stat = 0;
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk); int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
break; break;
} }
return int_stat; return int_stat;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : PWM_IntHEndEn() * : PWM_IntHEndEn()
* : 使 * : 使
@ -478,38 +523,50 @@ uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos); if (chn == PWM_CH_A)
else PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos); PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
else
PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
break; break;
} }
} }
@ -522,38 +579,50 @@ void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos); if (chn == PWM_CH_A)
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos); PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
else
PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
break; break;
} }
} }
@ -566,38 +635,50 @@ void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn) void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
{ {
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos); if (chn == PWM_CH_A)
else PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos); PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
else
PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
break; break;
} }
} }
@ -610,40 +691,52 @@ void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn) uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
{ {
uint32_t int_stat = 0; uint32_t int_stat = 0;
switch((uint32_t)PWMx) switch ((uint32_t)PWMx)
{ {
case((uint32_t)PWM0): case ((uint32_t)PWM0):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
break; break;
case((uint32_t)PWM1): case ((uint32_t)PWM1):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
break; break;
case((uint32_t)PWM2): case ((uint32_t)PWM2):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
break; break;
case((uint32_t)PWM3): case ((uint32_t)PWM3):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
break; break;
case((uint32_t)PWM4): case ((uint32_t)PWM4):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
break; break;
case((uint32_t)PWM5): case ((uint32_t)PWM5):
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk); if (chn == PWM_CH_A)
else int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk); int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
else
int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
break; break;
} }

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_PWM_H__ #ifndef __SWM320_PWM_H__
#define __SWM320_PWM_H__ #define __SWM320_PWM_H__
typedef struct { typedef struct
{
uint8_t clk_div; //PWM_CLKDIV_1、PWM_CLKDIV_8 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 uint8_t mode; //PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
@ -33,26 +34,24 @@ typedef struct {
#define PWM_CH_A 0 #define PWM_CH_A 0
#define PWM_CH_B 1 #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输出
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct); //PWM初始化 void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle); //设置周期
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //启动PWM开始PWM输出 uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn); //获取周期
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //关闭PWM停止PWM输出 void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn); //获取高电平时长
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle); //设置周期 void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn); //获取周期 uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn); //获取死区时长
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn); //获取高电平时长
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn); //获取死区时长
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断使能
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断禁能
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断标志清除
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断是否发生
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断使能
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); //高电平结束中断是否发生
void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断使能
void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断禁能
void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断标志清除
uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断是否发生
void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断使能
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__ #endif //__SWM320_PWM_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_rtc.h" #include "SWM320_rtc.h"
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date); static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : RTC_Init() * : RTC_Init()
@ -31,7 +30,7 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct) void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
{ {
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos); SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
@ -42,7 +41,8 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
RTC_Stop(RTCx); RTC_Stop(RTCx);
while(RTCx->CFGABLE == 0); while (RTCx->CFGABLE == 0)
;
RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) | RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
(initStruct->Minute << RTC_MINSEC_MIN_Pos); (initStruct->Minute << RTC_MINSEC_MIN_Pos);
@ -61,7 +61,7 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
RTCx->IE = (initStruct->SecondIEn << RTC_IE_SEC_Pos) | RTCx->IE = (initStruct->SecondIEn << RTC_IE_SEC_Pos) |
(initStruct->MinuteIEn << RTC_IE_MIN_Pos); (initStruct->MinuteIEn << RTC_IE_MIN_Pos);
if(initStruct->SecondIEn | initStruct->MinuteIEn) if (initStruct->SecondIEn | initStruct->MinuteIEn)
{ {
NVIC_EnableIRQ(RTC_IRQn); NVIC_EnableIRQ(RTC_IRQn);
} }
@ -78,7 +78,7 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_Start(RTC_TypeDef * RTCx) void RTC_Start(RTC_TypeDef *RTCx)
{ {
RTCx->EN = 1; RTCx->EN = 1;
} }
@ -90,7 +90,7 @@ void RTC_Start(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_Stop(RTC_TypeDef * RTCx) void RTC_Stop(RTC_TypeDef *RTCx)
{ {
RTCx->EN = 0; RTCx->EN = 0;
} }
@ -103,7 +103,7 @@ void RTC_Stop(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime) void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
{ {
dateTime->Year = RTCx->YEAR + 1901; dateTime->Year = RTCx->YEAR + 1901;
dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos; dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos;
@ -122,9 +122,10 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct) 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) | RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
(alarmStruct->Minute << RTC_MINSECAL_MIN_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); (alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
RTCx->LOAD = 1 << RTC_LOAD_ALARM_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->IF = (1 << RTC_IF_ALARM_Pos);
RTCx->IE &= ~RTC_IE_ALARM_Msk; RTCx->IE &= ~RTC_IE_ALARM_Msk;
RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos); RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
if(alarmStruct->AlarmIEn) NVIC_EnableIRQ(RTC_IRQn); if (alarmStruct->AlarmIEn)
NVIC_EnableIRQ(RTC_IRQn);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -156,20 +159,23 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
uint32_t i, cnt = 0; uint32_t i, cnt = 0;
const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 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; 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; cnt += (year - 1901) * 365;
for(i = 1901; i < year; i++) 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; return (cnt + 1) % 7;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -179,7 +185,7 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntSecondEn(RTC_TypeDef * RTCx) void RTC_IntSecondEn(RTC_TypeDef *RTCx)
{ {
RTCx->IE |= (1 << RTC_IE_SEC_Pos); RTCx->IE |= (1 << RTC_IE_SEC_Pos);
} }
@ -191,7 +197,7 @@ void RTC_IntSecondEn(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntSecondDis(RTC_TypeDef * RTCx) void RTC_IntSecondDis(RTC_TypeDef *RTCx)
{ {
RTCx->IE &= ~(1 << RTC_IE_SEC_Pos); RTCx->IE &= ~(1 << RTC_IE_SEC_Pos);
} }
@ -203,7 +209,7 @@ void RTC_IntSecondDis(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntSecondClr(RTC_TypeDef * RTCx) void RTC_IntSecondClr(RTC_TypeDef *RTCx)
{ {
RTCx->IF = (1 << RTC_IF_SEC_Pos); RTCx->IF = (1 << RTC_IF_SEC_Pos);
} }
@ -215,7 +221,7 @@ void RTC_IntSecondClr(RTC_TypeDef * RTCx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx) uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
{ {
return (RTCx->IF & RTC_IF_SEC_Msk) ? 1 : 0; return (RTCx->IF & RTC_IF_SEC_Msk) ? 1 : 0;
} }
@ -227,7 +233,7 @@ uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntMinuteEn(RTC_TypeDef * RTCx) void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
{ {
RTCx->IE |= (1 << RTC_IE_MIN_Pos); RTCx->IE |= (1 << RTC_IE_MIN_Pos);
} }
@ -239,7 +245,7 @@ void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntMinuteDis(RTC_TypeDef * RTCx) void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
{ {
RTCx->IE &= ~(1 << RTC_IE_MIN_Pos); RTCx->IE &= ~(1 << RTC_IE_MIN_Pos);
} }
@ -251,7 +257,7 @@ void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntMinuteClr(RTC_TypeDef * RTCx) void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
{ {
RTCx->IF = (1 << RTC_IF_MIN_Pos); RTCx->IF = (1 << RTC_IF_MIN_Pos);
} }
@ -263,7 +269,7 @@ void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx) uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
{ {
return (RTCx->IF & RTC_IF_MIN_Msk) ? 1 : 0; return (RTCx->IF & RTC_IF_MIN_Msk) ? 1 : 0;
} }
@ -275,7 +281,7 @@ uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntHourEn(RTC_TypeDef * RTCx) void RTC_IntHourEn(RTC_TypeDef *RTCx)
{ {
RTCx->IE |= (1 << RTC_IE_HOUR_Pos); RTCx->IE |= (1 << RTC_IE_HOUR_Pos);
} }
@ -287,7 +293,7 @@ void RTC_IntHourEn(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntHourDis(RTC_TypeDef * RTCx) void RTC_IntHourDis(RTC_TypeDef *RTCx)
{ {
RTCx->IE &= ~(1 << RTC_IE_HOUR_Pos); RTCx->IE &= ~(1 << RTC_IE_HOUR_Pos);
} }
@ -299,7 +305,7 @@ void RTC_IntHourDis(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntHourClr(RTC_TypeDef * RTCx) void RTC_IntHourClr(RTC_TypeDef *RTCx)
{ {
RTCx->IF = (1 << RTC_IF_HOUR_Pos); RTCx->IF = (1 << RTC_IF_HOUR_Pos);
} }
@ -311,7 +317,7 @@ void RTC_IntHourClr(RTC_TypeDef * RTCx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx) uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
{ {
return (RTCx->IF & RTC_IF_HOUR_Msk) ? 1 : 0; return (RTCx->IF & RTC_IF_HOUR_Msk) ? 1 : 0;
} }
@ -323,7 +329,7 @@ uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntDateEn(RTC_TypeDef * RTCx) void RTC_IntDateEn(RTC_TypeDef *RTCx)
{ {
RTCx->IE |= (1 << RTC_IE_DATE_Pos); RTCx->IE |= (1 << RTC_IE_DATE_Pos);
} }
@ -335,7 +341,7 @@ void RTC_IntDateEn(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntDateDis(RTC_TypeDef * RTCx) void RTC_IntDateDis(RTC_TypeDef *RTCx)
{ {
RTCx->IE &= ~(1 << RTC_IE_DATE_Pos); RTCx->IE &= ~(1 << RTC_IE_DATE_Pos);
} }
@ -347,7 +353,7 @@ void RTC_IntDateDis(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntDateClr(RTC_TypeDef * RTCx) void RTC_IntDateClr(RTC_TypeDef *RTCx)
{ {
RTCx->IF = (1 << RTC_IF_DATE_Pos); RTCx->IF = (1 << RTC_IF_DATE_Pos);
} }
@ -359,7 +365,7 @@ void RTC_IntDateClr(RTC_TypeDef * RTCx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx) uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
{ {
return (RTCx->IF & RTC_IF_DATE_Msk) ? 1 : 0; return (RTCx->IF & RTC_IF_DATE_Msk) ? 1 : 0;
} }
@ -371,7 +377,7 @@ uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntAlarmEn(RTC_TypeDef * RTCx) void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
{ {
RTCx->IE |= (1 << RTC_IE_ALARM_Pos); RTCx->IE |= (1 << RTC_IE_ALARM_Pos);
} }
@ -383,7 +389,7 @@ void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntAlarmDis(RTC_TypeDef * RTCx) void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
{ {
RTCx->IE &= ~(1 << RTC_IE_ALARM_Pos); RTCx->IE &= ~(1 << RTC_IE_ALARM_Pos);
} }
@ -395,7 +401,7 @@ void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void RTC_IntAlarmClr(RTC_TypeDef * RTCx) void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
{ {
RTCx->IF = (1 << RTC_IF_ALARM_Pos); RTCx->IF = (1 << RTC_IF_ALARM_Pos);
} }
@ -407,7 +413,7 @@ void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx) uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx)
{ {
return (RTCx->IF & RTC_IF_ALARM_Msk) ? 1 : 0; return (RTCx->IF & RTC_IF_ALARM_Msk) ? 1 : 0;
} }

View File

@ -1,7 +1,6 @@
#ifndef __SWM320_RTC_H__ #ifndef __SWM320_RTC_H__
#define __SWM320_RTC_H__ #define __SWM320_RTC_H__
#define RTC_SUN 0x01 #define RTC_SUN 0x01
#define RTC_MON 0x02 #define RTC_MON 0x02
#define RTC_TUE 0x04 #define RTC_TUE 0x04
@ -10,8 +9,8 @@
#define RTC_FRI 0x20 #define RTC_FRI 0x20
#define RTC_SAT 0x40 #define RTC_SAT 0x40
typedef struct
typedef struct { {
uint16_t Year; uint16_t Year;
uint8_t Month; //取值1--12 uint8_t Month; //取值1--12
uint8_t Date; //取值1--31 uint8_t Date; //取值1--31
@ -22,7 +21,8 @@ typedef struct {
uint8_t MinuteIEn; uint8_t MinuteIEn;
} RTC_InitStructure; } 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 Days; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT及其或运算组合
uint8_t Hour; uint8_t Hour;
uint8_t Minute; uint8_t Minute;
@ -30,7 +30,8 @@ typedef struct {
uint8_t AlarmIEn; uint8_t AlarmIEn;
} RTC_AlarmStructure; } RTC_AlarmStructure;
typedef struct { typedef struct
{
uint16_t Year; uint16_t Year;
uint8_t Month; uint8_t Month;
uint8_t Date; uint8_t Date;
@ -40,34 +41,33 @@ typedef struct {
uint8_t Second; uint8_t Second;
} RTC_DateTime; } RTC_DateTime;
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct); void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
void RTC_Start(RTC_TypeDef * RTCx); void RTC_Start(RTC_TypeDef *RTCx);
void RTC_Stop(RTC_TypeDef * RTCx); void RTC_Stop(RTC_TypeDef *RTCx);
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime); void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct); void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
void RTC_IntSecondEn(RTC_TypeDef *RTCx);
void RTC_IntSecondEn(RTC_TypeDef * RTCx); void RTC_IntSecondDis(RTC_TypeDef *RTCx);
void RTC_IntSecondDis(RTC_TypeDef * RTCx); void RTC_IntSecondClr(RTC_TypeDef *RTCx);
void RTC_IntSecondClr(RTC_TypeDef * RTCx); uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx);
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx); void RTC_IntMinuteEn(RTC_TypeDef *RTCx);
void RTC_IntMinuteEn(RTC_TypeDef * RTCx); void RTC_IntMinuteDis(RTC_TypeDef *RTCx);
void RTC_IntMinuteDis(RTC_TypeDef * RTCx); void RTC_IntMinuteClr(RTC_TypeDef *RTCx);
void RTC_IntMinuteClr(RTC_TypeDef * RTCx); uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx);
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx); void RTC_IntHourEn(RTC_TypeDef *RTCx);
void RTC_IntHourEn(RTC_TypeDef * RTCx); void RTC_IntHourDis(RTC_TypeDef *RTCx);
void RTC_IntHourDis(RTC_TypeDef * RTCx); void RTC_IntHourClr(RTC_TypeDef *RTCx);
void RTC_IntHourClr(RTC_TypeDef * RTCx); uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx);
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx); void RTC_IntDateEn(RTC_TypeDef *RTCx);
void RTC_IntDateEn(RTC_TypeDef * RTCx); void RTC_IntDateDis(RTC_TypeDef *RTCx);
void RTC_IntDateDis(RTC_TypeDef * RTCx); void RTC_IntDateClr(RTC_TypeDef *RTCx);
void RTC_IntDateClr(RTC_TypeDef * RTCx); uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx);
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx); void RTC_IntAlarmEn(RTC_TypeDef *RTCx);
void RTC_IntAlarmEn(RTC_TypeDef * RTCx); void RTC_IntAlarmDis(RTC_TypeDef *RTCx);
void RTC_IntAlarmDis(RTC_TypeDef * RTCx); void RTC_IntAlarmClr(RTC_TypeDef *RTCx);
void RTC_IntAlarmClr(RTC_TypeDef * RTCx); uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx);
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx);
#endif //__SWM320_RTC_H__ #endif //__SWM320_RTC_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_sdio.h" #include "SWM320_sdio.h"
SD_CardInfo SD_cardInfo; SD_CardInfo SD_cardInfo;
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -37,7 +36,7 @@ uint32_t SDIO_Init(uint32_t freq)
uint32_t resp, resps[4]; uint32_t resp, resps[4];
SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk; SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
if(SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz if (SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4 SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
else else
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2 SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
@ -57,59 +56,59 @@ uint32_t SDIO_Init(uint32_t freq)
(calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) | (calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
(0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK (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->IFE = 0xFFFFFFFF;
SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE 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 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) if (res != SD_RES_OK)
return res; return res;
if(resp == 0x1AA) SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; if (resp == 0x1AA)
else SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1; 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 do //ACMD41: SD_CMD_SD_APP_OP_COND
{ {
res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp); res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; 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) 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); SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp);
else else
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x00000000, SD_RESP_32b, &resp); SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
} while(((resp >> 31) & 0x01) == 0); //上电没完成时resp[31] == 0 } 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 SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID获取CID
parseCID(resps); parseCID(resps);
SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR设置RCA SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR设置RCA
SD_cardInfo.RCA = resp >> 16; 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 SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD获取CSD
parseCSD(resps); 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 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) | SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
(calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //初始化完成SDCLK切换到高速 (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_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: 选中卡从Standy模式进入Transfer模式
SDIO->IF = SDIO_IF_TRXDONE_Msk; 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->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节 SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节
SDIO->BLK = 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 res, i;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1); res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; 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; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; return SD_RES_OK;
@ -172,22 +175,27 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
uint32_t res, i, j; uint32_t res, i, j;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt); res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; return res;
for(i = 0; i < block_cnt; i++) 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; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; return SD_RES_OK;
@ -207,16 +215,19 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
uint32_t res; uint32_t res;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
SDIO->DMA_MEM_ADDR = (uint32_t) buff; SDIO->DMA_MEM_ADDR = (uint32_t)buff;
res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt); res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; 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 res, i;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1); res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; 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; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; return SD_RES_OK;
@ -267,22 +283,27 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
uint32_t res, i, j; uint32_t res, i, j;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt); res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; return res;
for(i = 0; i < block_cnt; i++) 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; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; return SD_RES_OK;
@ -302,16 +323,19 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
uint32_t res; uint32_t res;
uint32_t addr, resp; uint32_t addr, resp;
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr; if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
else addr = block_addr * 512; addr = block_addr;
else
addr = block_addr * 512;
SDIO->DMA_MEM_ADDR = (uint32_t)buff; SDIO->DMA_MEM_ADDR = (uint32_t)buff;
res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt); res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
if(res != SD_RES_OK) if (res != SD_RES_OK)
return res; 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; SDIO->IF = SDIO_IF_TRXDONE_Msk;
return SD_RES_OK; return SD_RES_OK;
@ -349,15 +373,15 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) | ((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) |
(use_dma << SDIO_CMD_DMAEN_Pos); (use_dma << SDIO_CMD_DMAEN_Pos);
while((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0) while ((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
{ {
if(SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk) if (SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
{ {
SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk; SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk;
return SD_RES_TIMEOUT; return SD_RES_TIMEOUT;
} }
else if(SDIO->IF & SDIO_IF_ERROR_Msk) else if (SDIO->IF & SDIO_IF_ERROR_Msk)
{ {
SDIO->IF = 0xFFFFFFFF; SDIO->IF = 0xFFFFFFFF;
@ -366,11 +390,11 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
} }
SDIO->IF = SDIO_IF_CMDDONE_Msk; SDIO->IF = SDIO_IF_CMDDONE_Msk;
if(resp_type == SD_RESP_32b) if (resp_type == SD_RESP_32b)
{ {
resp_data[0] = SDIO->RESP[0]; resp_data[0] = SDIO->RESP[0];
} }
else if(resp_type == SD_RESP_128b) else if (resp_type == SD_RESP_128b)
{ {
//寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0]最低位的CRC被丢掉 //寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0]最低位的CRC被丢掉
//读出数据时调整了顺序将CID/CSD[127-8]存放在resp_data0-3[127-8]最低8位填充0x00 //读出数据时调整了顺序将CID/CSD[127-8]存放在resp_data0-3[127-8]最低8位填充0x00
@ -383,7 +407,6 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
return SD_RES_OK; return SD_RES_OK;
} }
void parseCID(uint32_t CID_Tab[4]) void parseCID(uint32_t CID_Tab[4])
{ {
uint8_t tmp = 0; uint8_t tmp = 0;
@ -514,7 +537,7 @@ void parseCSD(uint32_t CSD_Tab[4])
tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8); tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7; SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) ; SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1);
SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2)); SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen); SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize; SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
@ -580,15 +603,24 @@ uint32_t calcSDCLKDiv(uint32_t freq)
uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq; uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
uint32_t regdiv = 0; uint32_t regdiv = 0;
if(clkdiv > 128) regdiv = 0x80; if (clkdiv > 128)
else if(clkdiv > 64) regdiv = 0x40; regdiv = 0x80;
else if(clkdiv > 32) regdiv = 0x20; else if (clkdiv > 64)
else if(clkdiv > 16) regdiv = 0x10; regdiv = 0x40;
else if(clkdiv > 8) regdiv = 0x08; else if (clkdiv > 32)
else if(clkdiv > 4) regdiv = 0x04; regdiv = 0x20;
else if(clkdiv > 2) regdiv = 0x02; else if (clkdiv > 16)
else if(clkdiv > 1) regdiv = 0x01; regdiv = 0x10;
else regdiv = 0x00; 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; return regdiv;
} }

View File

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

View File

@ -28,7 +28,7 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SDRAM_Init(SDRAM_InitStructure * initStruct) void SDRAM_Init(SDRAM_InitStructure *initStruct)
{ {
uint32_t row_n; uint32_t row_n;
@ -53,19 +53,30 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
SDRAMC->LATCH = 0x02; SDRAMC->LATCH = 0x02;
switch(initStruct->CellSize) switch (initStruct->CellSize)
{ {
case SDRAM_CELLSIZE_16Mb: row_n = 11; break; case SDRAM_CELLSIZE_16Mb:
case SDRAM_CELLSIZE_64Mb: row_n = 12; break; row_n = 11;
case SDRAM_CELLSIZE_128Mb: row_n = 12; break; break;
case SDRAM_CELLSIZE_256Mb: row_n = 13; break; case SDRAM_CELLSIZE_64Mb:
default: row_n = 13; break; 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) | SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
(((SystemCoreClock/2)/1000*64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_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); SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_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); SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_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__ #ifndef __SWM320_SDRAM_H__
#define __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 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 CellBank; // SDRAM颗粒有几个bankSDRAM_CELLBANK_2、SDRAM_CELLBANK_4
uint8_t CellWidth; // SDRAM颗粒的位宽SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32 uint8_t CellWidth; // SDRAM颗粒的位宽SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
@ -72,9 +73,7 @@ typedef struct {
#define SDRAM_TRP_6 6 #define SDRAM_TRP_6 6
#define SDRAM_TRP_7 7 #define SDRAM_TRP_7 7
void SDRAM_Init(SDRAM_InitStructure *initStruct);
void SDRAM_Init(SDRAM_InitStructure * initStruct);
void SDRAM_Enable(void); void SDRAM_Enable(void);
void SDRAM_Disable(void); void SDRAM_Disable(void);

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_spi.h" #include "SWM320_spi.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SPI_Init() * : SPI_Init()
* : SPI同步串行接口初始化FIFO触发设定 * : SPI同步串行接口初始化FIFO触发设定
@ -30,9 +29,9 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct) void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
{ {
switch((uint32_t)SPIx) switch ((uint32_t)SPIx)
{ {
case ((uint32_t)SPI0): case ((uint32_t)SPI0):
SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);
@ -50,7 +49,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) | SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
(initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) | (initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
(initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) | (initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
((initStruct->WordSize-1) << SPI_CTRL_SIZE_Pos) | ((initStruct->WordSize - 1) << SPI_CTRL_SIZE_Pos) |
(initStruct->Master << SPI_CTRL_MSTR_Pos) | (initStruct->Master << SPI_CTRL_MSTR_Pos) |
(initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) | (initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
(0 << SPI_CTRL_SSN_H_Pos); (0 << SPI_CTRL_SSN_H_Pos);
@ -61,10 +60,10 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
(initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) | (initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
(initStruct->TXCompleteIEn << SPI_IE_FTC_Pos); (initStruct->TXCompleteIEn << SPI_IE_FTC_Pos);
switch((uint32_t)SPIx) switch ((uint32_t)SPIx)
{ {
case ((uint32_t)SPI0): case ((uint32_t)SPI0):
if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn) if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
{ {
NVIC_EnableIRQ(SPI0_IRQn); NVIC_EnableIRQ(SPI0_IRQn);
} }
@ -75,7 +74,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
break; break;
case ((uint32_t)SPI1): case ((uint32_t)SPI1):
if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn) if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
{ {
NVIC_EnableIRQ(SPI1_IRQn); NVIC_EnableIRQ(SPI1_IRQn);
} }
@ -94,7 +93,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_Open(SPI_TypeDef * SPIx) void SPI_Open(SPI_TypeDef *SPIx)
{ {
SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos); SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
} }
@ -106,7 +105,7 @@ void SPI_Open(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_Close(SPI_TypeDef * SPIx) void SPI_Close(SPI_TypeDef *SPIx)
{ {
SPIx->CTRL &= ~SPI_CTRL_EN_Msk; SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
} }
@ -118,7 +117,7 @@ void SPI_Close(SPI_TypeDef * SPIx)
* : uint32_t * : uint32_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_Read(SPI_TypeDef * SPIx) uint32_t SPI_Read(SPI_TypeDef *SPIx)
{ {
return SPIx->DATA; return SPIx->DATA;
} }
@ -131,7 +130,7 @@ uint32_t SPI_Read(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data) void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
{ {
SPIx->DATA = data; SPIx->DATA = data;
} }
@ -144,13 +143,14 @@ void SPI_Write(SPI_TypeDef * SPIx, uint32_t data)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data) void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
{ {
SPIx->STAT |= (1 << SPI_STAT_WTC_Pos); SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
SPIx->DATA = data; SPIx->DATA = data;
while((SPIx->STAT & SPI_STAT_WTC_Msk) == 0); while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -161,10 +161,11 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
* : uint32_t * : uint32_t
* : SPI模块SPI_Write()SPI_Write()SPI_STAT_RFNE状态 * : SPI模块SPI_Write()SPI_Write()SPI_STAT_RFNE状态
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data) uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
{ {
SPIx->DATA = data; SPIx->DATA = data;
while(!(SPIx->STAT & SPI_STAT_RFNE_Msk)); while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
;
return SPIx->DATA; return SPIx->DATA;
} }
@ -176,7 +177,7 @@ uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
* : uint32_t 1 FIFO空 0 FIFO非空 * : uint32_t 1 FIFO空 0 FIFO非空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx) uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
{ {
return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1; return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
} }
@ -188,7 +189,7 @@ uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO满 0 FIFO不满 * : uint32_t 1 FIFO满 0 FIFO不满
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx) uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
{ {
return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1; return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
} }
@ -200,12 +201,11 @@ uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO空 0 FIFO非空 * : uint32_t 1 FIFO空 0 FIFO非空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx) uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
{ {
return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0; return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : SPI_INTRXHalfFullEn() * : SPI_INTRXHalfFullEn()
* : FIFO半满中断使能 * : FIFO半满中断使能
@ -213,7 +213,7 @@ uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx) void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos); SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
} }
@ -225,7 +225,7 @@ void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx) void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos); SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
} }
@ -237,7 +237,7 @@ void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx) void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_RFHF_Pos); SPIx->IF = (1 << SPI_IF_RFHF_Pos);
} }
@ -249,7 +249,7 @@ void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO达到半满 0 FIFO未达到半满 * : uint32_t 1 FIFO达到半满 0 FIFO未达到半满
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx) uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
} }
@ -261,7 +261,7 @@ uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXFullEn(SPI_TypeDef * SPIx) void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_RFF_Pos); SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
} }
@ -273,7 +273,7 @@ void SPI_INTRXFullEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXFullDis(SPI_TypeDef * SPIx) void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos); SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
} }
@ -285,7 +285,7 @@ void SPI_INTRXFullDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXFullClr(SPI_TypeDef * SPIx) void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_RFF_Pos); SPIx->IF = (1 << SPI_IF_RFF_Pos);
} }
@ -297,7 +297,7 @@ void SPI_INTRXFullClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO满 0 FIFO未满 * : uint32_t 1 FIFO满 0 FIFO未满
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx) uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
} }
@ -309,7 +309,7 @@ uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx) void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos); SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
} }
@ -321,7 +321,7 @@ void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx) void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos); SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
} }
@ -333,7 +333,7 @@ void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx) void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos); SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
} }
@ -345,7 +345,7 @@ void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO溢出 0 FIFO未溢出 * : uint32_t 1 FIFO溢出 0 FIFO未溢出
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx) uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
} }
@ -357,7 +357,7 @@ uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx) void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos); SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
} }
@ -369,7 +369,7 @@ void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx) void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos); SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
} }
@ -381,7 +381,7 @@ void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx) void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_TFHF_Pos); SPIx->IF = (1 << SPI_IF_TFHF_Pos);
} }
@ -393,7 +393,7 @@ void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO达到半满 0 FIFO未达到半满 * : uint32_t 1 FIFO达到半满 0 FIFO未达到半满
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx) uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
} }
@ -405,7 +405,7 @@ uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx) void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_TFE_Pos); SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
} }
@ -417,7 +417,7 @@ void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx) void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos); SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
} }
@ -429,7 +429,7 @@ void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx) void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_TFE_Pos); SPIx->IF = (1 << SPI_IF_TFE_Pos);
} }
@ -441,7 +441,7 @@ void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO空 0 FIFO非空 * : uint32_t 1 FIFO空 0 FIFO非空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx) uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
} }
@ -453,7 +453,7 @@ uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx) void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_FTC_Pos); SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
} }
@ -465,7 +465,7 @@ void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx) void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos); SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
} }
@ -477,7 +477,7 @@ void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx) void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_FTC_Pos); SPIx->IF = (1 << SPI_IF_FTC_Pos);
} }
@ -489,7 +489,7 @@ void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx)
* : uint32_t 1 FIFO空且发送移位寄存器空 0 FIFO或发送移位寄存器非空 * : uint32_t 1 FIFO空且发送移位寄存器空 0 FIFO或发送移位寄存器非空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx) uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
} }
@ -501,7 +501,7 @@ uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx) void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
{ {
SPIx->IE |= (0x01 << SPI_IE_WTC_Pos); SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
} }
@ -513,7 +513,7 @@ void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx) void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
{ {
SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos); SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
} }
@ -525,7 +525,7 @@ void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx) void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
{ {
SPIx->IF = (1 << SPI_IF_WTC_Pos); SPIx->IF = (1 << SPI_IF_WTC_Pos);
} }
@ -537,7 +537,7 @@ void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx) uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
{ {
return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0; return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
} }

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_SPI_H__ #ifndef __SWM320_SPI_H__
#define __SWM320_SPI_H__ #define __SWM320_SPI_H__
typedef struct { typedef struct
{
uint8_t FrameFormat; //帧格式SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI uint8_t FrameFormat; //帧格式SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下选择数据采样边沿SPI_FIRST_EDGE、SPI_SECOND_EDGE uint8_t SampleEdge; //在SPI帧格式下选择数据采样边沿SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下选择空闲时无数据传输时时钟线的电平SPI_LOW_LEVEL、SPI_HIGH_LEVEL uint8_t IdleLevel; //在SPI帧格式下选择空闲时无数据传输时时钟线的电平SPI_LOW_LEVEL、SPI_HIGH_LEVEL
@ -32,52 +33,48 @@ typedef struct {
#define SPI_CLKDIV_256 6 #define SPI_CLKDIV_256 6
#define SPI_CLKDIV_512 7 #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关闭禁止收发
uint32_t SPI_Read(SPI_TypeDef *SPIx);
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化 uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //接收FIFO是否空如果不空则可以继续SPI_Read()
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开允许收发 uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满如果不满则可以继续SPI_Write()
void SPI_Close(SPI_TypeDef * SPIx); //SPI关闭禁止收发 uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
uint32_t SPI_Read(SPI_TypeDef * SPIx); void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data); void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data); void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data); uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
void SPI_INTRXFullClr(SPI_TypeDef *SPIx);
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx);
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx);
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空如果不空则可以继续SPI_Read() void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满如果不满则可以继续SPI_Write() void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //发送FIFO是否空 void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx);
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx); void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx); void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx);
void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx); uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx); void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
void SPI_INTRXFullEn(SPI_TypeDef * SPIx); void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
void SPI_INTRXFullDis(SPI_TypeDef * SPIx); void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
void SPI_INTRXFullClr(SPI_TypeDef * SPIx); uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx);
void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx);
void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx);
void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx);
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx);
void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx);
void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx);
void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx);
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx);
void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx);
void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx);
void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx);
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx);
void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx);
void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx);
void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx);
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx);
void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx);
void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx);
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx);
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx);
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx);
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
#endif //__SWM320_SPI_H__ #endif //__SWM320_SPI_H__

View File

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

View File

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

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_timr.h" #include "SWM320_timr.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : TIMR_Init() * : TIMR_Init()
* : TIMR定时器/ * : TIMR定时器/
@ -32,7 +31,7 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en) void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
{ {
SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
@ -43,14 +42,15 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
TIMRx->LDVAL = period; TIMRx->LDVAL = period;
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志 TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志
TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk; TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
if(int_en) NVIC_EnableIRQ(TIMR0_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR0_IRQn);
break; break;
case ((uint32_t)TIMR1): 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 &= ~TIMRG_IE_TIMR1_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
if(int_en) NVIC_EnableIRQ(TIMR1_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR1_IRQn);
break; break;
case ((uint32_t)TIMR2): 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 &= ~TIMRG_IE_TIMR2_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
if(int_en) NVIC_EnableIRQ(TIMR2_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR2_IRQn);
break; break;
case ((uint32_t)TIMR3): 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 &= ~TIMRG_IE_TIMR3_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
if(int_en) NVIC_EnableIRQ(TIMR3_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR3_IRQn);
break; break;
case ((uint32_t)TIMR4): 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 &= ~TIMRG_IE_TIMR4_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
if(int_en) NVIC_EnableIRQ(TIMR4_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR4_IRQn);
break; break;
case ((uint32_t)TIMR5): 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 &= ~TIMRG_IE_TIMR5_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos); TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
if(int_en) NVIC_EnableIRQ(TIMR5_IRQn); if (int_en)
NVIC_EnableIRQ(TIMR5_IRQn);
break; break;
} }
} }
@ -102,7 +107,7 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_Start(TIMR_TypeDef * TIMRx) void TIMR_Start(TIMR_TypeDef *TIMRx)
{ {
TIMRx->CTRL |= TIMR_CTRL_EN_Msk; TIMRx->CTRL |= TIMR_CTRL_EN_Msk;
} }
@ -114,7 +119,7 @@ void TIMR_Start(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_Stop(TIMR_TypeDef * TIMRx) void TIMR_Stop(TIMR_TypeDef *TIMRx)
{ {
TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk; TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk;
} }
@ -126,9 +131,9 @@ void TIMR_Stop(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_Halt(TIMR_TypeDef * TIMRx) void TIMR_Halt(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos); TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos);
@ -163,9 +168,9 @@ void TIMR_Halt(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_Resume(TIMR_TypeDef * TIMRx) void TIMR_Resume(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos); TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos);
@ -201,7 +206,7 @@ void TIMR_Resume(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period) void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
{ {
TIMRx->LDVAL = period; TIMRx->LDVAL = period;
} }
@ -213,7 +218,7 @@ void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
* : uint32_t / * : uint32_t /
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx) uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
{ {
return TIMRx->LDVAL; return TIMRx->LDVAL;
} }
@ -225,7 +230,7 @@ uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
* : uint32_t * : uint32_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx) uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
{ {
return TIMRx->CVAL; return TIMRx->CVAL;
} }
@ -237,9 +242,9 @@ uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_INTEn(TIMR_TypeDef * TIMRx) void TIMR_INTEn(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos); TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos);
@ -280,9 +285,9 @@ void TIMR_INTEn(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_INTDis(TIMR_TypeDef * TIMRx) void TIMR_INTDis(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos); TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos);
@ -317,9 +322,9 @@ void TIMR_INTDis(TIMR_TypeDef * TIMRx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void TIMR_INTClr(TIMR_TypeDef * TIMRx) void TIMR_INTClr(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos); TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos);
@ -354,9 +359,9 @@ void TIMR_INTClr(TIMR_TypeDef * TIMRx)
* : uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断 * : uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx) uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
{ {
switch((uint32_t)TIMRx) switch ((uint32_t)TIMRx)
{ {
case ((uint32_t)TIMR0): case ((uint32_t)TIMR0):
return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0; return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0;
@ -380,7 +385,6 @@ uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
return 0; return 0;
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : Pulse_Init() * : Pulse_Init()
* : * :
@ -399,7 +403,8 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en)
TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志 TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
if(int_en) NVIC_EnableIRQ(PULSE_IRQn); if (int_en)
NVIC_EnableIRQ(PULSE_IRQn);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -423,7 +428,7 @@ void Pulse_Start(void)
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t Pulse_Done(void) uint32_t Pulse_Done(void)
{ {
if(TIMRG->IF & TIMRG_IF_PULSE_Msk) if (TIMRG->IF & TIMRG_IF_PULSE_Msk)
{ {
TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志 TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志

View File

@ -4,22 +4,20 @@
#define TIMR_MODE_TIMER 0 #define TIMR_MODE_TIMER 0
#define TIMR_MODE_COUNTER 1 #define TIMR_MODE_COUNTER 1
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化 void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
void TIMR_Start(TIMR_TypeDef * TIMRx); //启动定时器,从初始值开始计时/计数 void TIMR_Start(TIMR_TypeDef *TIMRx); //启动定时器,从初始值开始计时/计数
void TIMR_Stop(TIMR_TypeDef * TIMRx); //停止定时器 void TIMR_Stop(TIMR_TypeDef *TIMRx); //停止定时器
void TIMR_Halt(TIMR_TypeDef * TIMRx); //暂停定时器,计数值保持不变 void TIMR_Halt(TIMR_TypeDef *TIMRx); //暂停定时器,计数值保持不变
void TIMR_Resume(TIMR_TypeDef * TIMRx); //恢复定时器,从暂停处继续计数 void TIMR_Resume(TIMR_TypeDef *TIMRx); //恢复定时器,从暂停处继续计数
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period); //设置定时/计数周期
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx); //获取定时/计数周期
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx); //获取当前计数值
void TIMR_INTEn(TIMR_TypeDef * TIMRx); //使能中断
void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
void TIMR_INTClr(TIMR_TypeDef * TIMRx); //清除中断标志
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx); //获取中断状态
void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period); //设置定时/计数周期
uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx); //获取定时/计数周期
uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx); //获取当前计数值
void TIMR_INTEn(TIMR_TypeDef *TIMRx); //使能中断
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_LOW 0
#define PULSE_HIGH 1 #define PULSE_HIGH 1
@ -28,5 +26,4 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en);
void Pulse_Start(void); void Pulse_Start(void);
uint32_t Pulse_Done(void); uint32_t Pulse_Done(void);
#endif //__SWM320_TIMR_H__ #endif //__SWM320_TIMR_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_uart.h" #include "SWM320_uart.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : UART_Init() * : UART_Init()
* : UART串口初始化 * : UART串口初始化
@ -30,9 +29,9 @@
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct) void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
{ {
switch((uint32_t)UARTx) switch ((uint32_t)UARTx)
{ {
case ((uint32_t)UART0): case ((uint32_t)UART0):
SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos);
@ -55,7 +54,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
UARTx->BAUD &= ~UART_BAUD_BAUD_Msk; UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
UARTx->BAUD |= ((SystemCoreClock/16/initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos); UARTx->BAUD |= ((SystemCoreClock / 16 / initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk); UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) | UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
@ -65,12 +64,20 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
/* 在SWM320中当 RXLVL >= RXTHR 时触发中断如果RXTHR设置为0的话在未接收到数据时就会一直触发中断 /* 在SWM320中当 RXLVL >= RXTHR 时触发中断如果RXTHR设置为0的话在未接收到数据时就会一直触发中断
RXLVL > RXTHR SWM320中RXTHR不能为0的问题APIRXTHR设置值加一 RXLVL > RXTHR SWM320中RXTHR不能为0的问题APIRXTHR设置值加一
*/ */
switch((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR switch ((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
{ {
case ((uint32_t)UART0): NVIC_DisableIRQ(UART0_IRQn); break; case ((uint32_t)UART0):
case ((uint32_t)UART1): NVIC_DisableIRQ(UART1_IRQn); break; NVIC_DisableIRQ(UART0_IRQn);
case ((uint32_t)UART2): NVIC_DisableIRQ(UART2_IRQn); break; break;
case ((uint32_t)UART3): NVIC_DisableIRQ(UART3_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 &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) | UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
@ -84,10 +91,10 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
(initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) | (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
(initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos); (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
switch((uint32_t)UARTx) switch ((uint32_t)UARTx)
{ {
case ((uint32_t)UART0): case ((uint32_t)UART0):
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn) if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
{ {
NVIC_EnableIRQ(UART0_IRQn); NVIC_EnableIRQ(UART0_IRQn);
} }
@ -98,7 +105,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
break; break;
case ((uint32_t)UART1): case ((uint32_t)UART1):
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn) if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
{ {
NVIC_EnableIRQ(UART1_IRQn); NVIC_EnableIRQ(UART1_IRQn);
} }
@ -109,7 +116,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
break; break;
case ((uint32_t)UART2): case ((uint32_t)UART2):
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn) if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
{ {
NVIC_EnableIRQ(UART2_IRQn); NVIC_EnableIRQ(UART2_IRQn);
} }
@ -120,7 +127,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
break; break;
case ((uint32_t)UART3): case ((uint32_t)UART3):
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn) if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
{ {
NVIC_EnableIRQ(UART3_IRQn); NVIC_EnableIRQ(UART3_IRQn);
} }
@ -139,7 +146,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_Open(UART_TypeDef * UARTx) void UART_Open(UART_TypeDef *UARTx)
{ {
UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
} }
@ -151,7 +158,7 @@ void UART_Open(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_Close(UART_TypeDef * UARTx) void UART_Close(UART_TypeDef *UARTx)
{ {
UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos); UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
} }
@ -164,7 +171,7 @@ void UART_Close(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data) void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data)
{ {
UARTx->DATA = data; UARTx->DATA = data;
} }
@ -177,13 +184,14 @@ void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data)
* : uint32_t 0 UART_ERR_PARITY * : uint32_t 0 UART_ERR_PARITY
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data) uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
{ {
uint32_t reg = UARTx->DATA; uint32_t reg = UARTx->DATA;
*data = (reg & UART_DATA_DATA_Msk); *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; return 0;
} }
@ -195,7 +203,7 @@ uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
* : uint32_t 1 UART正在发送数据 0 * : uint32_t 1 UART正在发送数据 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx) uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
{ {
return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1; return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
} }
@ -207,7 +215,7 @@ uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
* : uint32_t 1 FIFO空 0 FIFO非空 * : uint32_t 1 FIFO空 0 FIFO非空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx) uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
{ {
return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1; return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
} }
@ -219,7 +227,7 @@ uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
* : uint32_t 1 FIFO满 0 FIFO不满 * : uint32_t 1 FIFO满 0 FIFO不满
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx) uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
{ {
return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0; return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
} }
@ -232,10 +240,10 @@ uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
* : * :
* : 使UART_Close() * : 使UART_Close()
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate) void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
{ {
UARTx->BAUD &= ~UART_BAUD_BAUD_Msk; UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
UARTx->BAUD |= ((SystemCoreClock/16/baudrate - 1) << UART_BAUD_BAUD_Pos); UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate - 1) << UART_BAUD_BAUD_Pos);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -245,9 +253,9 @@ void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
* : uint32_t * : uint32_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx) uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
{ {
return SystemCoreClock/16/(((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1); return SystemCoreClock / 16 / (((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
} }
/****************************************************************************************************************************************** /******************************************************************************************************************************************
@ -259,7 +267,7 @@ uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity) void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
{ {
UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk); UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) | UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
@ -273,7 +281,7 @@ void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
* : uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平 * : uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_CTSLineState(UART_TypeDef * UARTx) uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
{ {
return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0; return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
} }
@ -288,7 +296,7 @@ uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold) void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
{ {
UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk); UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) | UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
@ -303,7 +311,7 @@ void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, ui
* : uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平 * : uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_RTSLineState(UART_TypeDef * UARTx) uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
{ {
return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0; return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
} }
@ -317,7 +325,7 @@ uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn) void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
{ {
UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk); UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) | UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
@ -331,7 +339,7 @@ void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generat
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_LINGenerate(UART_TypeDef * UARTx) void UART_LINGenerate(UART_TypeDef *UARTx)
{ {
UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos); UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
} }
@ -343,7 +351,7 @@ void UART_LINGenerate(UART_TypeDef * UARTx)
* : uint32_t 1 LIN Break 0 LIN Break * : uint32_t 1 LIN Break 0 LIN Break
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_LINIsDetected(UART_TypeDef * UARTx) uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
{ {
return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0; return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
} }
@ -355,7 +363,7 @@ uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
* : uint32_t 1 LIN Break 0 LIN Break发送未完成 * : uint32_t 1 LIN Break 0 LIN Break发送未完成
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx) uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
{ {
return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0; return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
} }
@ -370,15 +378,21 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar) void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
{ {
uint32_t bits; uint32_t bits;
if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0; if ((detectChar == 0xFF) || (detectChar == 0x1FF))
else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1; bits = 0;
else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2; else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3; bits = 1;
else while(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 &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) | UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
@ -392,13 +406,13 @@ void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
* : uint32_t 0 UART_ABR_RES_OK UART_ABR_RES_ERR * : uint32_t 0 UART_ABR_RES_OK UART_ABR_RES_ERR
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_ABRIsDone(UART_TypeDef * UARTx) uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
{ {
if(UARTx->BAUD & UART_BAUD_ABREN_Msk) if (UARTx->BAUD & UART_BAUD_ABREN_Msk)
{ {
return 0; return 0;
} }
else if(UARTx->BAUD & UART_BAUD_ABRERR_Msk) else if (UARTx->BAUD & UART_BAUD_ABRERR_Msk)
{ {
return UART_ABR_RES_ERR; return UART_ABR_RES_ERR;
} }
@ -415,7 +429,7 @@ uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTRXThresholdEn(UART_TypeDef * UARTx) void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
{ {
UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
} }
@ -427,7 +441,7 @@ void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTRXThresholdDis(UART_TypeDef * UARTx) void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
{ {
UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos); UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
} }
@ -439,7 +453,7 @@ void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
* : uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold * : uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
* : RXIF = RXTHRF & RXIE * : RXIF = RXTHRF & RXIE
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx) uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
{ {
return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0; return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
} }
@ -451,7 +465,7 @@ uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTXThresholdEn(UART_TypeDef * UARTx) void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
{ {
UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
} }
@ -463,7 +477,7 @@ void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTXThresholdDis(UART_TypeDef * UARTx) void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
{ {
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos); UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
} }
@ -475,7 +489,7 @@ void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
* : uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold * : uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
* : TXIF = TXTHRF & TXIE * : TXIF = TXTHRF & TXIE
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx) uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
{ {
return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0; return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
} }
@ -487,7 +501,7 @@ uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTimeoutEn(UART_TypeDef * UARTx) void UART_INTTimeoutEn(UART_TypeDef *UARTx)
{ {
UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
} }
@ -499,7 +513,7 @@ void UART_INTTimeoutEn(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTimeoutDis(UART_TypeDef * UARTx) void UART_INTTimeoutDis(UART_TypeDef *UARTx)
{ {
UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos); UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
} }
@ -511,7 +525,7 @@ void UART_INTTimeoutDis(UART_TypeDef * UARTx)
* : uint32_t 1 0 * : uint32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx) uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
{ {
return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0; return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
} }
@ -523,7 +537,7 @@ uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTXDoneEn(UART_TypeDef * UARTx) void UART_INTTXDoneEn(UART_TypeDef *UARTx)
{ {
UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos); UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
} }
@ -535,7 +549,7 @@ void UART_INTTXDoneEn(UART_TypeDef * UARTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void UART_INTTXDoneDis(UART_TypeDef * UARTx) void UART_INTTXDoneDis(UART_TypeDef *UARTx)
{ {
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos); UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
} }
@ -547,7 +561,7 @@ void UART_INTTXDoneDis(UART_TypeDef * UARTx)
* : uint32_t 1 FIFO空且发送移位寄存器空 0 FIFO或发送移位寄存器未空 * : uint32_t 1 FIFO空且发送移位寄存器空 0 FIFO或发送移位寄存器未空
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx) uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
{ {
return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0; return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
} }

View File

@ -1,7 +1,8 @@
#ifndef __SWM320_UART_H__ #ifndef __SWM320_UART_H__
#define __SWM320_UART_H__ #define __SWM320_UART_H__
typedef struct { typedef struct
{
uint32_t Baudrate; uint32_t Baudrate;
uint8_t DataBits; //数据位位数可取值UART_DATA_8BIT、UART_DATA_9BIT uint8_t DataBits; //数据位位数可取值UART_DATA_8BIT、UART_DATA_9BIT
@ -20,7 +21,6 @@ typedef struct {
uint8_t TimeoutIEn; //超时中断RX FIFO非空且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断 uint8_t TimeoutIEn; //超时中断RX FIFO非空且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
} UART_InitStructure; } UART_InitStructure;
#define UART_DATA_8BIT 0 #define UART_DATA_8BIT 0
#define UART_DATA_9BIT 1 #define UART_DATA_9BIT 1
@ -45,50 +45,46 @@ typedef struct {
#define UART_ERR_PARITY 2 #define UART_ERR_PARITY 2
#define UART_ERR_NOISE 3 #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);
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART串口初始化 void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data); //发送一个字节数据
void UART_Open(UART_TypeDef * UARTx); uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data); //读取一个字节数据并指出数据是否Valid
void UART_Close(UART_TypeDef * UARTx);
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //发送一个字节数据 uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //读取一个字节数据并指出数据是否Valid uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空如果不空则可以继续UART_ReadByte()
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满如果不满则可以继续UART_WriteByte()
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx); void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //接收FIFO是否空如果不空则可以继续UART_ReadByte() uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //发送FIFO是否满如果不满则可以继续UART_WriteByte()
void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //设置波特率 void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //获取当前使用的波特率 uint32_t UART_RTSLineState(UART_TypeDef *UARTx);
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity); void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
uint32_t UART_CTSLineState(UART_TypeDef * UARTx); void UART_LINGenerate(UART_TypeDef *UARTx);
uint32_t UART_LINIsDetected(UART_TypeDef *UARTx);
uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx);
void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold); void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
uint32_t UART_RTSLineState(UART_TypeDef * UARTx); uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn); void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
void UART_LINGenerate(UART_TypeDef * UARTx); void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
uint32_t UART_LINIsDetected(UART_TypeDef * UARTx); uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx); void UART_INTTXThresholdEn(UART_TypeDef *UARTx);
void UART_INTTXThresholdDis(UART_TypeDef *UARTx);
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar); uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx);
uint32_t UART_ABRIsDone(UART_TypeDef * UARTx); void UART_INTTimeoutEn(UART_TypeDef *UARTx);
void UART_INTTimeoutDis(UART_TypeDef *UARTx);
uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx);
void UART_INTRXThresholdEn(UART_TypeDef * UARTx);
void UART_INTRXThresholdDis(UART_TypeDef * UARTx);
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx);
void UART_INTTXThresholdEn(UART_TypeDef * UARTx);
void UART_INTTXThresholdDis(UART_TypeDef * UARTx);
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx);
void UART_INTTimeoutEn(UART_TypeDef * UARTx);
void UART_INTTimeoutDis(UART_TypeDef * UARTx);
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx);
void UART_INTTXDoneEn(UART_TypeDef * UARTx);
void UART_INTTXDoneDis(UART_TypeDef * UARTx);
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx);
void UART_INTTXDoneEn(UART_TypeDef *UARTx);
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
#endif //__SWM320_UART_H__ #endif //__SWM320_UART_H__

View File

@ -21,7 +21,6 @@
#include "SWM320.h" #include "SWM320.h"
#include "SWM320_wdt.h" #include "SWM320_wdt.h"
/****************************************************************************************************************************************** /******************************************************************************************************************************************
* : WDT_Init() * : WDT_Init()
* : WDT看门狗初始化 * : WDT看门狗初始化
@ -31,7 +30,7 @@
* : * :
* : 使 * : 使
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode) void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
{ {
SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos); SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
@ -39,7 +38,7 @@ void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
WDTx->LOAD = peroid; WDTx->LOAD = peroid;
if(mode == WDT_MODE_RESET) if (mode == WDT_MODE_RESET)
{ {
NVIC_DisableIRQ(WDT_IRQn); NVIC_DisableIRQ(WDT_IRQn);
@ -60,7 +59,7 @@ void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void WDT_Start(WDT_TypeDef * WDTx) void WDT_Start(WDT_TypeDef *WDTx)
{ {
WDTx->CR |= (0x01 << WDT_CR_EN_Pos); WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
} }
@ -72,7 +71,7 @@ void WDT_Start(WDT_TypeDef * WDTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void WDT_Stop(WDT_TypeDef * WDTx) void WDT_Stop(WDT_TypeDef *WDTx)
{ {
WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos); WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
} }
@ -84,7 +83,7 @@ void WDT_Stop(WDT_TypeDef * WDTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void WDT_Feed(WDT_TypeDef * WDTx) void WDT_Feed(WDT_TypeDef *WDTx)
{ {
WDTx->FEED = 0x55; WDTx->FEED = 0x55;
} }
@ -96,7 +95,7 @@ void WDT_Feed(WDT_TypeDef * WDTx)
* : int32_t * : int32_t
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
int32_t WDT_GetValue(WDT_TypeDef * WDTx) int32_t WDT_GetValue(WDT_TypeDef *WDTx)
{ {
return WDTx->VALUE; return WDTx->VALUE;
} }
@ -108,7 +107,7 @@ int32_t WDT_GetValue(WDT_TypeDef * WDTx)
* : * :
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
void WDT_INTClr(WDT_TypeDef * WDTx) void WDT_INTClr(WDT_TypeDef *WDTx)
{ {
WDTx->IF = 1; WDTx->IF = 1;
} }
@ -120,7 +119,7 @@ void WDT_INTClr(WDT_TypeDef * WDTx)
* : int32_t 1 0 * : int32_t 1 0
* : * :
******************************************************************************************************************************************/ ******************************************************************************************************************************************/
uint32_t WDT_INTStat(WDT_TypeDef * WDTx) uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
{ {
return WDTx->IF; return WDTx->IF;
} }

View File

@ -4,16 +4,15 @@
#define WDT_MODE_RESET 0 #define WDT_MODE_RESET 0
#define WDT_MODE_INTERRUPT 1 #define WDT_MODE_INTERRUPT 1
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化 void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
void WDT_Start(WDT_TypeDef * WDTx); //启动指定WDT开始倒计时 void WDT_Start(WDT_TypeDef *WDTx); //启动指定WDT开始倒计时
void WDT_Stop(WDT_TypeDef * WDTx); //关闭指定WDT停止倒计时 void WDT_Stop(WDT_TypeDef *WDTx); //关闭指定WDT停止倒计时
void WDT_Feed(WDT_TypeDef * WDTx); //喂狗,重新从装载值开始倒计时 void WDT_Feed(WDT_TypeDef *WDTx); //喂狗,重新从装载值开始倒计时
int32_t WDT_GetValue(WDT_TypeDef * WDTx); //获取指定看门狗定时器的当前倒计时值 int32_t WDT_GetValue(WDT_TypeDef *WDTx); //获取指定看门狗定时器的当前倒计时值
void WDT_INTClr(WDT_TypeDef *WDTx); //中断标志清除
void WDT_INTClr(WDT_TypeDef * WDTx); //中断标志清除 uint32_t WDT_INTStat(WDT_TypeDef *WDTx); //中断状态查询
uint32_t WDT_INTStat(WDT_TypeDef * WDTx); //中断状态查询
#endif //__SWM320_WDT_H__ #endif //__SWM320_WDT_H__