mirror of https://github.com/RT-Thread/rt-thread
format utf-8
This commit is contained in:
parent
c00300d5f4
commit
2c05296948
|
@ -108,11 +108,11 @@ typedef enum IRQn
|
||||||
#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;
|
||||||
|
@ -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,读取数据后自动清零
|
||||||
|
@ -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 2位,通过测起始位加1位数据位脉宽计算波特率,要求发送端发送0xFE \
|
||||||
// 1 4位,通过测起始位加3位数据位脉宽计算波特率,要求发送端发送0xF8
|
// 1 4位,通过测起始位加3位数据位脉宽计算波特率,要求发送端发送0xF8 \
|
||||||
// 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 Error,0 自动波特率校准成功 1 自动波特率校准失败
|
#define UART_BAUD_ABRERR_Pos 26 //Auto Baudrate Error,0 自动波特率校准成功 1 自动波特率校准失败
|
||||||
|
@ -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 Complete,WTC置位时若TX FIFO是空的,则FTC置位
|
#define SPI_IF_FTC_Pos 9 //Frame Transmit Complete,WTC置位时若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
|
||||||
|
@ -2259,10 +2237,8 @@ typedef struct {
|
||||||
#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, 验收屏蔽寄存器;对应位写0,ID必须和验收寄存器匹配
|
__IO uint32_t AMR[4]; //Acceptance Mask Register, 验收屏蔽寄存器;对应位写0,ID必须和验收寄存器匹配
|
||||||
|
@ -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 Format,0 标准帧格式 1 扩展帧格式
|
#define CAN_INFO_FF_Pos 7 //Frame Format,0 标准帧格式 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,7 +3130,6 @@ 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)
|
||||||
|
|
||||||
|
@ -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为2;cycles=7,则n为8;以此类推
|
//cycles=0时,不进行微调整;cycles=1,则n为2;cycles=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,7 +3476,6 @@ typedef struct {
|
||||||
|
|
||||||
#define CAN_BASE (APB_BASE + 0x20000)
|
#define CAN_BASE (APB_BASE + 0x20000)
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* Peripheral declaration */
|
/* Peripheral declaration */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
@ -3596,11 +3542,8 @@ typedef struct {
|
||||||
|
|
||||||
#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"
|
||||||
#include "SWM320_exti.h"
|
#include "SWM320_exti.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__
|
||||||
|
|
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -254,7 +252,8 @@ void PLLInit(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->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
|
SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
|
||||||
}
|
}
|
||||||
|
@ -262,7 +261,8 @@ void PLLInit(void)
|
||||||
{
|
{
|
||||||
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
|
||||||
}
|
}
|
||||||
|
@ -276,5 +276,6 @@ void PLLInit(void)
|
||||||
|
|
||||||
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
|
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
|
||||||
|
|
||||||
while(SYS->PLLLOCK == 0); //等待PLL锁定
|
while (SYS->PLLLOCK == 0)
|
||||||
|
; //等待PLL锁定
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,20 +2,17 @@
|
||||||
#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 SystemCoreClock; // System Clock Frequency (Core Clock)
|
||||||
extern uint32_t CyclesPerUs; // Cycles per micro second
|
extern uint32_t CyclesPerUs; // Cycles per micro second
|
||||||
|
|
||||||
|
|
||||||
extern void SystemInit(void);
|
extern void SystemInit(void);
|
||||||
|
|
||||||
extern void SystemCoreClockUpdate(void);
|
extern void SystemCoreClockUpdate(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void switchCLK_20MHz(void);
|
extern void switchCLK_20MHz(void);
|
||||||
extern void switchCLK_40MHz(void);
|
extern void switchCLK_40MHz(void);
|
||||||
extern void switchCLK_32KHz(void);
|
extern void switchCLK_32KHz(void);
|
||||||
|
@ -24,7 +21,6 @@ extern void switchCLK_PLL(void);
|
||||||
|
|
||||||
extern void PLLInit(void);
|
extern void PLLInit(void);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_adc.h"
|
#include "SWM320_adc.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: ADC_Init()
|
* 函数名称: ADC_Init()
|
||||||
* 功能说明: ADC模数转换器初始化
|
* 功能说明: ADC模数转换器初始化
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -206,14 +206,30 @@ static uint32_t chn2idx(uint32_t chn)
|
||||||
|
|
||||||
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;
|
||||||
|
@ -268,7 +284,6 @@ void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
|
||||||
ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
|
ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: ADC_IntEOCEn()
|
* 函数名称: ADC_IntEOCEn()
|
||||||
* 功能说明: 转换完成中断使能
|
* 功能说明: 转换完成中断使能
|
||||||
|
|
|
@ -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,7 +43,6 @@ 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_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
|
||||||
void ADC_Open(ADC_TypeDef *ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
|
void ADC_Open(ADC_TypeDef *ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
|
||||||
void ADC_Close(ADC_TypeDef *ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
|
void ADC_Close(ADC_TypeDef *ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
|
||||||
|
@ -54,7 +54,6 @@ uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End O
|
||||||
|
|
||||||
void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns);
|
void ADC_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); //转换完成中断使能
|
||||||
void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断禁止
|
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); //转换完成中断标志清除
|
||||||
|
@ -75,5 +74,4 @@ void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断禁止
|
||||||
void ADC_IntFULLClr(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满中断状态
|
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
|
||||||
|
|
||||||
|
|
||||||
#endif //__SWM320_ADC_H__
|
#endif //__SWM320_ADC_H__
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -21,14 +21,13 @@
|
||||||
#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)
|
||||||
{
|
{
|
||||||
|
@ -39,7 +38,7 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
||||||
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) |
|
||||||
|
@ -62,7 +61,7 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
||||||
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) |
|
||||||
|
@ -86,40 +85,40 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -174,14 +173,14 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -217,12 +216,12 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -255,11 +254,11 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -267,11 +266,11 @@ uint32_t CAN_TXComplete(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -279,11 +278,11 @@ uint32_t CAN_TXSuccess(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -291,11 +290,11 @@ void CAN_AbortTransmit(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -303,11 +302,11 @@ uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -315,15 +314,15 @@ uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
|
* uint32_t CAN_BS1 CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
|
||||||
* uint32_t CAN_BS2 CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
|
* uint32_t CAN_BS2 CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
|
||||||
* uint32_t CAN_SJW CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
|
* uint32_t CAN_SJW CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_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)
|
||||||
{
|
{
|
||||||
|
@ -336,13 +335,13 @@ void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, ui
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: CAN_SetFilter32b()
|
* 函数名称: CAN_SetFilter32b()
|
||||||
* 功能说明: 设置接收滤波器,1个32位滤波器
|
* 功能说明: 设置接收滤波器,1个32位滤波器
|
||||||
* 输 入: 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)
|
||||||
{
|
{
|
||||||
|
@ -361,15 +360,15 @@ void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: CAN_SetFilter16b()
|
* 函数名称: CAN_SetFilter16b()
|
||||||
* 功能说明: 设置接收滤波器,2个16位滤波器
|
* 功能说明: 设置接收滤波器,2个16位滤波器
|
||||||
* 输 入: 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)
|
||||||
{
|
{
|
||||||
|
@ -388,11 +387,11 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -400,11 +399,11 @@ void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -412,11 +411,11 @@ void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -424,11 +423,11 @@ void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -436,11 +435,11 @@ void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -448,11 +447,11 @@ void CAN_INTErrWarningEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -460,11 +459,11 @@ void CAN_INTErrWarningDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -472,11 +471,11 @@ void CAN_INTRXOverflowEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -484,11 +483,11 @@ void CAN_INTRXOverflowDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -496,11 +495,11 @@ void CAN_INTRXOverflowClear(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -508,11 +507,11 @@ void CAN_INTWakeupEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -520,11 +519,11 @@ void CAN_INTWakeupDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -532,11 +531,11 @@ void CAN_INTErrPassiveEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -544,11 +543,11 @@ void CAN_INTErrPassiveDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -556,11 +555,11 @@ void CAN_INTArbitrLostEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -568,11 +567,11 @@ void CAN_INTArbitrLostDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -580,11 +579,11 @@ void CAN_INTBusErrorEn(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
@ -592,11 +591,11 @@ void CAN_INTBusErrorDis(CAN_TypeDef * CANx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,7 +83,6 @@ 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_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
|
||||||
void CAN_Open(CAN_TypeDef *CANx);
|
void CAN_Open(CAN_TypeDef *CANx);
|
||||||
void CAN_Close(CAN_TypeDef *CANx);
|
void CAN_Close(CAN_TypeDef *CANx);
|
||||||
|
@ -99,7 +104,6 @@ void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, ui
|
||||||
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
|
void CAN_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_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
|
||||||
|
|
||||||
|
|
||||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
|
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
|
||||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
|
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
|
||||||
|
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -21,17 +21,16 @@
|
||||||
#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_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
|
* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,17 +1,14 @@
|
||||||
#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()
|
||||||
* 功能说明: CRC写入数据
|
* 功能说明: CRC写入数据
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -22,23 +22,23 @@
|
||||||
#include "SWM320_dma.h"
|
#include "SWM320_dma.h"
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: DMA_CHM_Config()
|
* 函数名称: DMA_CHM_Config()
|
||||||
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||||
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
||||||
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
||||||
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
||||||
* 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;
|
||||||
|
@ -50,10 +50,12 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
|
||||||
(dst_addr_incr << DMA_AM_DSTAM_Pos) |
|
(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)
|
||||||
{
|
{
|
||||||
|
@ -61,16 +63,16 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: DMA_CH_Open()
|
* 函数名称: DMA_CH_Open()
|
||||||
* 功能说明: DMA通道打开
|
* 功能说明: DMA通道打开
|
||||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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_CH0、DMA_CH1、DMA_CH2
|
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
|
@ -21,57 +21,57 @@
|
||||||
#include "SWM320_exti.h"
|
#include "SWM320_exti.h"
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: EXTI_Init()
|
* 函数名称: EXTI_Init()
|
||||||
* 功能说明: 指定引脚外部中断初始化
|
* 功能说明: 指定引脚外部中断初始化
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
|
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(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端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
|
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -79,12 +79,12 @@ void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: EXTI_Close()
|
* 函数名称: EXTI_Close()
|
||||||
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
|
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -92,12 +92,12 @@ void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: EXTI_State()
|
* 函数名称: EXTI_State()
|
||||||
* 功能说明: 指定引脚是否触发了中断
|
* 功能说明: 指定引脚是否触发了中断
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 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)
|
||||||
{
|
{
|
||||||
|
@ -105,12 +105,12 @@ uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: EXTI_RawState()
|
* 函数名称: EXTI_RawState()
|
||||||
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 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)
|
||||||
{
|
{
|
||||||
|
@ -118,12 +118,12 @@ uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: EXTI_Clear()
|
* 函数名称: EXTI_Clear()
|
||||||
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
|
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,12 +9,10 @@ uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否
|
||||||
uint32_t EXTI_RawState(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); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
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 //上升沿触发中断
|
||||||
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
|
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
|
||||||
#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__
|
||||||
|
|
|
@ -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擦除
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -21,17 +21,16 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_gpio.h"
|
#include "SWM320_gpio.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_Init()
|
* 函数名称: GPIO_Init()
|
||||||
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
|
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 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 开启下拉
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
|
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -40,7 +39,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
||||||
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);
|
||||||
|
@ -59,7 +58,7 @@ 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);
|
||||||
|
@ -78,7 +77,7 @@ 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);
|
||||||
|
@ -97,7 +96,7 @@ 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);
|
||||||
|
@ -116,7 +115,7 @@ 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);
|
||||||
|
@ -135,7 +134,7 @@ 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);
|
||||||
|
@ -154,12 +153,12 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_SetBit()
|
* 函数名称: GPIO_SetBit()
|
||||||
* 功能说明: 将参数指定的引脚电平置高
|
* 功能说明: 将参数指定的引脚电平置高
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -167,12 +166,12 @@ void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_ClrBit()
|
* 函数名称: GPIO_ClrBit()
|
||||||
* 功能说明: 将参数指定的引脚电平置低
|
* 功能说明: 将参数指定的引脚电平置低
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -180,12 +179,12 @@ void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_InvBit()
|
* 函数名称: GPIO_InvBit()
|
||||||
* 功能说明: 将参数指定的引脚电平反转
|
* 功能说明: 将参数指定的引脚电平反转
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -193,12 +192,12 @@ void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_GetBit()
|
* 函数名称: GPIO_GetBit()
|
||||||
* 功能说明: 读取参数指定的引脚的电平状态
|
* 功能说明: 读取参数指定的引脚的电平状态
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||||
{
|
{
|
||||||
|
@ -206,13 +205,13 @@ uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_SetBits()
|
* 函数名称: GPIO_SetBits()
|
||||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -224,13 +223,13 @@ void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_ClrBits()
|
* 函数名称: GPIO_ClrBits()
|
||||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -242,13 +241,13 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_InvBits()
|
* 函数名称: GPIO_InvBits()
|
||||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -260,14 +259,14 @@ void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_GetBits()
|
* 函数名称: GPIO_GetBits()
|
||||||
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||||
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
|
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
|
||||||
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
|
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+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)
|
||||||
{
|
{
|
||||||
|
@ -279,12 +278,12 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_AtomicSetBit()
|
* 函数名称: GPIO_AtomicSetBit()
|
||||||
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 当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)
|
||||||
{
|
{
|
||||||
|
@ -292,12 +291,12 @@ void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_AtomicClrBit()
|
* 函数名称: GPIO_AtomicClrBit()
|
||||||
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 当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)
|
||||||
{
|
{
|
||||||
|
@ -305,12 +304,12 @@ void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_AtomicInvBit()
|
* 函数名称: GPIO_AtomicInvBit()
|
||||||
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 当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)
|
||||||
{
|
{
|
||||||
|
@ -318,13 +317,13 @@ void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: GPIO_AtomicSetBits()
|
* 函数名称: GPIO_AtomicSetBits()
|
||||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -338,13 +337,13 @@ 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端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -358,13 +357,13 @@ 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端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#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_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
|
||||||
|
@ -20,5 +19,4 @@ void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||||
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||||
void GPIO_AtomicInvBits(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__
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -22,12 +22,12 @@
|
||||||
#include "SWM320_i2c.h"
|
#include "SWM320_i2c.h"
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: I2C_Init()
|
* 函数名称: I2C_Init()
|
||||||
* 功能说明: I2C初始化
|
* 功能说明: I2C初始化
|
||||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
@ -42,13 +42,13 @@ 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);
|
||||||
|
|
||||||
|
@ -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) |
|
||||||
|
@ -126,11 +126,11 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: I2C_Open()
|
* 函数名称: I2C_Open()
|
||||||
* 功能说明: I2C打开,允许收发
|
* 功能说明: I2C打开,允许收发
|
||||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void I2C_Open(I2C_TypeDef *I2Cx)
|
void I2C_Open(I2C_TypeDef *I2Cx)
|
||||||
{
|
{
|
||||||
|
@ -138,11 +138,11 @@ void I2C_Open(I2C_TypeDef * I2Cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: I2C_Close()
|
* 函数名称: I2C_Close()
|
||||||
* 功能说明: I2C关闭,禁止收发
|
* 功能说明: I2C关闭,禁止收发
|
||||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
void I2C_Close(I2C_TypeDef *I2Cx)
|
void I2C_Close(I2C_TypeDef *I2Cx)
|
||||||
{
|
{
|
||||||
|
@ -150,66 +150,70 @@ void I2C_Close(I2C_TypeDef * I2Cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: I2C_Start()
|
* 函数名称: I2C_Start()
|
||||||
* 功能说明: 产生起始信号并发送设备地址
|
* 功能说明: 产生起始信号并发送设备地址
|
||||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 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 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 输 出: 无
|
* 输 出: 无
|
||||||
* 注意事项: 无
|
* 注意事项: 无
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
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 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 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 指定要被设置的I2C,有效值包括I2C0、I2C1
|
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||||
* 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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,7 +18,6 @@ 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_Open(I2C_TypeDef *I2Cx);
|
||||||
|
|
|
@ -54,8 +54,10 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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分频后产生DOCCLK,0 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分频后产生DOCCLK,0 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,7 +58,6 @@ 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_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
|
||||||
void LCD_Start(LCD_TypeDef *LCDx);
|
void LCD_Start(LCD_TypeDef *LCDx);
|
||||||
uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
|
uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
|
||||||
|
@ -69,5 +67,4 @@ void LCD_INTDis(LCD_TypeDef * LCDx);
|
||||||
void LCD_INTClr(LCD_TypeDef *LCDx);
|
void LCD_INTClr(LCD_TypeDef *LCDx);
|
||||||
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
|
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
|
||||||
|
|
||||||
|
|
||||||
#endif //__SWM320_LCD_H__
|
#endif //__SWM320_LCD_H__
|
||||||
|
|
|
@ -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 2017年10月25日
|
* 版本日期: V1.1.0 2017年10月25日
|
||||||
* 升级记录:
|
* 升级记录:
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
|
@ -21,26 +21,28 @@
|
||||||
#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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -72,10 +78,13 @@ 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 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
||||||
******************************************************************************************************************************************/
|
******************************************************************************************************************************************/
|
||||||
uint32_t NORFL_SectorErase(uint32_t addr)
|
uint32_t NORFL_SectorErase(uint32_t addr)
|
||||||
{
|
{
|
||||||
|
@ -97,10 +106,13 @@ uint32_t NORFL_SectorErase(uint32_t addr)
|
||||||
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
|
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)
|
||||||
{
|
{
|
||||||
|
@ -123,10 +135,13 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
|
||||||
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,8 +12,6 @@ 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);
|
||||||
|
@ -20,14 +19,11 @@ 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
|
||||||
|
|
|
@ -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"文件
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_pwm.h"
|
#include "SWM320_pwm.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: PWM_Init()
|
* 函数名称: PWM_Init()
|
||||||
* 功能说明: PWM初始化
|
* 功能说明: PWM初始化
|
||||||
|
@ -288,7 +287,6 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
|
||||||
return deadzone;
|
return deadzone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: PWM_IntNCycleEn()
|
* 函数名称: PWM_IntNCycleEn()
|
||||||
* 功能说明: 新周期开始中断使能
|
* 功能说明: 新周期开始中断使能
|
||||||
|
@ -302,33 +300,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -346,33 +356,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,33 +412,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -436,40 +470,51 @@ uint32_t PWM_IntNCycleStat(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) 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()
|
||||||
* 功能说明: 高电平结束中断使能
|
* 功能说明: 高电平结束中断使能
|
||||||
|
@ -483,33 +528,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -527,33 +584,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -571,33 +640,45 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -617,33 +698,45 @@ uint32_t PWM_IntHEndStat(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) 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,7 +34,6 @@ 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_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct); //PWM初始化
|
||||||
void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始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_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
|
||||||
|
@ -54,5 +54,4 @@ void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中
|
||||||
void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断标志清除
|
void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断标志清除
|
||||||
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断是否发生
|
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断是否发生
|
||||||
|
|
||||||
|
|
||||||
#endif //__SWM320_PWM_H__
|
#endif //__SWM320_PWM_H__
|
||||||
|
|
|
@ -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()
|
||||||
|
@ -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);
|
||||||
|
@ -124,7 +124,8 @@ 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,17 +159,20 @@ 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;
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -48,7 +49,6 @@ 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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
|
@ -57,19 +56,21 @@ 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
|
||||||
{
|
{
|
||||||
|
@ -77,7 +78,8 @@ uint32_t SDIO_Init(uint32_t freq)
|
||||||
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);
|
||||||
|
@ -85,31 +87,28 @@ uint32_t SDIO_Init(uint32_t freq)
|
||||||
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
|
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,8 +175,10 @@ 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)
|
||||||
|
@ -181,13 +186,16 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
|
||||||
|
|
||||||
for (i = 0; i < block_cnt; i++)
|
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,8 +215,10 @@ 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;
|
||||||
|
|
||||||
|
@ -216,7 +226,8 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
|
||||||
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,8 +283,10 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
|
||||||
uint32_t res, i, j;
|
uint32_t 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)
|
||||||
|
@ -276,13 +294,16 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
|
||||||
|
|
||||||
for (i = 0; i < block_cnt; i++)
|
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,8 +323,10 @@ 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;
|
||||||
|
|
||||||
|
@ -311,7 +334,8 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
|
||||||
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -55,17 +55,28 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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颗粒有几个bank,SDRAM_CELLBANK_2、SDRAM_CELLBANK_4
|
uint8_t CellBank; // SDRAM颗粒有几个bank,SDRAM_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,8 +73,6 @@ 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);
|
||||||
|
|
|
@ -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触发设定
|
||||||
|
@ -150,7 +149,8 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
|
||||||
|
|
||||||
SPIx->DATA = data;
|
SPIx->DATA = data;
|
||||||
|
|
||||||
while((SPIx->STAT & SPI_STAT_WTC_Msk) == 0);
|
while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
|
@ -164,7 +164,8 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
|
||||||
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
|
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;
|
||||||
}
|
}
|
||||||
|
@ -205,7 +206,6 @@ 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半满中断使能
|
||||||
|
|
|
@ -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,8 +33,6 @@ 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_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
|
||||||
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开,允许收发
|
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开,允许收发
|
||||||
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭,禁止收发
|
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭,禁止收发
|
||||||
|
@ -47,7 +46,6 @@ uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空,如果不
|
||||||
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
|
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
|
||||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
|
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
|
||||||
|
|
||||||
|
|
||||||
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
|
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
|
||||||
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
|
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
|
||||||
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
|
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
|
||||||
|
@ -79,5 +77,4 @@ void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
|
||||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
|
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
|
||||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
|
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
|
||||||
|
|
||||||
|
|
||||||
#endif //__SWM320_SPI_H__
|
#endif //__SWM320_SPI_H__
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_sram.h"
|
#include "SWM320_sram.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: SRAM_Init()
|
* 函数名称: SRAM_Init()
|
||||||
* 功能说明: SRAM控制器初始化
|
* 功能说明: SRAM控制器初始化
|
||||||
|
@ -34,18 +33,22 @@ 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) |
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_timr.h"
|
#include "SWM320_timr.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: TIMR_Init()
|
* 函数名称: TIMR_Init()
|
||||||
* 功能说明: TIMR定时器/计数器初始化
|
* 功能说明: TIMR定时器/计数器初始化
|
||||||
|
@ -50,7 +49,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
||||||
TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
|
TIMRG->IE &= ~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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
|
|
|
@ -19,8 +19,6 @@ void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
|
||||||
void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
|
void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
|
||||||
uint32_t TIMR_INTStat(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__
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_uart.h"
|
#include "SWM320_uart.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: UART_Init()
|
* 函数名称: UART_Init()
|
||||||
* 功能说明: UART串口初始化
|
* 功能说明: UART串口初始化
|
||||||
|
@ -67,10 +66,18 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
||||||
*/
|
*/
|
||||||
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) |
|
||||||
|
@ -183,7 +190,8 @@ uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * 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;
|
||||||
}
|
}
|
||||||
|
@ -374,11 +382,17 @@ 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) |
|
||||||
|
|
|
@ -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,7 +45,6 @@ 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_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART串口初始化
|
||||||
void UART_Open(UART_TypeDef *UARTx);
|
void UART_Open(UART_TypeDef *UARTx);
|
||||||
void UART_Close(UART_TypeDef *UARTx);
|
void UART_Close(UART_TypeDef *UARTx);
|
||||||
|
@ -57,7 +56,6 @@ uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
|
||||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
||||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
||||||
|
|
||||||
|
|
||||||
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
|
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
|
||||||
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
|
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
|
||||||
|
|
||||||
|
@ -75,7 +73,6 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx);
|
||||||
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
|
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
|
||||||
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
|
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
|
||||||
|
|
||||||
|
|
||||||
void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
|
void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
|
||||||
void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
|
void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
|
||||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
|
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
|
||||||
|
@ -90,5 +87,4 @@ void UART_INTTXDoneEn(UART_TypeDef * UARTx);
|
||||||
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
|
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
|
||||||
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
|
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
|
||||||
|
|
||||||
|
|
||||||
#endif //__SWM320_UART_H__
|
#endif //__SWM320_UART_H__
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "SWM320.h"
|
#include "SWM320.h"
|
||||||
#include "SWM320_wdt.h"
|
#include "SWM320_wdt.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************************************************************************
|
/******************************************************************************************************************************************
|
||||||
* 函数名称: WDT_Init()
|
* 函数名称: WDT_Init()
|
||||||
* 功能说明: WDT看门狗初始化
|
* 功能说明: WDT看门狗初始化
|
||||||
|
|
|
@ -12,7 +12,6 @@ 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); //中断状态查询
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue