提交 22513fe8 编写于 作者: Y yanmowudi

update swm320 libraries

上级 ed900427
/******************************************************************************************************************************************
* 文件名称: system_SWM320.c
* 功能说明: SWM320单片机的时钟设置
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
/******************************************************************************************************************************************
* 件名称: system_SWM320.c
* 功能说明: SWM320单片机的时钟设置
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
* -ECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
*******************************************************************************************************************************************/
#include <stdint.h>
#include "SWM320.h"
/******************************************************************************************************************************************
* 系统时钟设定
* 系统时钟设定
*****************************************************************************************************************************************/
#define SYS_CLK_20MHz 0 //0 内部高频20MHz RC振荡器
#define SYS_CLK_40MHz 1 //1 内部高频40MHz RC振荡器
#define SYS_CLK_32KHz 2 //2 内部低频32KHz RC振荡器
#define SYS_CLK_XTAL 3 //3 外部晶体振荡器(2-30MHz)
#define SYS_CLK_PLL 4 //4 片内锁相环输出
#define SYS_CLK_20MHz 0 //0 内部高频20MHz RC振荡器
#define SYS_CLK_40MHz 1 //1 内部高频40MHz RC振荡器
#define SYS_CLK_32KHz 2 //2 内部低频32KHz RC振荡器
#define SYS_CLK_XTAL 3 //3 外部晶体振荡器(2-30MHz)
#define SYS_CLK_PLL 4 //4 片内锁相环输出
#define SYS_CLK SYS_CLK_PLL
#define SYS_CLK SYS_CLK_PLL
#define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1
#define SYS_CLK_DIV SYS_CLK_DIV_1
#define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1
#define __HSI (20000000UL) //高速内部时钟
#define __LSI (32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
#define SYS_CLK_DIV SYS_CLK_DIV_1
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define PLL_IN_DIV 5
#define __HSI (20000000UL) //高速内部时钟
#define __LSI ( 32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
#define PLL_FB_DIV 60
#define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define PLL_OUT_DIV PLL_OUT_DIV8
#define PLL_IN_DIV 5
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
#define PLL_FB_DIV 60
/******************************************************************************************************************************************
* 函数名称:
* 功能说明: This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
* 输 入:
* 输 出:
* 注意事项:
******************************************************************************************************************************************/
void SystemCoreClockUpdate(void)
{
if (SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK
{
if (SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL
{
SystemCoreClock = __HSE;
}
else //HFCK <= HRC
{
if (SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz
{
SystemCoreClock = __HSI * 2;
}
else //HRC = 20MHz
{
SystemCoreClock = __HSI;
}
}
}
else //SYS_CLK <= LFCK
{
if (SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL
{
if (SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC
{
SystemCoreClock = __HSI;
}
else //PLL_SRC <= XTAL
{
SystemCoreClock = __HSE;
}
SystemCoreClock = SystemCoreClock / PLL_IN_DIV * PLL_FB_DIV * 4 / (2 << (2 - PLL_OUT_DIV));
}
else //LFCK <= LRC
{
SystemCoreClock = __LSI;
}
}
#define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2
if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
SystemCoreClock /= 2;
#define PLL_OUT_DIV PLL_OUT_DIV8
CyclesPerUs = SystemCoreClock / 1000000;
}
/******************************************************************************************************************************************
* 函数名称:
* 功能说明: The necessary initializaiton of systerm
* 输 入:
* 输 出:
* 注意事项:
******************************************************************************************************************************************/
void SystemInit(void)
{
SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
switch (SYS_CLK)
{
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
switchCLK_20MHz();
break;
case SYS_CLK_40MHz: //1 内部高频40MHz RC振荡器
switchCLK_40MHz();
break;
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
case SYS_CLK_32KHz: //2 内部低频32KHz RC振荡器
switchCLK_32KHz();
break;
case SYS_CLK_XTAL: //3 外部晶体振荡器(2-30MHz)
switchCLK_XTAL();
break;
case SYS_CLK_PLL: //4 片内锁相环输出
switchCLK_PLL();
break;
}
SYS->CLKDIV &= ~SYS_CLKDIV_SYS_Msk;
SYS->CLKDIV |= (SYS_CLK_DIV << SYS_CLKDIV_SYS_Pos);
/******************************************************************************************************************************************
* 函数名称:
* 功能说明: This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
* 输 入:
* 输 出:
* 注意事项:
******************************************************************************************************************************************/
void SystemCoreClockUpdate(void)
{
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK
{
if(SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL
{
SystemCoreClock = __HSE;
}
else //HFCK <= HRC
{
if(SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz
{
SystemCoreClock = __HSI*2;
}
else //HRC = 20MHz
{
SystemCoreClock = __HSI;
}
}
}
else //SYS_CLK <= LFCK
{
if(SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL
{
if(SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC
{
SystemCoreClock = __HSI;
}
else //PLL_SRC <= XTAL
{
SystemCoreClock = __HSE;
}
SystemCoreClock = SystemCoreClock / PLL_IN_DIV * PLL_FB_DIV * 4 / (2 << (2 - PLL_OUT_DIV));
}
else //LFCK <= LRC
{
SystemCoreClock = __LSI;
}
}
if(SYS->CLKDIV & SYS_CLKDIV_SYS_Msk) SystemCoreClock /= 2;
CyclesPerUs = SystemCoreClock / 1000000;
}
SystemCoreClockUpdate();
/******************************************************************************************************************************************
* 函数名称:
* 功能说明: The necessary initializaiton of systerm
* 输 入:
* 输 出:
* 注意事项:
******************************************************************************************************************************************/
void SystemInit(void)
{
SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
Flash_Param_at_xMHz(120);
switch(SYS_CLK)
{
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
switchCLK_20MHz();
break;
case SYS_CLK_40MHz: //1 内部高频40MHz RC振荡器
switchCLK_40MHz();
break;
case SYS_CLK_32KHz: //2 内部低频32KHz RC振荡器
switchCLK_32KHz();
break;
case SYS_CLK_XTAL: //3 外部晶体振荡器(2-30MHz)
switchCLK_XTAL();
break;
case SYS_CLK_PLL: //4 片内锁相环输出
switchCLK_PLL();
break;
}
SYS->CLKDIV &= ~SYS_CLKDIV_SYS_Msk;
SYS->CLKDIV |= (SYS_CLK_DIV << SYS_CLKDIV_SYS_Pos);
SystemCoreClockUpdate();
if(SystemCoreClock > 80000000)
{
Flash_Param_at_xMHz(120);
}
else if(SystemCoreClock > 40000000)
{
Flash_Param_at_xMHz(80);
}
else if(SystemCoreClock > 30000000)
{
Flash_Param_at_xMHz(40);
}
else
{
Flash_Param_at_xMHz(30);
}
}
void switchCLK_20MHz(void)
{
uint32_t i;
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
uint32_t i;
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for(i = 0; i < 1000; i++) __NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_40MHz(void)
{
uint32_t i;
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
uint32_t i;
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
for(i = 0; i < 1000; i++) __NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_32KHz(void)
{
uint32_t i;
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
for (i = 0; i < 100; i++)
__NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
uint32_t i;
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
for(i = 0; i < 100; i++) __NOP();
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
}
void switchCLK_XTAL(void)
{
uint32_t i;
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
uint32_t i;
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for(i = 0; i < 1000; i++) __NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_PLL(void)
{
uint32_t i;
PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
for (i = 0; i < 10000; i++)
__NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
uint32_t i;
PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
for(i = 0; i < 10000; i++) __NOP();
SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
}
void PLLInit(void)
{
uint32_t i;
if (SYS_PLL_SRC == SYS_CLK_20MHz)
{
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for (i = 0; i < 1000; i++)
__NOP();
SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
}
else if (SYS_PLL_SRC == SYS_CLK_XTAL)
{
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for (i = 0; i < 20000; i++)
;
SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
}
SYS->PLLDIV &= ~(SYS_PLLDIV_INDIV_Msk |
SYS_PLLDIV_FBDIV_Msk |
SYS_PLLDIV_OUTDIV_Msk);
SYS->PLLDIV |= (PLL_IN_DIV << SYS_PLLDIV_INDIV_Pos) |
(PLL_FB_DIV << SYS_PLLDIV_FBDIV_Pos) |
(PLL_OUT_DIV << SYS_PLLDIV_OUTDIV_Pos);
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
while (SYS->PLLLOCK == 0)
; //等待PLL锁定
uint32_t i;
if(SYS_PLL_SRC == SYS_CLK_20MHz)
{
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
for(i = 0; i < 1000; i++) __NOP();
SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
}
else if(SYS_PLL_SRC == SYS_CLK_XTAL)
{
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for(i = 0; i < 20000; i++);
SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
}
SYS->PLLDIV &= ~(SYS_PLLDIV_INDIV_Msk |
SYS_PLLDIV_FBDIV_Msk |
SYS_PLLDIV_OUTDIV_Msk);
SYS->PLLDIV |= (PLL_IN_DIV << SYS_PLLDIV_INDIV_Pos) |
(PLL_FB_DIV << SYS_PLLDIV_FBDIV_Pos) |
(PLL_OUT_DIV<< SYS_PLLDIV_OUTDIV_Pos);
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
while(SYS->PLLLOCK == 0); //等待PLL锁定
}
......@@ -2,24 +2,28 @@
#define __SYSTEM_SWM320_H__
#ifdef __cplusplus
extern "C"
{
extern "C" {
#endif
extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock)
extern uint32_t CyclesPerUs; // Cycles per micro second
extern void SystemInit(void);
extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock)
extern uint32_t CyclesPerUs; // Cycles per micro second
extern void SystemCoreClockUpdate(void);
extern void switchCLK_20MHz(void);
extern void switchCLK_40MHz(void);
extern void switchCLK_32KHz(void);
extern void switchCLK_XTAL(void);
extern void switchCLK_PLL(void);
extern void SystemInit(void);
extern void SystemCoreClockUpdate (void);
extern void switchCLK_20MHz(void);
extern void switchCLK_40MHz(void);
extern void switchCLK_32KHz(void);
extern void switchCLK_XTAL(void);
extern void switchCLK_PLL(void);
extern void PLLInit(void);
extern void PLLInit(void);
#ifdef __cplusplus
}
......
......@@ -2,18 +2,18 @@
#define __SWM320_ADC_H__
typedef struct {
uint8_t clk_src; //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
uint8_t clk_div; //ADC转换时钟分频,取值1--31
uint8_t pga_ref; //PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
uint8_t channels; //ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t samplAvg; //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
uint8_t trig_src; //ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
uint8_t Continue; //在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
// 0 单次转换模式,转换完成后START位自动清除停止转换
uint8_t EOC_IEn; //EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t OVF_IEn; //OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t HFULL_IEn; //FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t FULL_IEn; //FIFO 满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t clk_src; //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
uint8_t clk_div; //ADC转换时钟分频,取值1--31
uint8_t pga_ref; //PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
uint8_t channels; //ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t samplAvg; //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
uint8_t trig_src; //ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
uint8_t Continue; //在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
// 0 单次转换模式,转换完成后START位自动清除停止转换
uint8_t EOC_IEn; //EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t OVF_IEn; //OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t HFULL_IEn; //FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t FULL_IEn; //FIFO 满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
} ADC_InitStructure;
#define ADC_CH0 0x01
......@@ -31,49 +31,49 @@ typedef struct {
#define ADC_CLKSRC_VCO_DIV64 4
#define ADC_AVG_SAMPLE1 0
#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
#define ADC_AVG_SAMPLE4 3
#define ADC_AVG_SAMPLE8 7
#define ADC_AVG_SAMPLE16 15
#define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
#define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
#define ADC_TRIGSRC_PWM 1
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
#define PGA_REF_EXTERNAL 0 //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) 电平值须与量程相同
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct); //ADC模数转换器初始化
void ADC_Open(ADC_TypeDef * ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
void ADC_Close(ADC_TypeDef * ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
void ADC_Start(ADC_TypeDef * ADCx); //启动指定ADC,开始模数转换
void ADC_Stop(ADC_TypeDef * ADCx); //关闭指定ADC,停止模数转换
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct); //ADC模数转换器初始化
void ADC_Open(ADC_TypeDef * ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
void ADC_Close(ADC_TypeDef * ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
void ADC_Start(ADC_TypeDef * ADCx); //启动指定ADC,开始模数转换
void ADC_Stop(ADC_TypeDef * ADCx); //关闭指定ADC,停止模数转换
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn); //从指定通道读取转换结果
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End Of Conversion
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn); //从指定通道读取转换结果
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End Of Conversion
void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns);
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断使能
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断禁止
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断标志清除
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断状态
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断使能
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断禁止
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断标志清除
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断状态
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断使能
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断禁止
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断标志清除
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断状态
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断使能
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断禁止
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断标志清除
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断状态
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断使能
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断禁止
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断标志清除
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn);//FIFO半满中断状态
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断使能
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断禁止
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断标志清除
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn);//FIFO半满中断状态
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断使能
void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断禁止
void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断标志清除
uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断状态
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断使能
void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断禁止
void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断标志清除
uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断状态
#endif //__SWM320_ADC_H__
......@@ -411,18 +411,6 @@ void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTRXNotEmptyStat()
* 功能说明: RX FIFO非空中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_RXDA_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTTXBufEmptyEn()
* 功能说明: 当TX Buffer空时触发中断使能
......@@ -447,18 +435,6 @@ void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTTXBufEmptyStat()
* 功能说明: TX Buffer空中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_TXBR_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTErrWarningEn()
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
......@@ -483,18 +459,6 @@ void CAN_INTErrWarningDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTErrWarningStat()
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTErrWarningStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_ERRWARN_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTRXOverflowEn()
* 功能说明: RX FIFO 溢出时触发中断使能
......@@ -519,18 +483,6 @@ void CAN_INTRXOverflowDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTRXOverflowStat()
* 功能说明: RX FIFO 溢出中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTRXOverflowStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_RXOV_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTRXOverflowClear()
* 功能说明: RX FIFO 溢出中断清除
......@@ -567,18 +519,6 @@ void CAN_INTWakeupDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTWakeupStat()
* 功能说明: 唤醒事件中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTWakeupStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_WKUP_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTErrPassiveEn()
* 功能说明: TXERR/RXERR计数值达到127时中断使能
......@@ -603,18 +543,6 @@ void CAN_INTErrPassiveDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTErrPassiveStat()
* 功能说明: TXERR/RXERR计数值达到127中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTErrPassiveStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_ERRPASS_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTArbitrLostEn()
* 功能说明: 仲裁失败中断使能
......@@ -639,18 +567,6 @@ void CAN_INTArbitrLostDis(CAN_TypeDef * CANx)
CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTArbitrLostStat()
* 功能说明: 仲裁失败中断是否触发
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t CAN_INTArbitrLostStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_ARBLOST_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTBusErrorEn()
* 功能说明: 总线错误中断使能
......@@ -676,13 +592,13 @@ void CAN_INTBusErrorDis(CAN_TypeDef * CANx)
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTBusErrorStat()
* 功能说明: 总线错误中断是否触发
* 函数名称: CAN_INTStat()
* 功能说明: 查询中断状态
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
* 输 出: uint32_t 1 已触发 0 未触发
* 注意事项:
* 输 出: uint32_t 当前中断状态
* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
******************************************************************************************************************************************/
uint32_t CAN_INTBusErrorStat(CAN_TypeDef * CANx)
uint32_t CAN_INTStat(CAN_TypeDef * CANx)
{
return (CANx->IF & CAN_IF_BUSERR_Msk) ? 1 : 0;
return CANx->IF;
}
......@@ -5,14 +5,14 @@
#define CAN_FRAME_EXT 1
typedef struct {
uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
uint8_t CAN_BS1; //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
uint8_t CAN_BS2; //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t Baudrate; //波特率,即位传输速率,取值1--1000000
uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
uint8_t CAN_BS1; //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
uint8_t CAN_BS2; //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t Baudrate; //波特率,即位传输速率,取值1--1000000
uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
union {
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
struct { // 0 must match 1 don't care
uint16_t FilterMask16b1;
uint16_t FilterMask16b2;
......@@ -25,15 +25,15 @@ typedef struct {
uint16_t FilterCheck16b2;
};
};
uint8_t RXNotEmptyIEn; //接收FIFO非空,有数据可读
uint8_t RXOverflowIEn; //接收FIFO溢出,有数据丢失
uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
uint8_t RXNotEmptyIEn; //接收FIFO非空,有数据可读
uint8_t RXOverflowIEn; //接收FIFO溢出,有数据丢失
uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
} CAN_InitStructure;
#define CAN_MODE_NORMAL 0 //常规模式
#define CAN_MODE_LISTEN 1 //监听模式
#define CAN_MODE_SELFTEST 2 //自测模式
#define CAN_MODE_NORMAL 0 //常规模式
#define CAN_MODE_LISTEN 1 //监听模式
#define CAN_MODE_SELFTEST 2 //自测模式
#define CAN_BS1_1tq 0
#define CAN_BS1_2tq 1
......@@ -66,15 +66,15 @@ typedef struct {
#define CAN_SJW_3tq 2
#define CAN_SJW_4tq 3
#define CAN_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器
#define CAN_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器
typedef struct {
uint32_t id; //消息ID
uint8_t format; //帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t remote; //消息是否为远程帧
uint8_t size; //接收到的数据个数
uint8_t data[8]; //接收到的数据
uint32_t id; //消息ID
uint8_t format; //帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t remote; //消息是否为远程帧
uint8_t size; //接收到的数据个数
uint8_t data[8]; //接收到的数据
} CAN_RXMessage;
......@@ -102,35 +102,29 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint1
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx);
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx);
uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef * CANx);
void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx);
void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx);
uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef * CANx);
void CAN_INTErrWarningEn(CAN_TypeDef * CANx);
void CAN_INTErrWarningDis(CAN_TypeDef * CANx);
uint32_t CAN_INTErrWarningStat(CAN_TypeDef * CANx);
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx);
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx);
uint32_t CAN_INTRXOverflowStat(CAN_TypeDef * CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx);
void CAN_INTWakeupEn(CAN_TypeDef * CANx);
void CAN_INTWakeupDis(CAN_TypeDef * CANx);
uint32_t CAN_INTWakeupStat(CAN_TypeDef * CANx);
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx);
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx);
uint32_t CAN_INTErrPassiveStat(CAN_TypeDef * CANx);
void CAN_INTArbitrLostEn(CAN_TypeDef * CANx);
void CAN_INTArbitrLostDis(CAN_TypeDef * CANx);
uint32_t CAN_INTArbitrLostStat(CAN_TypeDef * CANx);
void CAN_INTBusErrorEn(CAN_TypeDef * CANx);
void CAN_INTBusErrorDis(CAN_TypeDef * CANx);
uint32_t CAN_INTBusErrorStat(CAN_TypeDef * CANx);
uint32_t CAN_INTStat(CAN_TypeDef * CANx);
#endif //__SWM320_CAN_H__
......@@ -2,22 +2,22 @@
#define __SWM320_CRC_H__
#define CRC32_IN32 0 //CRC32算法,输入数据32位
#define CRC32_IN16 2 //CRC32算法,输入数据16位
#define CRC32_IN8 4 //CRC32算法,输入数据 8位
#define CRC16_IN16 3 //CRC16算法,输入数据16位
#define CRC16_IN8 5 //CRC16算法,输入数据 8位
#define CRC32_IN32 0 //CRC32算法,输入数据32位
#define CRC32_IN16 2 //CRC32算法,输入数据16位
#define CRC32_IN8 4 //CRC32算法,输入数据 8位
#define CRC16_IN16 3 //CRC16算法,输入数据16位
#define CRC16_IN8 5 //CRC16算法,输入数据 8位
void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
/******************************************************************************************************************************************
* 函数名称: CRC_Write()
* 功能说明: CRC写入数据
* 输 入: uint32_t data 要写入的数据
* 输 出: 无
* 注意事项: 无
* 函数名称: CRC_Write()
* 功能说明: CRC写入数据
* 输 入: uint32_t data 要写入的数据
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE void CRC_Write(uint32_t data)
{
......@@ -25,11 +25,11 @@ static __INLINE void CRC_Write(uint32_t data)
}
/******************************************************************************************************************************************
* 函数名称: CRC_Result()
* 功能说明: 获取CRC计算结果
* 输 入: 无
* 输 出: uint32_t CRC 计算结果
* 注意事项: 无
* 函数名称: CRC_Result()
* 功能说明: 获取CRC计算结果
* 输 入: 无
* 输 出: uint32_t CRC 计算结果
* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE uint32_t CRC_Result(void)
{
......
......@@ -7,14 +7,14 @@
#define DMA_CH2 2
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
void DMA_CH_Open(uint32_t chn); //DMA通道打开
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
void DMA_CH_Open(uint32_t chn); //DMA通道打开
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
#endif //__SWM320_DMA_H__
#ifndef __SWM320_EXTI_H__
#define __SWM320_EXTI_H__
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否触发了中断
uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否触发了中断
uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#endif //__SWM320_EXTI_H__
/******************************************************************************************************************************************
* 件名称: SWM320_flash.c
* 功能说明: 使用芯片的IAP功能将片上Flash模拟成EEPROM来保存数据,掉电后不丢失
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_flash.c
* 功能说明: 使用芯片的IAP功能将片上Flash模拟成EEPROM来保存数据,掉电后不丢失
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*******************************************************************************************************************************************
* @attention
*
......@@ -27,11 +27,11 @@ IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
/******************************************************************************************************************************************
* 函数名称: FLASH_Erase()
* 功能说明: 片内Flash擦除
* 输 入: uint32_t addr 擦除地址,扇区大小为4K Byte
* 输 出: 无
* 注意事项: 无
* 函数名称: FLASH_Erase()
* 功能说明: 片内Flash擦除
* 输 入: uint32_t addr 擦除地址,扇区大小为4K Byte
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void FLASH_Erase(uint32_t addr)
{
......@@ -45,13 +45,13 @@ void FLASH_Erase(uint32_t addr)
}
/******************************************************************************************************************************************
* 函数名称: FLASH_Write()
* 功能说明: 片内Flash写入
* 输 入: uint32_t addr 写入地址
* uint32_t buff[] 要写入的数据
* uint32_t count 要写入数据的个数,以字为单位,且必须是4的整数倍,即最少写入4个字
* 输 出: 无
* 注意事项: 写入数据个数必须是4的整数倍,即最少写入4个字
* 函数名称: FLASH_Write()
* 功能说明: 片内Flash写入
* 输 入: uint32_t addr 写入地址
* uint32_t buff[] 要写入的数据
* uint32_t count 要写入数据的个数,以字为单位,且必须是4的整数倍,即最少写入4个字
* 输 出: 无
* 注意事项: 写入数据个数必须是4的整数倍,即最少写入4个字
******************************************************************************************************************************************/
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
{
......@@ -65,17 +65,33 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
}
/******************************************************************************************************************************************
* 函数名称: Flash_Param_at_120MHz()
* 功能说明: 将Flash参数设置成120MHz主频下运行时所需的参数
* 输 入: 无
* 输 出: 无
* 注意事项: 无
* 函数名称: Flash_Param_at_xMHz()
* 功能说明: 将Flash参数设置成xMHz主频下运行时所需的参数
* 输 入: uint32_t x 可取值
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void Flash_Param_at_120MHz(void)
void Flash_Param_at_xMHz(uint32_t x)
{
__disable_irq();
switch(x)
{
case 30:
IAP_Flash_Param(0x489, 0xabf41f25);
break;
IAP_Flash_Param(0x48a, 0xabfc7a6e);
case 40:
IAP_Flash_Param(0x489, 0xabf42929);
break;
case 80:
IAP_Flash_Param(0x489, 0xabf8524d);
break;
case 120:
default:
IAP_Flash_Param(0x48a, 0xabfc7a6e);
break;
}
__enable_irq();
}
......@@ -5,7 +5,7 @@
void FLASH_Erase(uint32_t addr);
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
void Flash_Param_at_120MHz(void);
void Flash_Param_at_xMHz(uint32_t x);
......
......@@ -31,7 +31,7 @@
* uint32_t pull_up 上拉电阻,0 关闭上拉 1 开启上拉
* uint32_t pull_down 下拉电阻,0 关闭下拉 1 开启下拉
* 输 出: 无
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉
* 注意事项: 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)
{
......
......@@ -2,16 +2,16 @@
#define __SWM320_GPIO_H__
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置高
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置低
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平反转
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置高
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置低
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平反转
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n);
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n);
......
......@@ -2,19 +2,19 @@
#define __SWM320_I2C_H__
typedef struct {
uint8_t Master; //1 主机模式
uint8_t Addr7b; //1 7位地址 0 10位地址
uint8_t Master; //1 主机模式
uint8_t Addr7b; //1 7位地址 0 10位地址
uint32_t MstClk; //主机传输时钟频率
uint8_t MstIEn; //主机模式中断使能
uint32_t MstClk; //主机传输时钟频率
uint8_t MstIEn; //主机模式中断使能
uint16_t SlvAddr; //从机地址
uint8_t SlvRxEndIEn; //从机接收完成中断使能
uint8_t SlvTxEndIEn; //从机发送完成中断使能
uint8_t SlvSTADetIEn; //从机检测到起始中断使能
uint8_t SlvSTODetIEn; //从机检测到终止中断使能
uint8_t SlvRdReqIEn; //从机接收到读请求中断使能
uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
uint16_t SlvAddr; //从机地址
uint8_t SlvRxEndIEn; //从机接收完成中断使能
uint8_t SlvTxEndIEn; //从机发送完成中断使能
uint8_t SlvSTADetIEn; //从机检测到起始中断使能
uint8_t SlvSTODetIEn; //从机检测到终止中断使能
uint8_t SlvRdReqIEn; //从机接收到读请求中断使能
uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
} I2C_InitStructure;
......
/******************************************************************************************************************************************
* 件名称: SWM320_lcd.c
* 功能说明: SWM320单片机的LCD功能驱动库
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_lcd.c
* 功能说明: SWM320单片机的LCD功能驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -24,12 +24,12 @@
#include <string.h>
/******************************************************************************************************************************************
* 函数名称: LCD_Init()
* 功能说明: LCD初始化
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* LCD_InitStructure * initStruct 包含LCD相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_Init()
* 功能说明: LCD初始化
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* LCD_InitStructure * initStruct 包含LCD相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
{
......@@ -39,30 +39,21 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
break;
}
if(initStruct->Interface == LCD_INTERFACE_RGB)
{
LCDx->START = (0 << LCD_START_MPUEN_Pos);
LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
(initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
(initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos) |
((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos) |
((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos) |
((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos) |
(initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
(initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
}
else if(initStruct->Interface == LCD_INTERFACE_I80)
{
//
}
LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
(initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
(initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos) |
((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos) |
((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos) |
((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos) |
(initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
(initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
LCDx->IE = 1;
LCDx->IF = 1; //除标志
LCDx->IF = 1; //清除标志
if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
else LCD_INTDis(LCDx);
......@@ -82,11 +73,11 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
}
/******************************************************************************************************************************************
* 函数名称: LCD_Start()
* 功能说明: 启动一次数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_Start()
* 功能说明: 启动一次数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_Start(LCD_TypeDef * LCDx)
{
......@@ -94,11 +85,11 @@ void LCD_Start(LCD_TypeDef * LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_IsBusy()
* 功能说明: 是否正在进行数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: uint32_t 1 正在传输数据 0 数据传输已完成
* 注意事项: 无
* 函数名称: LCD_IsBusy()
* 功能说明: 是否正在进行数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: uint32_t 1 正在传输数据 0 数据传输已完成
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
{
......@@ -106,11 +97,11 @@ uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTEn()
* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTEn()
* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTEn(LCD_TypeDef * LCDx)
{
......@@ -118,11 +109,11 @@ void LCD_INTEn(LCD_TypeDef * LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTDis()
* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTDis()
* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTDis(LCD_TypeDef * LCDx)
{
......@@ -130,11 +121,11 @@ void LCD_INTDis(LCD_TypeDef * LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTClr()
* 功能说明: LCD中断标志清除
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTClr()
* 功能说明: LCD中断标志清除
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTClr(LCD_TypeDef * LCDx)
{
......@@ -142,11 +133,11 @@ void LCD_INTClr(LCD_TypeDef * LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTStat()
* 功能说明: LCD中断状态查询
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
* 注意事项: 无
* 函数名称: LCD_INTStat()
* 功能说明: LCD中断状态查询
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t LCD_INTStat(LCD_TypeDef * LCDx)
{
......
......@@ -2,10 +2,7 @@
#define __SWM320_LCD_H__
typedef struct {
uint8_t Interface; //LCD屏接口:LCD_INTERFACE_RGB、LCD_INTERFACE_I80、LCD_INTERFACE_M68
/* RGB同步接口参数 */
typedef struct {
uint16_t HnPixel; //水平方向像素个数,最大取值1024
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
uint8_t Hfp; //horizonal front porch,最大取值32
......@@ -21,10 +18,6 @@ typedef struct {
} LCD_InitStructure;
#define LCD_INTERFACE_RGB 0
#define LCD_INTERFACE_I80 1
#define LCD_INTERFACE_M68 2
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
......
......@@ -2,12 +2,12 @@
#define __SWM320_NORFLASH_H__
typedef struct {
uint8_t DataWidth; // 8、16
uint8_t DataWidth; // 816
uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
uint8_t OEPreValidTime; // Valid data output after OE# low,单位为系统时钟周期,最大值为15
uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
uint8_t OEPreValidTime; // Valid data output after OE# low,单位为系统时钟周期,最大值为15
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
uint8_t OperTimeoutIEn;
} NORFL_InitStructure;
......@@ -21,7 +21,7 @@ uint32_t NORFL_Read(uint32_t addr);
uint16_t NORFL_ReadID(uint32_t id_addr);
/* 当前版本总线读只支持字读
/* 当前版本总线读只支持字读
#define NORFL_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
......
/******************************************************************************************************************************************
* 文件名称: SWM320_port.c
* 功能说明: SWM320单片机的端口引脚功能选择库函数
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
* 文件名称: SWM320_port.c
* 功能说明: SWM320单片机的端口引脚功能选择库函数
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -23,15 +23,15 @@
/******************************************************************************************************************************************
* 函数名称: PORT_Init()
* 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
* 输 入: uint32_t PORTx 指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
* uint32_t n 指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t func 指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
* uint32_t digit_in_en 数字输入使能
* 输 出: 无
* 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
* 当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
* 函数名称: PORT_Init()
* 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
* 输 入: uint32_t PORTx 指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
* uint32_t n 指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t func 指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
* uint32_t digit_in_en 数字输入使能
* 输 出: 无
* 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
* 当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
******************************************************************************************************************************************/
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
{
......
#ifndef __SWM320_PORT_H__
#define __SWM320_PORT_H__
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en); //端口引脚功能选择,其可取值如下:
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en); //端口引脚功能选择,其可取值如下:
#define PORTA 0
#define PORTB 1
......@@ -425,8 +425,8 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
/* 下面宏定义的取值全部在正确值的基础上“加100”,以区分上面宏定义的值,从而方便库函数的编写*/
/* 下面这些值是偶数编号引脚的功能取值,如PIN0、PIN2、... */
/* 下面宏定义的取值全部在正确值的基础上“加100”,以区分上面宏定义的值,从而方便库函数的编写*/
/* 下面这些值是偶数编号引脚的功能取值,如PIN0、PIN2、... */
#define FUNMUX0_UART0_RXD 100
#define FUNMUX0_UART1_RXD 101
#define FUNMUX0_UART2_RXD 102
......@@ -452,7 +452,7 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
#define FUNMUX0_UART2_CTS 123
#define FUNMUX0_UART3_CTS 124
/* 下面这些值是奇数编号引脚的功能取值,如PIN1、PIN3、... */
/* 下面这些值是奇数编号引脚的功能取值,如PIN1、PIN3、... */
#define FUNMUX1_UART0_TXD 100
#define FUNMUX1_UART1_TXD 101
#define FUNMUX1_UART2_TXD 102
......
......@@ -2,57 +2,57 @@
#define __SWM320_PWM_H__
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
uint16_t cycleA; //A路周期
uint16_t hdutyA; //A路占空比
uint16_t deadzoneA; //A路死区时长,取值0--1023
uint8_t initLevelA; //A路初始输出电平,0 低电平 1 高电平
uint16_t cycleA; //A路周期
uint16_t hdutyA; //A路占空比
uint16_t deadzoneA; //A路死区时长,取值0--1023
uint8_t initLevelA; //A路初始输出电平,0 低电平 1 高电平
uint16_t cycleB; //B路周期
uint16_t hdutyB; //B路占空比
uint16_t deadzoneB; //B路死区时长,取值0--1023
uint8_t initLevelB; //B路初始输出电平,0 低电平 1 高电平
uint16_t cycleB; //B路周期
uint16_t hdutyB; //B路占空比
uint16_t deadzoneB; //B路死区时长,取值0--1023
uint8_t initLevelB; //B路初始输出电平,0 低电平 1 高电平
uint8_t HEndAIEn; //A路高电平结束中断使能
uint8_t NCycleAIEn; //A路新周期开始中断使能
uint8_t HEndBIEn; //B路高电平结束中断使能
uint8_t NCycleBIEn; //B路新周期开始中断使能
uint8_t HEndAIEn; //A路高电平结束中断使能
uint8_t NCycleAIEn; //A路新周期开始中断使能
uint8_t HEndBIEn; //B路高电平结束中断使能
uint8_t NCycleBIEn; //B路新周期开始中断使能
} PWM_InitStructure;
#define PWM_CLKDIV_1 0
#define PWM_CLKDIV_8 1
#define PWM_MODE_INDEP 0 //A路和B路为两路独立输出
#define PWM_MODE_COMPL 1 //A路和B路为一路互补输出
#define PWM_MODE_INDEP_CALIGN 3 //A路和B路为两路独立输出,中心对齐
#define PWM_MODE_COMPL_CALIGN 4 //A路和B路为一路互补输出,中心对齐
#define PWM_MODE_INDEP 0 //A路和B路为两路独立输出
#define PWM_MODE_COMPL 1 //A路和B路为一路互补输出
#define PWM_MODE_INDEP_CALIGN 3 //A路和B路为两路独立输出,中心对齐
#define PWM_MODE_COMPL_CALIGN 4 //A路和B路为一路互补输出,中心对齐
#define PWM_CH_A 0
#define PWM_CH_B 1
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct); //PWM初始化
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始PWM输出
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle); //设置周期
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn); //获取周期
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn); //获取高电平时长
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn); //获取死区时长
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断使能
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断禁能
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断标志清除
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断是否发生
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断使能
void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断禁能
void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断标志清除
uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断是否发生
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct); //PWM初始化
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始PWM输出
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle); //设置周期
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn); //获取周期
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn); //获取高电平时长
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn); //获取死区时长
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断使能
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断禁能
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断标志清除
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断是否发生
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断使能
void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断禁能
void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断标志清除
uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断是否发生
#endif //__SWM320_PWM_H__
/******************************************************************************************************************************************
* 件名称: SWM320_rtc.c
* 功能说明: SWM320单片机的RTC驱动库
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_rtc.c
* 功能说明: SWM320单片机的RTC驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -24,18 +24,18 @@
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
/******************************************************************************************************************************************
* 函数名称: RTC_Init()
* 功能说明: RTC初始化
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_InitStructure * initStruct 包含RTC相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_Init()
* 功能说明: RTC初始化
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_InitStructure * initStruct 包含RTC相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
{
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos); //RTC使用32KHz RC时钟
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos); //RTC使用32KHz RC时钟
SYS->CLKEN |= (1 << SYS_CLKEN_RTC_Pos) |
((uint32_t)1 << SYS_CLKEN_ALIVE_Pos);
......@@ -72,11 +72,11 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
}
/******************************************************************************************************************************************
* 函数名称: RTC_Start()
* 功能说明: 启动RTC
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_Start()
* 功能说明: 启动RTC
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_Start(RTC_TypeDef * RTCx)
{
......@@ -84,11 +84,11 @@ void RTC_Start(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_Stop()
* 功能说明: 停止RTC
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_Stop()
* 功能说明: 停止RTC
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_Stop(RTC_TypeDef * RTCx)
{
......@@ -96,12 +96,12 @@ void RTC_Stop(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_GetDateTime()
* 功能说明: 获取当前的时间和日期
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_DateTime * dateTime 获取到的时间、日期值存入此指针指向的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_GetDateTime()
* 功能说明: 获取当前的时间和日期
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_DateTime * dateTime 获取到的时间、日期值存入此指针指向的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
{
......@@ -115,12 +115,12 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
}
/******************************************************************************************************************************************
* 函数名称: RTC_AlarmSetup()
* 功能说明: RTC闹钟设定
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_AlarmStructure * alarmStruct 包含RTC闹钟设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_AlarmSetup()
* 功能说明: RTC闹钟设定
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
* RTC_AlarmStructure * alarmStruct 包含RTC闹钟设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
{
......@@ -143,13 +143,13 @@ void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
}
/******************************************************************************************************************************************
* 函数名称: calcWeekDay()
* 功能说明: 计算指定年、月、日是星期几
* 输 入: uint32_t year
* uint32_t month 月
* uint32_t date 日
* 输 出: uint32_t 0 星期日 1 星期一 ... ... 6 星期六
* 注意事项: 无
* 函数名称: calcWeekDay()
* 功能说明: 计算指定年、月、日是星期几
* 输 入: uint32_t year 年
* uint32_t month
* uint32_t date
* 输 出: uint32_t 0 星期日 1 星期一 ... ... 6 星期六
* 注意事项: 无
******************************************************************************************************************************************/
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
{
......@@ -173,11 +173,11 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntSecondEn()
* 功能说明: 秒中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntSecondEn()
* 功能说明: 秒中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntSecondEn(RTC_TypeDef * RTCx)
{
......@@ -185,11 +185,11 @@ void RTC_IntSecondEn(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntSecondDis()
* 功能说明: 秒中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntSecondDis()
* 功能说明: 秒中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntSecondDis(RTC_TypeDef * RTCx)
{
......@@ -197,11 +197,11 @@ void RTC_IntSecondDis(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntSecondClr()
* 功能说明: 秒中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntSecondClr()
* 功能说明: 秒中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntSecondClr(RTC_TypeDef * RTCx)
{
......@@ -209,11 +209,11 @@ void RTC_IntSecondClr(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntSecondStat()
* 功能说明: 秒中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 秒中断发生 0 秒中断未发生
* 注意事项: 无
* 函数名称: RTC_IntSecondStat()
* 功能说明: 秒中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 秒中断发生 0 秒中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
{
......@@ -221,11 +221,11 @@ uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntMinuteEn()
* 功能说明: 分中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntMinuteEn()
* 功能说明: 分中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
{
......@@ -233,11 +233,11 @@ void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntMinuteDis()
* 功能说明: 分中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntMinuteDis()
* 功能说明: 分中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
{
......@@ -245,11 +245,11 @@ void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntMinuteClr()
* 功能说明: 分中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntMinuteClr()
* 功能说明: 分中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
{
......@@ -257,11 +257,11 @@ void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntMinuteStat()
* 功能说明: 分中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 分中断发生 0 分中断未发生
* 注意事项: 无
* 函数名称: RTC_IntMinuteStat()
* 功能说明: 分中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 分中断发生 0 分中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
{
......@@ -269,11 +269,11 @@ uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntHourEn()
* 功能说明: 时中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntHourEn()
* 功能说明: 时中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntHourEn(RTC_TypeDef * RTCx)
{
......@@ -281,11 +281,11 @@ void RTC_IntHourEn(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntHourDis()
* 功能说明: 时中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntHourDis()
* 功能说明: 时中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntHourDis(RTC_TypeDef * RTCx)
{
......@@ -293,11 +293,11 @@ void RTC_IntHourDis(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntHourClr()
* 功能说明: 时中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntHourClr()
* 功能说明: 时中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntHourClr(RTC_TypeDef * RTCx)
{
......@@ -305,11 +305,11 @@ void RTC_IntHourClr(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntHourStat()
* 功能说明: 时中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 时中断发生 0 时中断未发生
* 注意事项: 无
* 函数名称: RTC_IntHourStat()
* 功能说明: 时中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 时中断发生 0 时中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
{
......@@ -317,11 +317,11 @@ uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntDateEn()
* 功能说明: 日中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntDateEn()
* 功能说明: 日中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntDateEn(RTC_TypeDef * RTCx)
{
......@@ -329,11 +329,11 @@ void RTC_IntDateEn(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntDateDis()
* 功能说明: 日中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntDateDis()
* 功能说明: 日中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntDateDis(RTC_TypeDef * RTCx)
{
......@@ -341,11 +341,11 @@ void RTC_IntDateDis(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntDateClr()
* 功能说明: 日中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntDateClr()
* 功能说明: 日中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntDateClr(RTC_TypeDef * RTCx)
{
......@@ -353,11 +353,11 @@ void RTC_IntDateClr(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntDateStat()
* 功能说明: 日中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 日中断发生 0 日中断未发生
* 注意事项: 无
* 函数名称: RTC_IntDateStat()
* 功能说明: 日中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 日中断发生 0 日中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
{
......@@ -365,11 +365,11 @@ uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntAlarmEn()
* 功能说明: 闹钟中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntAlarmEn()
* 功能说明: 闹钟中断使能
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
{
......@@ -377,11 +377,11 @@ void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntAlarmDis()
* 功能说明: 闹钟中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntAlarmDis()
* 功能说明: 闹钟中断禁止
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
{
......@@ -389,11 +389,11 @@ void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntAlarmClr()
* 功能说明: 闹钟中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
* 函数名称: RTC_IntAlarmClr()
* 功能说明: 闹钟中断标志清除
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
{
......@@ -401,11 +401,11 @@ void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
}
/******************************************************************************************************************************************
* 函数名称: RTC_IntAlarmStat()
* 功能说明: 闹钟中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 闹钟中断发生 0 闹钟中断未发生
* 注意事项: 无
* 函数名称: RTC_IntAlarmStat()
* 功能说明: 闹钟中断状态
* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
* 输 出: uint32_t 1 闹钟中断发生 0 闹钟中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx)
{
......
......@@ -13,17 +13,17 @@
typedef struct {
uint16_t Year;
uint8_t Month; //取值1--12
uint8_t Date; //取值1--31
uint8_t Hour; //取值0--23
uint8_t Minute; //取值0--59
uint8_t Second; //取值0--59
uint8_t Month; //取值1--12
uint8_t Date; //取值1--31
uint8_t Hour; //取值0--23
uint8_t Minute; //取值0--59
uint8_t Second; //取值0--59
uint8_t SecondIEn;
uint8_t MinuteIEn;
} RTC_InitStructure;
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 Minute;
uint8_t Second;
......@@ -34,7 +34,7 @@ typedef struct {
uint16_t Year;
uint8_t Month;
uint8_t Date;
uint8_t Day; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT
uint8_t Day; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT
uint8_t Hour;
uint8_t Minute;
uint8_t Second;
......
/******************************************************************************************************************************************
* 文件名称: SWM320_sdio.c
* 功能说明: SWM320单片机的SDIO接口驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项: 为了通用性、兼容性、易用性,只支持以512字节为单位的读写
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
* 文件名称: SWM320_sdio.c
* 功能说明: SWM320单片机的SDIO接口驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项: 为了通用性、兼容性、易用性,只支持以512字节为单位的读写
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -25,11 +25,11 @@
SD_CardInfo SD_cardInfo;
/******************************************************************************************************************************************
* 函数名称: SDIO_Init()
* 功能说明: SDIO读写SD卡初始化,初始化成高速4线模式、读写以512字节大小进行
* 输 入: uint32_t freq SDIO_CLK时钟频率
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_Init()
* 功能说明: SDIO读写SD卡初始化,初始化成高速4线模式、读写以512字节大小进行
* 输 入: uint32_t freq SDIO_CLK时钟频率
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_Init(uint32_t freq)
{
......@@ -37,7 +37,7 @@ uint32_t SDIO_Init(uint32_t freq)
uint32_t resp, resps[4];
SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
if(SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
if(SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
else
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
......@@ -64,7 +64,7 @@ uint32_t SDIO_Init(uint32_t freq)
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)
return res;
......@@ -77,50 +77,50 @@ uint32_t SDIO_Init(uint32_t freq)
if(res != SD_RES_OK)
return res;
if(resp != 0x120) return SD_RES_ERR; //不是SD卡,可能是MMC卡
if(resp != 0x120) return SD_RES_ERR; //不是SD卡,可能是MMC卡
if(SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x40000000, SD_RESP_32b, &resp);
else
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;
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);
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;
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);
if(SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR; //本驱动只支持以512字节为单位的读写,所以最大读写单位必须不小于512
if(SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR; //本驱动只支持以512字节为单位的读写,所以最大读写单位必须不小于512
SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
(calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //初始化完成,SDCLK切换到高速
(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_SendCmd(SD_CMD_APP_CMD, SD_cardInfo.RCA << 16, SD_RESP_32b, &resp);
SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp); //切换成4位总线模式
SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp); //切换成4位总线模式
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;
......@@ -128,12 +128,12 @@ uint32_t SDIO_Init(uint32_t freq)
}
/******************************************************************************************************************************************
* 函数名称: SDIO_BlockWrite()
* 功能说明: 向SD卡写入数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_BlockWrite()
* 功能说明: 向SD卡写入数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
{
......@@ -159,13 +159,13 @@ uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
}
/******************************************************************************************************************************************
* 函数名称: SDIO_MultiBlockWrite()
* 功能说明: 向SD卡写入多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要写入的块数
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_MultiBlockWrite()
* 功能说明: 向SD卡写入多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要写入的块数
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
......@@ -194,13 +194,13 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
}
/******************************************************************************************************************************************
* 函数名称: SDIO_DMABlockWrite()
* 功能说明: 通过DMA向SD卡写入多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要写入的块数
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_DMABlockWrite()
* 功能说明: 通过DMA向SD卡写入多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要写入的块数
* uint32_t buff[] 要写入的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
......@@ -223,12 +223,12 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
}
/******************************************************************************************************************************************
* 函数名称: SDIO_BlockRead()
* 功能说明: 从SD卡读出数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_BlockRead()
* 功能说明: 从SD卡读出数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
{
......@@ -254,13 +254,13 @@ uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
}
/******************************************************************************************************************************************
* 函数名称: SDIO_MultiBlockRead()
* 功能说明: 从SD卡读出多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要读出的块数
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_MultiBlockRead()
* 功能说明: 从SD卡读出多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要读出的块数
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
......@@ -289,13 +289,13 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
}
/******************************************************************************************************************************************
* 函数名称: SDIO_DMABlockRead()
* 功能说明: 通过DMA从SD卡读出多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要读出的块数
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: SDIO_DMABlockRead()
* 功能说明: 通过DMA从SD卡读出多块数据
* 输 入: uint32_t block_addr SD卡块地址,每块512字节
* uint16_t block_cnt 要读出的块数
* uint32_t buff[] 读出的数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
......@@ -318,20 +318,20 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
}
/******************************************************************************************************************************************
* 函数名称: _SDIO_SendCmd()
* 功能说明: SDIO向SD卡发送命令
* 输 入: uint32_t cmd 命令索引
* uint32_t arg 命令参数
* uint32_t _resp_type 响应类型,取值SD_RESP_NO、SD_RESP_32b、SD_RESP_128b、SD_RESP_32b_busy
* uint32_t *resp_data 响应内容
* uint32_t have_data 是否有数据传输
* uint32_t data_read 1 读SD卡 0 写SD卡
* uint16_t block_cnt 读写块个数
* uint32_t use_dma 1 使用DMA搬运数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
* 函数名称: _SDIO_SendCmd()
* 功能说明: SDIO向SD卡发送命令
* 输 入: uint32_t cmd 命令索引
* uint32_t arg 命令参数
* uint32_t resp_type 响应类型,取值SD_RESP_NO、SD_RESP_32b、SD_RESP_128b、SD_RESP_32b_busy
* uint32_t *resp_data 响应内容
* uint32_t have_data 是否有数据传输
* uint32_t data_read 1 读SD卡 0 写SD卡
* uint16_t block_cnt 读写块个数
* uint32_t use_dma 1 使用DMA搬运数据
* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma)
uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma)
{
SDIO->BLK &= ~SDIO_BLK_COUNT_Msk;
SDIO->BLK |= (block_cnt << SDIO_BLK_COUNT_Pos);
......@@ -341,7 +341,7 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t
(0 << SDIO_CMD_CMDTYPE_Pos) |
(0 << SDIO_CMD_IDXCHECK_Pos) |
(0 << SDIO_CMD_CRCCHECK_Pos) |
(_resp_type << SDIO_CMD_RESPTYPE_Pos) |
(resp_type << SDIO_CMD_RESPTYPE_Pos) |
(have_data << SDIO_CMD_HAVEDATA_Pos) |
(data_read << SDIO_CMD_DIRREAD_Pos) |
((block_cnt > 1) << SDIO_CMD_MULTBLK_Pos) |
......@@ -366,14 +366,14 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t
}
SDIO->IF = SDIO_IF_CMDDONE_Msk;
if(_resp_type == SD_RESP_32b)
if(resp_type == SD_RESP_32b)
{
resp_data[0] = SDIO->RESP[0];
}
else if(_resp_type == SD_RESP_128b)
else if(resp_type == SD_RESP_128b)
{
//寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0],最低位的CRC被丢掉
//读出数据时调整了顺序,将CID/CSD[127-8]存放在resp_data0-3[127-8],最低8位填充0x00
//寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0],最低位的CRC被丢掉
//读出数据时调整了顺序,将CID/CSD[127-8]存放在resp_data0-3[127-8],最低8位填充0x00
resp_data[0] = (SDIO->RESP[3] << 8) + ((SDIO->RESP[2] >> 24) & 0xFF);
resp_data[1] = (SDIO->RESP[2] << 8) + ((SDIO->RESP[1] >> 24) & 0xFF);
resp_data[2] = (SDIO->RESP[1] << 8) + ((SDIO->RESP[0] >> 24) & 0xFF);
......@@ -538,7 +538,7 @@ void parseCSD(uint32_t CSD_Tab[4])
/*!< Byte 10 */
tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
SD_cardInfo.CardCapacity = (uint64_t)(SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
SD_cardInfo.CardBlockSize = 512;
}
......
......@@ -35,10 +35,10 @@
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
#define SD_RESP_NO 0 //0 响应
#define SD_RESP_32b 2 //2 32位响
#define SD_RESP_128b 1 //1 128位响
#define SD_RESP_32b_busy 3 //3 32位响应,check Busy after response
#define SD_RESP_NO 0 //0 无响应
#define SD_RESP_32b 2 //2 32位响应
#define SD_RESP_128b 1 //1 128位响应
#define SD_RESP_32b_busy 3 //3 32位响应,check Busy after response
#define SD_BUSWIDTH_1b 0
#define SD_BUSWIDTH_4b 2
......@@ -133,11 +133,11 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma);
uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma);
#define SDIO_SendCmd(cmd, arg, _resp_type, resp_data) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 0, 0, 0, 0)
#define SDIO_SendCmdWithData(cmd, arg, _resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 1, data_read, block_cnt, 0)
#define SDIO_SendCmdWithDataByDMA(cmd, arg, _resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 1, data_read, block_cnt, 1)
#define SDIO_SendCmd(cmd, arg, resp_type, resp_data) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 0, 0, 0, 0)
#define SDIO_SendCmdWithData(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 0)
#define SDIO_SendCmdWithDataByDMA(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 1)
void parseCID(uint32_t CID_Tab[4]);
void parseCSD(uint32_t CID_Tab[4]);
......
/******************************************************************************************************************************************
* 件名称: SWM320_sdram.c
* 功能说明: SWM320单片机的SDRAM驱动程序
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_sdram.c
* 功能说明: SWM320单片机的SDRAM驱动程序
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -22,11 +22,11 @@
#include "SWM320_sdram.h"
/******************************************************************************************************************************************
* 函数名称: SDRAM_Init()
* 功能说明: SDRAM控制器初始化
* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: SDRAM_Init()
* 功能说明: SDRAM控制器初始化
* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SDRAM_Init(SDRAM_InitStructure * initStruct)
{
......@@ -35,9 +35,9 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length4
SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length4
(initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
......@@ -69,11 +69,11 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
}
/******************************************************************************************************************************************
* 函数名称: SDRAM_Enable()
* 功能说明: SDRAM使能,使能后可读写SDRAM
* 输 入: 无
* 输 出: 无
* 注意事项: 无
* 函数名称: SDRAM_Enable()
* 功能说明: SDRAM使能,使能后可读写SDRAM
* 输 入: 无
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SDRAM_Enable(void)
{
......@@ -86,11 +86,11 @@ void SDRAM_Enable(void)
}
/******************************************************************************************************************************************
* 函数名称: SDRAM_Disable()
* 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
* 输 入: 无
* 输 出: 无
* 注意事项: 无
* 函数名称: SDRAM_Disable()
* 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
* 输 入: 无
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SDRAM_Disable(void)
{
......
......@@ -2,17 +2,17 @@
#define __SWM320_SDRAM_H__
typedef struct {
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 CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
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 CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
uint8_t TimeTMRD; // MRS to New Command
uint8_t TimeTRRD; // Activate to activate on different banks
uint8_t TimeTRAS; // Self refresh time,最小Self-refresh周期
uint8_t TimeTRC; // Row cycle delay,Refresh命令到Activate命令间延时,也是两个连续Refresh命令间延时
uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
uint8_t TimeTRAS; // Self refresh time,最小Self-refresh周期
uint8_t TimeTRC; // Row cycle delay,Refresh命令到Activate命令间延时,也是两个连续Refresh命令间延时
uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
} SDRAM_InitStructure;
#define SDRAM_CELLSIZE_16Mb 3
......
......@@ -2,26 +2,26 @@
#define __SWM320_SPI_H__
typedef struct {
uint8_t FrameFormat; //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
uint8_t WordSize; //字长度, 有效值4-16
uint8_t Master; //1 主机模式 0 从机模式
uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
uint8_t FrameFormat; //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
uint8_t WordSize; //字长度, 有效值4-16
uint8_t Master; //1 主机模式 0 从机模式
uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
uint8_t RXHFullIEn; //接收FIFO半满中断使能
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
uint8_t RXHFullIEn; //接收FIFO半满中断使能
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
} SPI_InitStructure;
#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
#define SPI_LOW_LEVEL 0 //空闲时时钟线保持低电平
#define SPI_HIGH_LEVEL 1 //空闲时时钟线保持高电平
#define SPI_LOW_LEVEL 0 //空闲时时钟线保持低电平
#define SPI_HIGH_LEVEL 1 //空闲时时钟线保持高电平
#define SPI_CLKDIV_4 0
#define SPI_CLKDIV_8 1
......@@ -34,18 +34,18 @@ typedef struct {
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开,允许收发
void SPI_Close(SPI_TypeDef * SPIx); //SPI关闭,禁止收发
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开,允许收发
void SPI_Close(SPI_TypeDef * SPIx); //SPI关闭,禁止收发
uint32_t SPI_Read(SPI_TypeDef * SPIx);
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //发送FIFO是否空
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //发送FIFO是否空
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx);
......
/******************************************************************************************************************************************
* 件名称: SWM320_sram.c
* 功能说明: SWM320单片机的SRAM驱动程序
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_sram.c
* 功能说明: SWM320单片机的SRAM驱动程序
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -23,17 +23,17 @@
/******************************************************************************************************************************************
* 函数名称: SRAM_Init()
* 功能说明: SRAM控制器初始化
* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: SRAM_Init()
* 功能说明: SRAM控制器初始化
* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SRAM_Init(SRAM_InitStructure * initStruct)
{
uint32_t i;
// 配置SRAM前需要刷新下SDRAM控制器
// 配置SRAM前需要刷新下SDRAM控制器
do {
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
......@@ -49,5 +49,5 @@ void SRAM_Init(SRAM_InitStructure * initStruct)
SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
(initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
(0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
(0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
}
......@@ -2,8 +2,8 @@
#define __SWM320_SRAM_H__
typedef struct {
uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
} SRAM_InitStructure;
......
/******************************************************************************************************************************************
* 件名称: SWM320_timr.c
* 功能说明: SWM320单片机的计数器/定时器功能驱动库
* 术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 意事项:
* 版本日期: V1.1.0 2017年10月25日
* 级记录:
* 文件名称: SWM320_timr.c
* 功能说明: SWM320单片机的计数器/定时器功能驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
......@@ -23,20 +23,20 @@
/******************************************************************************************************************************************
* 函数名称: TIMR_Init()
* 功能说明: TIMR定时器/计数器初始化
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,有效值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* uint32_t mode TIMR_MODE_TIMER 定时器模式 TIMR_MODE_COUNTER 计数器模式
* uint32_t period 定时/计数周期
* uint32_t int_en 中断使能
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_Init()
* 功能说明: TIMR定时器/计数器初始化
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,有效值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* uint32_t mode TIMR_MODE_TIMER 定时器模式 TIMR_MODE_COUNTER 计数器模式
* uint32_t period 定时/计数周期
* uint32_t int_en 中断使能
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
{
SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
TIMR_Stop(TIMRx); //一些关键寄存器只能在定时器停止时设置
TIMR_Stop(TIMRx); //一些关键寄存器只能在定时器停止时设置
TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
......@@ -46,7 +46,7 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
switch((uint32_t)TIMRx)
{
case ((uint32_t)TIMR0):
TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志
TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志
TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
......@@ -96,11 +96,11 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
}
/******************************************************************************************************************************************
* 函数名称: TIMR_Start()
* 功能说明: 启动定时器,从初始值开始计时/计数
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_Start()
* 功能说明: 启动定时器,从初始值开始计时/计数
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_Start(TIMR_TypeDef * TIMRx)
{
......@@ -108,11 +108,11 @@ void TIMR_Start(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_Stop()
* 功能说明: 停止定时器
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_Stop()
* 功能说明: 停止定时器
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_Stop(TIMR_TypeDef * TIMRx)
{
......@@ -120,11 +120,11 @@ void TIMR_Stop(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_Halt()
* 功能说明: 暂停定时器,计数值保持不变
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_Halt()
* 功能说明: 暂停定时器,计数值保持不变
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_Halt(TIMR_TypeDef * TIMRx)
{
......@@ -157,11 +157,11 @@ void TIMR_Halt(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_Resume()
* 功能说明: 恢复定时器,从暂停处继续计数
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_Resume()
* 功能说明: 恢复定时器,从暂停处继续计数
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_Resume(TIMR_TypeDef * TIMRx)
{
......@@ -194,12 +194,12 @@ void TIMR_Resume(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_SetPeriod()
* 功能说明: 设置定时/计数周期
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* uint32_t period 定时/计数周期
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_SetPeriod()
* 功能说明: 设置定时/计数周期
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* uint32_t period 定时/计数周期
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
{
......@@ -207,11 +207,11 @@ void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_GetPeriod()
* 功能说明: 获取定时/计数周期
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 当前定时/计数周期
* 注意事项: 无
* 函数名称: TIMR_GetPeriod()
* 功能说明: 获取定时/计数周期
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 当前定时/计数周期
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
{
......@@ -219,11 +219,11 @@ uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_GetCurValue()
* 功能说明: 获取当前计数值
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 当前计数值
* 注意事项: 无
* 函数名称: TIMR_GetCurValue()
* 功能说明: 获取当前计数值
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 当前计数值
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
{
......@@ -231,11 +231,11 @@ uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_INTEn()
* 功能说明: 使能中断
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_INTEn()
* 功能说明: 使能中断
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_INTEn(TIMR_TypeDef * TIMRx)
{
......@@ -274,11 +274,11 @@ void TIMR_INTEn(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_INTDis()
* 功能说明: 禁能中断
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_INTDis()
* 功能说明: 禁能中断
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_INTDis(TIMR_TypeDef * TIMRx)
{
......@@ -311,11 +311,11 @@ void TIMR_INTDis(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_INTClr()
* 功能说明: 清除中断标志
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
* 函数名称: TIMR_INTClr()
* 功能说明: 清除中断标志
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void TIMR_INTClr(TIMR_TypeDef * TIMRx)
{
......@@ -348,11 +348,11 @@ void TIMR_INTClr(TIMR_TypeDef * TIMRx)
}
/******************************************************************************************************************************************
* 函数名称: TIMR_INTStat()
* 功能说明: 获取中断状态
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
* 注意事项: 无
* 函数名称: TIMR_INTStat()
* 功能说明: 获取中断状态
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
* 输 出: uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
{
......@@ -382,32 +382,32 @@ uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
/******************************************************************************************************************************************
* 函数名称: Pulse_Init()
* 功能说明: 脉宽测量功能初始化
* 输 入: uint32_t pulse PULSE_LOW 测量低脉冲宽度 PULSE_HIGH 测量高脉冲宽度
* uint32_t int_en 是否使能脉冲测量完成中断
* 输 出: 无
* 注意事项: 无
* 函数名称: Pulse_Init()
* 功能说明: 脉宽测量功能初始化
* 输 入: uint32_t pulse PULSE_LOW 测量低脉冲宽度 PULSE_HIGH 测量高脉冲宽度
* uint32_t int_en 是否使能脉冲测量完成中断
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void Pulse_Init(uint32_t pulse, uint32_t int_en)
{
SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
TIMRG->PCTRL = (0 << TIMRG_PCTRL_CLKSRC_Pos) | // 系统时钟作为时钟源
TIMRG->PCTRL = (0 << TIMRG_PCTRL_CLKSRC_Pos) | // 系统时钟作为时钟源
(pulse << TIMRG_PCTRL_HIGH_Pos) |
(0 << TIMRG_PCTRL_EN_Pos);
TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
if(int_en) NVIC_EnableIRQ(PULSE_IRQn);
}
/******************************************************************************************************************************************
* 函数名称: Pulse_Start()
* 功能说明: 脉宽测量功能启动,测量到脉宽后会自动关闭测量功能
* 输 入: 无
* 输 出: 无
* 注意事项: 无
* 函数名称: Pulse_Start()
* 功能说明: 脉宽测量功能启动,测量到脉宽后会自动关闭测量功能
* 输 入: 无
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void Pulse_Start(void)
{
......@@ -415,17 +415,17 @@ void Pulse_Start(void)
}
/******************************************************************************************************************************************
* 函数名称: Pulse_Done()
* 功能说明: 脉宽测量是否完成
* 输 入: 无
* 输 出: uint32_t 1 测量已完成 0 测量未完成
* 注意事项: 无
* 函数名称: Pulse_Done()
* 功能说明: 脉宽测量是否完成
* 输 入: 无
* 输 出: uint32_t 1 测量已完成 0 测量未完成
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t Pulse_Done(void)
{
if(TIMRG->IF & TIMRG_IF_PULSE_Msk)
{
TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志
TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志
return 1;
}
......
......@@ -4,20 +4,20 @@
#define TIMR_MODE_TIMER 0
#define TIMR_MODE_COUNTER 1
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
void TIMR_Start(TIMR_TypeDef * TIMRx); //启动定时器,从初始值开始计时/计数
void TIMR_Stop(TIMR_TypeDef * TIMRx); //停止定时器
void TIMR_Halt(TIMR_TypeDef * TIMRx); //暂停定时器,计数值保持不变
void TIMR_Resume(TIMR_TypeDef * TIMRx); //恢复定时器,从暂停处继续计数
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period); //设置定时/计数周期
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx); //获取定时/计数周期
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx); //获取当前计数值
void TIMR_INTEn(TIMR_TypeDef * TIMRx); //使能中断
void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
void TIMR_INTClr(TIMR_TypeDef * TIMRx); //清除中断标志
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx); //获取中断状态
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
void TIMR_Start(TIMR_TypeDef * TIMRx); //启动定时器,从初始值开始计时/计数
void TIMR_Stop(TIMR_TypeDef * TIMRx); //停止定时器
void TIMR_Halt(TIMR_TypeDef * TIMRx); //暂停定时器,计数值保持不变
void TIMR_Resume(TIMR_TypeDef * TIMRx); //恢复定时器,从暂停处继续计数
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period); //设置定时/计数周期
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx); //获取定时/计数周期
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx); //获取当前计数值
void TIMR_INTEn(TIMR_TypeDef * TIMRx); //使能中断
void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
void TIMR_INTClr(TIMR_TypeDef * TIMRx); //清除中断标志
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx); //获取中断状态
......
......@@ -4,20 +4,20 @@
typedef struct {
uint32_t Baudrate;
uint8_t DataBits; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
uint8_t DataBits; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
uint8_t Parity; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO
uint8_t Parity; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO
uint8_t StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
uint8_t StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
uint8_t RXThreshold; //取值0--7
uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
uint8_t RXThreshold; //取值0--7
uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
uint8_t TXThreshold; //取值0--7
uint8_t TXThresholdIEn; //当TX FIFO中数据个数 <= TXThreshold时触发中断
uint8_t TXThreshold; //取值0--7
uint8_t TXThresholdIEn; //当TX FIFO中数据个数 <= TXThreshold时触发中断
uint8_t TimeoutTime; //超时时长 = TimeoutTime/(Baudrate/10) 秒
uint8_t TimeoutIEn; //超时中断,RX FIFO非空,且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
uint8_t TimeoutTime; //超时时长 = TimeoutTime/(Baudrate/10) 秒
uint8_t TimeoutIEn; //超时中断,RX FIFO非空,且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
} UART_InitStructure;
......@@ -46,20 +46,20 @@ typedef struct {
#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_Close(UART_TypeDef * UARTx);
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //发送一个字节数据
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //读取一个字节数据,并指出数据是否Valid
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //发送一个字节数据
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //读取一个字节数据,并指出数据是否Valid
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //设置波特率
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //获取当前使用的波特率
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //设置波特率
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //获取当前使用的波特率
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity);
uint32_t UART_CTSLineState(UART_TypeDef * UARTx);
......
......@@ -4,16 +4,16 @@
#define WDT_MODE_RESET 0
#define WDT_MODE_INTERRUPT 1
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
void WDT_Start(WDT_TypeDef * WDTx); //启动指定WDT,开始倒计时
void WDT_Stop(WDT_TypeDef * WDTx); //关闭指定WDT,停止倒计时
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
void WDT_Start(WDT_TypeDef * WDTx); //启动指定WDT,开始倒计时
void WDT_Stop(WDT_TypeDef * WDTx); //关闭指定WDT,停止倒计时
void WDT_Feed(WDT_TypeDef * WDTx); //喂狗,重新从装载值开始倒计时
void WDT_Feed(WDT_TypeDef * WDTx); //喂狗,重新从装载值开始倒计时
int32_t WDT_GetValue(WDT_TypeDef * WDTx); //获取指定看门狗定时器的当前倒计时值
int32_t WDT_GetValue(WDT_TypeDef * WDTx); //获取指定看门狗定时器的当前倒计时值
void WDT_INTClr(WDT_TypeDef * WDTx); //中断标志清除
uint32_t WDT_INTStat(WDT_TypeDef * WDTx); //中断状态查询
void WDT_INTClr(WDT_TypeDef * WDTx); //中断标志清除
uint32_t WDT_INTStat(WDT_TypeDef * WDTx); //中断状态查询
#endif //__SWM320_WDT_H__
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册