mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-03-27 17:45:13 +08:00
@@ -1716,7 +1716,8 @@ typedef struct
|
||||
|
||||
__IO uint32_t LINCR;
|
||||
|
||||
union {
|
||||
union
|
||||
{
|
||||
__IO uint32_t CTSCR;
|
||||
|
||||
__IO uint32_t RTSCR;
|
||||
@@ -2690,7 +2691,7 @@ typedef struct
|
||||
|
||||
__I uint32_t SR; //Status Register
|
||||
|
||||
__I uint32_t IF; //Interrupt Flag
|
||||
__I uint32_t IF; //Interrupt Flag,读取清零
|
||||
|
||||
__IO uint32_t IE; //Interrupt Enable
|
||||
|
||||
@@ -2712,7 +2713,8 @@ typedef struct
|
||||
|
||||
__IO uint32_t TXERR; //TX错误计数
|
||||
|
||||
union {
|
||||
union
|
||||
{
|
||||
struct
|
||||
{ //在复位时可读写,正常工作模式下不可访问
|
||||
__IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器
|
||||
@@ -2722,7 +2724,8 @@ typedef struct
|
||||
uint32_t RESERVED[5];
|
||||
} FILTER;
|
||||
|
||||
union { //在正常工作模式下可读写,复位时不可访问
|
||||
union
|
||||
{ //在正常工作模式下可读写,复位时不可访问
|
||||
struct
|
||||
{
|
||||
__O uint32_t INFO;
|
||||
@@ -2869,8 +2872,6 @@ typedef struct
|
||||
__IO uint32_t PRECMDV; //在MPU接口中,发送数据前,RS拉低的那一拍,数据总线上的值
|
||||
} LCD_TypeDef;
|
||||
|
||||
#define LCD_START_MPUEN_Pos 0 //0 RGB接口 1 MPU接口
|
||||
#define LCD_START_MPUEN_Msk (0x01 << LCD_START_MPUEN_Pos)
|
||||
#define LCD_START_GO_Pos 1 //写1开始传输数据,数据传输结束后自动清零
|
||||
#define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos)
|
||||
#define LCD_START_BURST_Pos 2
|
||||
@@ -3120,7 +3121,7 @@ typedef struct
|
||||
{
|
||||
__IO uint32_t DATA;
|
||||
__IO uint32_t ADDR;
|
||||
__IO uint32_t _ERASE; //和mmcsd_cmd.h(59)名字冲突,这里修改为_ERASE
|
||||
__IO uint32_t ERASE;
|
||||
__IO uint32_t CACHE;
|
||||
__IO uint32_t CFG0;
|
||||
__IO uint32_t CFG1;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
;******************************************************************************************************************************************
|
||||
; 文件名称: startup_SWM320.s
|
||||
; 功能说明: SWM2400单片机的启动文件
|
||||
; 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
; 注意事项:
|
||||
; 版本日期: V1.1.0 2017年10月25日
|
||||
; 升级记录:
|
||||
; 文件名称: startup_SWM320.s
|
||||
; 功能说明: SWM2400单片机的启动文件
|
||||
; 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
; 注意事项:
|
||||
; 版本日期: V1.1.0 2017年10月25日
|
||||
; 升级记录:
|
||||
;
|
||||
;
|
||||
;******************************************************************************************************************************************
|
||||
@@ -79,7 +79,7 @@ __Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD GPIOA5_Handler
|
||||
DCD GPIOA6_Handler
|
||||
DCD GPIOA7_Handler
|
||||
DCD GPIOB0_Handler
|
||||
DCD GPIOB0_Handler
|
||||
DCD GPIOB1_Handler
|
||||
DCD GPIOB2_Handler
|
||||
DCD GPIOB3_Handler
|
||||
@@ -103,19 +103,19 @@ __Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD GPIOM5_Handler
|
||||
DCD GPIOM6_Handler
|
||||
DCD GPIOM7_Handler
|
||||
DCD DMA_Handler
|
||||
DCD DMA_Handler
|
||||
DCD LCD_Handler
|
||||
DCD NORFLC_Handler
|
||||
DCD CAN_Handler
|
||||
DCD CAN_Handler
|
||||
DCD PULSE_Handler
|
||||
DCD WDT_Handler
|
||||
DCD PWM_Handler
|
||||
DCD UART0_Handler
|
||||
DCD UART1_Handler
|
||||
DCD UART2_Handler
|
||||
DCD UART3_Handler
|
||||
DCD 0
|
||||
DCD I2C0_Handler
|
||||
DCD UART1_Handler
|
||||
DCD UART2_Handler
|
||||
DCD UART3_Handler
|
||||
DCD 0
|
||||
DCD I2C0_Handler
|
||||
DCD I2C1_Handler
|
||||
DCD SPI0_Handler
|
||||
DCD ADC0_Handler
|
||||
@@ -130,13 +130,13 @@ __Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD GPIOP_Handler
|
||||
DCD ADC1_Handler
|
||||
DCD FPU_Handler
|
||||
DCD SPI1_Handler
|
||||
DCD TIMR0_Handler
|
||||
DCD TIMR1_Handler
|
||||
DCD TIMR2_Handler
|
||||
DCD TIMR3_Handler
|
||||
DCD TIMR4_Handler
|
||||
DCD TIMR5_Handler
|
||||
DCD SPI1_Handler
|
||||
DCD TIMR0_Handler
|
||||
DCD TIMR1_Handler
|
||||
DCD TIMR2_Handler
|
||||
DCD TIMR3_Handler
|
||||
DCD TIMR4_Handler
|
||||
DCD TIMR5_Handler
|
||||
|
||||
__Vectors_End
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ __isr_vector:
|
||||
.long TIMR4_Handler
|
||||
.long TIMR5_Handler
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.section .text.Reset_Handler
|
||||
.align 2
|
||||
.globl Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
|
||||
@@ -84,7 +84,7 @@ __vector_table
|
||||
DCD DMA_Handler
|
||||
DCD LCD_Handler
|
||||
DCD NORFLC_Handler
|
||||
DCD CAN_Handler
|
||||
DCD CAN_Handler
|
||||
DCD PULSE_Handler
|
||||
DCD WDT_Handler
|
||||
DCD PWM_Handler
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/******************************************************************************************************************************************
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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.
|
||||
*
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/********************************** PLL 设定 **********************************************
|
||||
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
|
||||
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
|
||||
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
|
||||
*****************************************************************************************/
|
||||
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
|
||||
|
||||
@@ -60,12 +60,12 @@
|
||||
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
|
||||
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称:
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称:
|
||||
* 功能说明: This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
|
||||
* 输 入:
|
||||
* 输 出:
|
||||
* 注意事项:
|
||||
* 输 入:
|
||||
* 输 出:
|
||||
* 注意事项:
|
||||
******************************************************************************************************************************************/
|
||||
void SystemCoreClockUpdate(void)
|
||||
{
|
||||
@@ -114,17 +114,19 @@ void SystemCoreClockUpdate(void)
|
||||
CyclesPerUs = SystemCoreClock / 1000000;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称:
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称:
|
||||
* 功能说明: 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振荡器
|
||||
@@ -152,6 +154,23 @@ void SystemInit(void)
|
||||
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)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,79 +1,77 @@
|
||||
#ifndef __SWM320_ADC_H__
|
||||
#define __SWM320_ADC_H__
|
||||
#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及其组合(即“按位或”运算)
|
||||
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及其组合(即“按位或”运算)
|
||||
} ADC_InitStructure;
|
||||
|
||||
#define ADC_CH0 0x01
|
||||
#define ADC_CH1 0x02
|
||||
#define ADC_CH2 0x04
|
||||
#define ADC_CH3 0x08
|
||||
#define ADC_CH4 0x10
|
||||
#define ADC_CH5 0x20
|
||||
#define ADC_CH6 0x40
|
||||
#define ADC_CH7 0x80
|
||||
#define ADC_CH0 0x01
|
||||
#define ADC_CH1 0x02
|
||||
#define ADC_CH2 0x04
|
||||
#define ADC_CH3 0x08
|
||||
#define ADC_CH4 0x10
|
||||
#define ADC_CH5 0x20
|
||||
#define ADC_CH6 0x40
|
||||
#define ADC_CH7 0x80
|
||||
|
||||
#define ADC_CLKSRC_HRC 1
|
||||
#define ADC_CLKSRC_VCO_DIV16 2
|
||||
#define ADC_CLKSRC_VCO_DIV32 3
|
||||
#define ADC_CLKSRC_VCO_DIV64 4
|
||||
#define ADC_CLKSRC_HRC 1
|
||||
#define ADC_CLKSRC_VCO_DIV16 2
|
||||
#define ADC_CLKSRC_VCO_DIV32 3
|
||||
#define ADC_CLKSRC_VCO_DIV64 4
|
||||
|
||||
#define ADC_AVG_SAMPLE1 0
|
||||
#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
|
||||
#define ADC_AVG_SAMPLE4 3
|
||||
#define ADC_AVG_SAMPLE8 7
|
||||
#define ADC_AVG_SAMPLE16 15
|
||||
#define ADC_AVG_SAMPLE1 0
|
||||
#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_PWM 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_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns);
|
||||
void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断使能
|
||||
void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断禁止
|
||||
void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断标志清除
|
||||
uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断状态
|
||||
|
||||
void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断使能
|
||||
void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断禁止
|
||||
void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断标志清除
|
||||
uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断状态
|
||||
|
||||
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断使能
|
||||
void ADC_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_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_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满中断状态
|
||||
|
||||
#endif //__SWM320_ADC_H__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,136 +1,134 @@
|
||||
#ifndef __SWM320_CAN_H__
|
||||
#define __SWM320_CAN_H__
|
||||
|
||||
#define CAN_FRAME_STD 0
|
||||
#define CAN_FRAME_EXT 1
|
||||
#define CAN_FRAME_STD 0
|
||||
#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
|
||||
union {
|
||||
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
|
||||
struct { // 0 must match 1 don't care
|
||||
uint16_t FilterMask16b1;
|
||||
uint16_t FilterMask16b2;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint32_t FilterCheck32b;
|
||||
struct {
|
||||
uint16_t FilterCheck16b1;
|
||||
uint16_t FilterCheck16b2;
|
||||
};
|
||||
};
|
||||
uint8_t RXNotEmptyIEn; //接收FIFO非空,有数据可读
|
||||
uint8_t RXOverflowIEn; //接收FIFO溢出,有数据丢失
|
||||
uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
|
||||
uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
|
||||
uint8_t CAN_BS1; //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
|
||||
uint8_t CAN_BS2; //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
|
||||
uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
|
||||
uint32_t Baudrate; //波特率,即位传输速率,取值1--1000000
|
||||
uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
|
||||
union
|
||||
{
|
||||
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
|
||||
struct
|
||||
{ // 0 must match 1 don't care
|
||||
uint16_t FilterMask16b1;
|
||||
uint16_t FilterMask16b2;
|
||||
};
|
||||
};
|
||||
union
|
||||
{
|
||||
uint32_t FilterCheck32b;
|
||||
struct
|
||||
{
|
||||
uint16_t FilterCheck16b1;
|
||||
uint16_t FilterCheck16b2;
|
||||
};
|
||||
};
|
||||
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
|
||||
#define CAN_BS1_3tq 2
|
||||
#define CAN_BS1_4tq 3
|
||||
#define CAN_BS1_5tq 4
|
||||
#define CAN_BS1_6tq 5
|
||||
#define CAN_BS1_7tq 6
|
||||
#define CAN_BS1_8tq 7
|
||||
#define CAN_BS1_9tq 8
|
||||
#define CAN_BS1_10tq 9
|
||||
#define CAN_BS1_11tq 10
|
||||
#define CAN_BS1_12tq 11
|
||||
#define CAN_BS1_13tq 12
|
||||
#define CAN_BS1_14tq 13
|
||||
#define CAN_BS1_15tq 14
|
||||
#define CAN_BS1_16tq 15
|
||||
#define CAN_BS1_1tq 0
|
||||
#define CAN_BS1_2tq 1
|
||||
#define CAN_BS1_3tq 2
|
||||
#define CAN_BS1_4tq 3
|
||||
#define CAN_BS1_5tq 4
|
||||
#define CAN_BS1_6tq 5
|
||||
#define CAN_BS1_7tq 6
|
||||
#define CAN_BS1_8tq 7
|
||||
#define CAN_BS1_9tq 8
|
||||
#define CAN_BS1_10tq 9
|
||||
#define CAN_BS1_11tq 10
|
||||
#define CAN_BS1_12tq 11
|
||||
#define CAN_BS1_13tq 12
|
||||
#define CAN_BS1_14tq 13
|
||||
#define CAN_BS1_15tq 14
|
||||
#define CAN_BS1_16tq 15
|
||||
|
||||
#define CAN_BS2_1tq 0
|
||||
#define CAN_BS2_2tq 1
|
||||
#define CAN_BS2_3tq 2
|
||||
#define CAN_BS2_4tq 3
|
||||
#define CAN_BS2_5tq 4
|
||||
#define CAN_BS2_6tq 5
|
||||
#define CAN_BS2_7tq 6
|
||||
#define CAN_BS2_8tq 7
|
||||
#define CAN_BS2_1tq 0
|
||||
#define CAN_BS2_2tq 1
|
||||
#define CAN_BS2_3tq 2
|
||||
#define CAN_BS2_4tq 3
|
||||
#define CAN_BS2_5tq 4
|
||||
#define CAN_BS2_6tq 5
|
||||
#define CAN_BS2_7tq 6
|
||||
#define CAN_BS2_8tq 7
|
||||
|
||||
#define CAN_SJW_1tq 0
|
||||
#define CAN_SJW_2tq 1
|
||||
#define CAN_SJW_3tq 2
|
||||
#define CAN_SJW_4tq 3
|
||||
#define CAN_SJW_1tq 0
|
||||
#define CAN_SJW_2tq 1
|
||||
#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]; //接收到的数据
|
||||
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]; //接收到的数据
|
||||
} CAN_RXMessage;
|
||||
|
||||
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
|
||||
void CAN_Open(CAN_TypeDef *CANx);
|
||||
void CAN_Close(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct);
|
||||
void CAN_Open(CAN_TypeDef * CANx);
|
||||
void CAN_Close(CAN_TypeDef * CANx);
|
||||
void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
|
||||
void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once);
|
||||
void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg);
|
||||
|
||||
void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
|
||||
void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once);
|
||||
void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg);
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef *CANx);
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef *CANx);
|
||||
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef * CANx);
|
||||
void CAN_AbortTransmit(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_AbortTransmit(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx);
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx);
|
||||
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx);
|
||||
void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
|
||||
|
||||
void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
|
||||
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
|
||||
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
|
||||
|
||||
void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask);
|
||||
void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef * CANx);
|
||||
void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
|
||||
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTErrWarningEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrWarningDis(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_INTErrWarningStat(CAN_TypeDef * CANx);
|
||||
void CAN_INTWakeupEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTWakeupDis(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_INTErrPassiveEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTWakeupEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTWakeupDis(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_INTWakeupStat(CAN_TypeDef * CANx);
|
||||
void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_INTErrPassiveStat(CAN_TypeDef * CANx);
|
||||
void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTBusErrorDis(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__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_crc.c
|
||||
* 功能说明: SWM320单片机的CRC模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_crc.c
|
||||
* 功能说明: SWM320单片机的CRC模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -21,31 +21,30 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_crc.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CRC_Init()
|
||||
* 功能说明: CRC 初始化
|
||||
* 输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括CRC
|
||||
* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
|
||||
* uint32_t out_not 输出结果是否取反
|
||||
* uint32_t out_rev 输出结果是否翻转
|
||||
* uint32_t ini_val CRC初始值
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CRC_Init()
|
||||
* 功能说明: CRC 初始化
|
||||
* 输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括CRC
|
||||
* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
|
||||
* uint32_t out_not 输出结果是否取反
|
||||
* uint32_t out_rev 输出结果是否翻转
|
||||
* uint32_t ini_val CRC初始值
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
|
||||
void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
|
||||
{
|
||||
switch((uint32_t)CRCx)
|
||||
{
|
||||
case ((uint32_t)CRC):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
CRCx->CR = (1 << CRC_CR_EN_Pos) |
|
||||
(mode << CRC_CR_CRC16_Pos) |
|
||||
(out_not << CRC_CR_ONOT_Pos) |
|
||||
(out_rev << CRC_CR_OREV_Pos);
|
||||
|
||||
CRCx->INIVAL = ini_val;
|
||||
switch ((uint32_t)CRCx)
|
||||
{
|
||||
case ((uint32_t)CRC):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
CRCx->CR = (1 << CRC_CR_EN_Pos) |
|
||||
(mode << CRC_CR_CRC16_Pos) |
|
||||
(out_not << CRC_CR_ONOT_Pos) |
|
||||
(out_rev << CRC_CR_OREV_Pos);
|
||||
|
||||
CRCx->INIVAL = ini_val;
|
||||
}
|
||||
|
||||
@@ -1,39 +1,36 @@
|
||||
#ifndef __SWM320_CRC_H__
|
||||
#define __SWM320_CRC_H__
|
||||
|
||||
#define CRC32_IN32 0 //CRC32算法,输入数据32位
|
||||
#define CRC32_IN16 2 //CRC32算法,输入数据16位
|
||||
#define CRC32_IN8 4 //CRC32算法,输入数据 8位
|
||||
#define CRC16_IN16 3 //CRC16算法,输入数据16位
|
||||
#define CRC16_IN8 5 //CRC16算法,输入数据 8位
|
||||
|
||||
#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);
|
||||
|
||||
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)
|
||||
{
|
||||
CRC->DATAIN = data;
|
||||
CRC->DATAIN = data;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CRC_Result()
|
||||
* 功能说明: 获取CRC计算结果
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t CRC 计算结果
|
||||
* 注意事项: 无
|
||||
* 函数名称: CRC_Result()
|
||||
* 功能说明: 获取CRC计算结果
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t CRC 计算结果
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
static __INLINE uint32_t CRC_Result(void)
|
||||
{
|
||||
return CRC->RESULT;
|
||||
return CRC->RESULT;
|
||||
}
|
||||
|
||||
#endif //__SWM320_CRC_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_dma.c
|
||||
* 功能说明: SWM320单片机的DMA功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_dma.c
|
||||
* 功能说明: SWM320单片机的DMA功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -22,117 +22,119 @@
|
||||
#include "SWM320_dma.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CHM_Config()
|
||||
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t dst_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t num_word 要搬运的数据字数,最大1024
|
||||
* uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 搬运数据量以字为单元,不是字节
|
||||
* 函数名称: DMA_CHM_Config()
|
||||
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t dst_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t num_word 要搬运的数据字数,最大1024
|
||||
* uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 搬运数据量以字为单元,不是字节
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
|
||||
{
|
||||
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
|
||||
|
||||
DMA_CH_Close(chn); //配置前先关闭该通道
|
||||
|
||||
DMA->CH[chn].SRC = src_addr;
|
||||
DMA->CH[chn].DST = dst_addr;
|
||||
|
||||
DMA->CH[chn].CR = ((num_word*4-1) << DMA_CR_LEN_Pos) |
|
||||
(0 << DMA_CR_AUTORE_Pos);
|
||||
|
||||
DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
|
||||
(dst_addr_incr << DMA_AM_DSTAM_Pos) |
|
||||
(0 << DMA_AM_BURST_Pos);
|
||||
|
||||
DMA->IF = (1 << chn); //清除中断标志
|
||||
DMA->IE |= (1 << chn);
|
||||
if(int_en) DMA->IM &= ~(1 << chn);
|
||||
else DMA->IM |= (1 << chn);
|
||||
|
||||
if(int_en)
|
||||
{
|
||||
NVIC_EnableIRQ(DMA_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
||||
}
|
||||
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
|
||||
|
||||
DMA_CH_Close(chn); //配置前先关闭该通道
|
||||
|
||||
DMA->CH[chn].SRC = src_addr;
|
||||
DMA->CH[chn].DST = dst_addr;
|
||||
|
||||
DMA->CH[chn].CR = ((num_word * 4 - 1) << DMA_CR_LEN_Pos) |
|
||||
(0 << DMA_CR_AUTORE_Pos);
|
||||
|
||||
DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
|
||||
(dst_addr_incr << DMA_AM_DSTAM_Pos) |
|
||||
(0 << DMA_AM_BURST_Pos);
|
||||
|
||||
DMA->IF = (1 << chn); //清除中断标志
|
||||
DMA->IE |= (1 << chn);
|
||||
if (int_en)
|
||||
DMA->IM &= ~(1 << chn);
|
||||
else
|
||||
DMA->IM |= (1 << chn);
|
||||
|
||||
if (int_en)
|
||||
{
|
||||
NVIC_EnableIRQ(DMA_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_Open()
|
||||
* 功能说明: DMA通道打开
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_Open()
|
||||
* 功能说明: DMA通道打开
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_Open(uint32_t chn)
|
||||
{
|
||||
DMA->CH[chn].CR |= (1 << DMA_CR_TXEN_Pos);
|
||||
DMA->CH[chn].CR |= (1 << DMA_CR_TXEN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_Close()
|
||||
* 功能说明: DMA通道关闭
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_Close()
|
||||
* 功能说明: DMA通道关闭
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_Close(uint32_t chn)
|
||||
{
|
||||
DMA->CH[chn].CR &= ~(1 << DMA_CR_TXEN_Pos);
|
||||
DMA->CH[chn].CR &= ~(1 << DMA_CR_TXEN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTEn()
|
||||
* 功能说明: DMA中断使能,数据搬运完成后触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTEn()
|
||||
* 功能说明: DMA中断使能,数据搬运完成后触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTEn(uint32_t chn)
|
||||
{
|
||||
DMA->IM &= ~(1 << chn);
|
||||
DMA->IM &= ~(1 << chn);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTDis()
|
||||
* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTDis()
|
||||
* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTDis(uint32_t chn)
|
||||
{
|
||||
DMA->IM |= (1 << chn);
|
||||
DMA->IM |= (1 << chn);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTClr()
|
||||
* 功能说明: DMA中断标志清除
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTClr()
|
||||
* 功能说明: DMA中断标志清除
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTClr(uint32_t chn)
|
||||
{
|
||||
DMA->IF = (1 << chn);
|
||||
DMA->IF = (1 << chn);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTStat()
|
||||
* 功能说明: DMA中断状态查询
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTStat()
|
||||
* 功能说明: DMA中断状态查询
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t DMA_CH_INTStat(uint32_t chn)
|
||||
{
|
||||
return (DMA->IF & (1 << chn)) ? 1 : 0;
|
||||
{
|
||||
return (DMA->IF & (1 << chn)) ? 1 : 0;
|
||||
}
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
#ifndef __SWM320_DMA_H__
|
||||
#define __SWM320_DMA_H__
|
||||
|
||||
#define DMA_CH0 0
|
||||
#define DMA_CH1 1
|
||||
#define DMA_CH2 2
|
||||
|
||||
#define DMA_CH0 0
|
||||
#define DMA_CH1 1
|
||||
#define DMA_CH2 2
|
||||
|
||||
|
||||
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
void DMA_CH_Open(uint32_t chn); //DMA通道打开
|
||||
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
|
||||
|
||||
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_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 数据搬运未完成
|
||||
|
||||
#endif //__SWM320_DMA_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
* @attention
|
||||
@@ -21,111 +21,111 @@
|
||||
#include "SWM320_exti.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Init()
|
||||
* 功能说明: 指定引脚外部中断初始化
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
||||
* 输 出: 无
|
||||
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
|
||||
* 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
|
||||
* 函数名称: EXTI_Init()
|
||||
* 功能说明: 指定引脚外部中断初始化
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
||||
* 输 出: 无
|
||||
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
|
||||
* 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
|
||||
void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
|
||||
{
|
||||
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
|
||||
|
||||
if(mode & 0x10)
|
||||
{
|
||||
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
|
||||
|
||||
if(mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
|
||||
|
||||
if(mode & 0x02)
|
||||
{
|
||||
GPIOx->INTBE |= (0x01 << n); //双边沿触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
|
||||
|
||||
if(mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
|
||||
}
|
||||
}
|
||||
|
||||
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
|
||||
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
|
||||
|
||||
if (mode & 0x10)
|
||||
{
|
||||
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
|
||||
|
||||
if (mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
|
||||
|
||||
if (mode & 0x02)
|
||||
{
|
||||
GPIOx->INTBE |= (0x01 << n); //双边沿触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
|
||||
|
||||
if (mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
|
||||
}
|
||||
}
|
||||
|
||||
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Open()
|
||||
* 功能说明: 指定引脚外部中断打开(即使能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_Open()
|
||||
* 功能说明: 指定引脚外部中断打开(即使能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTEN |= (0x01 << n);
|
||||
GPIOx->INTEN |= (0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Close()
|
||||
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_Close()
|
||||
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTEN &= ~(0x01 << n);
|
||||
GPIOx->INTEN &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_State()
|
||||
* 功能说明: 指定引脚是否触发了中断
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_State()
|
||||
* 功能说明: 指定引脚是否触发了中断
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
return (GPIOx->INTSTAT >> n) & 0x01;
|
||||
return (GPIOx->INTSTAT >> n) & 0x01;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_RawState()
|
||||
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_RawState()
|
||||
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
return (GPIOx->INTRAWSTAT >> n) & 0x01;
|
||||
return (GPIOx->INTRAWSTAT >> n) & 0x01;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Clear()
|
||||
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
||||
* 函数名称: EXTI_Clear()
|
||||
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTCLR = (0x01 << n);
|
||||
GPIOx->INTCLR = (0x01 << n);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
#ifndef __SWM320_EXTI_H__
|
||||
#define __SWM320_EXTI_H__
|
||||
#define __SWM320_EXTI_H__
|
||||
|
||||
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
|
||||
void EXTI_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); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
|
||||
|
||||
#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 //高电平触发中断
|
||||
uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否触发了中断
|
||||
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
|
||||
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
|
||||
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
|
||||
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
|
||||
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
|
||||
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
|
||||
|
||||
#endif //__SWM320_EXTI_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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
|
||||
*
|
||||
@@ -19,63 +19,77 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_flash.h"
|
||||
|
||||
|
||||
IAP_Cache_Reset_t IAP_Cache_Reset = (IAP_Cache_Reset_t)0x11000601;
|
||||
IAP_Flash_Param_t IAP_Flash_Param = (IAP_Flash_Param_t)0x11000681;
|
||||
IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781;
|
||||
IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: FLASH_Erase()
|
||||
* 功能说明: 片内Flash擦除
|
||||
* 输 入: uint32_t addr 擦除地址,扇区大小为4K Byte
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: FLASH_Erase()
|
||||
* 功能说明: 片内Flash擦除
|
||||
* 输 入: uint32_t addr 擦除地址,扇区大小为4K Byte
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void FLASH_Erase(uint32_t addr)
|
||||
{
|
||||
__disable_irq();
|
||||
|
||||
IAP_Flash_Erase(addr / 0x1000);
|
||||
|
||||
IAP_Cache_Reset();
|
||||
|
||||
__enable_irq();
|
||||
{
|
||||
__disable_irq();
|
||||
|
||||
IAP_Flash_Erase(addr / 0x1000);
|
||||
|
||||
IAP_Cache_Reset();
|
||||
|
||||
__enable_irq();
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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)
|
||||
{
|
||||
__disable_irq();
|
||||
|
||||
IAP_Flash_Write(addr, (uint32_t)buff, count/4);
|
||||
|
||||
IAP_Cache_Reset();
|
||||
|
||||
__enable_irq();
|
||||
__disable_irq();
|
||||
|
||||
IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
|
||||
|
||||
IAP_Cache_Reset();
|
||||
|
||||
__enable_irq();
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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();
|
||||
|
||||
IAP_Flash_Param(0x48a, 0xabfc7a6e);
|
||||
|
||||
__enable_irq();
|
||||
__disable_irq();
|
||||
switch (x)
|
||||
{
|
||||
case 30:
|
||||
IAP_Flash_Param(0x489, 0xabf41f25);
|
||||
break;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
#ifndef __SWM320_FLASH_H__
|
||||
#define __SWM320_FLASH_H__
|
||||
|
||||
|
||||
void FLASH_Erase(uint32_t addr);
|
||||
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
|
||||
|
||||
void Flash_Param_at_120MHz(void);
|
||||
|
||||
|
||||
void Flash_Param_at_xMHz(uint32_t x);
|
||||
|
||||
typedef void (*IAP_Cache_Reset_t)(void);
|
||||
typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
|
||||
@@ -19,5 +16,4 @@ extern IAP_Flash_Param_t IAP_Flash_Param;
|
||||
extern IAP_Flash_Erase_t IAP_Flash_Erase;
|
||||
extern IAP_Flash_Write_t IAP_Flash_Write;
|
||||
|
||||
|
||||
#endif //__SWM320_FLASH_H__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,24 +1,22 @@
|
||||
#ifndef __SWM320_GPIO_H__
|
||||
#define __SWM320_GPIO_H__
|
||||
#define __SWM320_GPIO_H__
|
||||
|
||||
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
|
||||
|
||||
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
|
||||
|
||||
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置高
|
||||
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置低
|
||||
void GPIO_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);
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n);
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_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);
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n);
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
|
||||
#endif //__SWM320_GPIO_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_i2c.c
|
||||
* 功能说明: SWM320单片机的I2C串行接口功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_i2c.c
|
||||
* 功能说明: SWM320单片机的I2C串行接口功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -22,194 +22,198 @@
|
||||
#include "SWM320_i2c.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Init()
|
||||
* 功能说明: I2C初始化
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 模块只能工作于主机模式
|
||||
* 函数名称: I2C_Init()
|
||||
* 功能说明: I2C初始化
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 模块只能工作于主机模式
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
||||
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C1_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
|
||||
|
||||
if(initStruct->Master == 1)
|
||||
{
|
||||
I2Cx->CLKDIV = SystemCoreClock/5/initStruct->MstClk;
|
||||
|
||||
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
|
||||
I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
|
||||
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
|
||||
|
||||
switch((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if(initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C0_IRQn);
|
||||
}
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if(initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C1_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
I2Cx->SLVCR |= (1 << I2C_SLVCR_SLAVE_Pos);
|
||||
|
||||
I2Cx->SLVCR &= ~(I2C_SLVCR_ADDR7b_Msk | I2C_SLVCR_ADDR_Msk);
|
||||
I2Cx->SLVCR |= (1 << I2C_SLVCR_ACK_Pos) |
|
||||
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
|
||||
(initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
|
||||
|
||||
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
|
||||
I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
|
||||
I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
|
||||
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
|
||||
((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
|
||||
((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
|
||||
((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
|
||||
((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
|
||||
((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
|
||||
|
||||
switch((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C0_IRQn);
|
||||
}
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C1_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C1_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
|
||||
|
||||
if (initStruct->Master == 1)
|
||||
{
|
||||
I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
|
||||
|
||||
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
|
||||
I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
|
||||
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
|
||||
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if (initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C0_IRQn);
|
||||
}
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if (initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C1_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
I2Cx->SLVCR |= (1 << I2C_SLVCR_SLAVE_Pos);
|
||||
|
||||
I2Cx->SLVCR &= ~(I2C_SLVCR_ADDR7b_Msk | I2C_SLVCR_ADDR_Msk);
|
||||
I2Cx->SLVCR |= (1 << I2C_SLVCR_ACK_Pos) |
|
||||
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
|
||||
(initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
|
||||
|
||||
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
|
||||
I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
|
||||
I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
|
||||
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
|
||||
((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
|
||||
((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
|
||||
((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
|
||||
((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
|
||||
((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
|
||||
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C0_IRQn);
|
||||
}
|
||||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(I2C1_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Open()
|
||||
* 功能说明: I2C打开,允许收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Open()
|
||||
* 功能说明: I2C打开,允许收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Open(I2C_TypeDef * I2Cx)
|
||||
void I2C_Open(I2C_TypeDef *I2Cx)
|
||||
{
|
||||
I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
|
||||
I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Close()
|
||||
* 功能说明: I2C关闭,禁止收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Close()
|
||||
* 功能说明: I2C关闭,禁止收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Close(I2C_TypeDef * I2Cx)
|
||||
void I2C_Close(I2C_TypeDef *I2Cx)
|
||||
{
|
||||
I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
|
||||
I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Start()
|
||||
* 功能说明: 产生起始信号并发送设备地址
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t addr 设备地址
|
||||
* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Start()
|
||||
* 功能说明: 产生起始信号并发送设备地址
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t addr 设备地址
|
||||
* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint8_t I2C_Start(I2C_TypeDef * I2Cx, uint8_t addr)
|
||||
uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr)
|
||||
{
|
||||
I2Cx->MSTDAT = addr;
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
|
||||
(1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址
|
||||
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
|
||||
|
||||
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
|
||||
I2Cx->MSTDAT = addr;
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
|
||||
(1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址
|
||||
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
|
||||
__NOP(); //等待发送完成
|
||||
|
||||
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Stop()
|
||||
* 功能说明: 产生停止信号
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Stop()
|
||||
* 功能说明: 产生停止信号
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Stop(I2C_TypeDef * I2Cx)
|
||||
void I2C_Stop(I2C_TypeDef *I2Cx)
|
||||
{
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
|
||||
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
|
||||
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
|
||||
__NOP(); //等待发送完成
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Write()
|
||||
* 功能说明: 写入一个数据
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t data 要写的数据
|
||||
* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Write()
|
||||
* 功能说明: 写入一个数据
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t data 要写的数据
|
||||
* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint8_t I2C_Write(I2C_TypeDef * I2Cx, uint8_t data)
|
||||
{
|
||||
I2Cx->MSTDAT = data;
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
|
||||
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待发送完成
|
||||
|
||||
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
|
||||
uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data)
|
||||
{
|
||||
I2Cx->MSTDAT = data;
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
|
||||
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
|
||||
__NOP(); //等待发送完成
|
||||
|
||||
return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Read()
|
||||
* 功能说明: 读取一个数据
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t ack 1 发送ACK 0 发送NACK
|
||||
* 输 出: uint8_t 读取到的数据
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Read()
|
||||
* 功能说明: 读取一个数据
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* uint8_t ack 1 发送ACK 0 发送NACK
|
||||
* 输 出: uint8_t 读取到的数据
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint8_t I2C_Read(I2C_TypeDef * I2Cx, uint8_t ack)
|
||||
uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack)
|
||||
{
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
|
||||
((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
|
||||
while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //等待接收完成
|
||||
|
||||
I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
|
||||
((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
|
||||
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
|
||||
__NOP(); //等待接收完成
|
||||
|
||||
return I2Cx->MSTDAT;
|
||||
}
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
#ifndef __SWM320_I2C_H__
|
||||
#define __SWM320_I2C_H__
|
||||
|
||||
typedef struct {
|
||||
uint8_t Master; //1 主机模式
|
||||
uint8_t Addr7b; //1 7位地址 0 10位地址
|
||||
|
||||
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; //从机接收到写请求中断使能
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Master; //1 主机模式
|
||||
uint8_t Addr7b; //1 7位地址 0 10位地址
|
||||
|
||||
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; //从机接收到写请求中断使能
|
||||
} I2C_InitStructure;
|
||||
|
||||
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
|
||||
|
||||
void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct);
|
||||
void I2C_Open(I2C_TypeDef *I2Cx);
|
||||
void I2C_Close(I2C_TypeDef *I2Cx);
|
||||
|
||||
void I2C_Open(I2C_TypeDef * I2Cx);
|
||||
void I2C_Close(I2C_TypeDef * I2Cx);
|
||||
|
||||
uint8_t I2C_Start(I2C_TypeDef * I2Cx, uint8_t addr);
|
||||
void I2C_Stop(I2C_TypeDef * I2Cx);
|
||||
uint8_t I2C_Write(I2C_TypeDef * I2Cx, uint8_t data);
|
||||
uint8_t I2C_Read(I2C_TypeDef * I2Cx, uint8_t ack);
|
||||
uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr);
|
||||
void I2C_Stop(I2C_TypeDef *I2Cx);
|
||||
uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data);
|
||||
uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack);
|
||||
|
||||
#endif //__SWM320_I2C_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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,131 +24,124 @@
|
||||
#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)
|
||||
{
|
||||
switch((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
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->IE = 1;
|
||||
LCDx->IF = 1; //清除标志
|
||||
if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
|
||||
else LCD_INTDis(LCDx);
|
||||
|
||||
switch((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
if(initStruct->IntEOTEn)
|
||||
{
|
||||
NVIC_EnableIRQ(LCD_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(LCD_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
|
||||
{
|
||||
switch ((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
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; //清除标志
|
||||
if (initStruct->IntEOTEn)
|
||||
LCD_INTEn(LCDx);
|
||||
else
|
||||
LCD_INTDis(LCDx);
|
||||
|
||||
switch ((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
if (initStruct->IntEOTEn)
|
||||
{
|
||||
NVIC_EnableIRQ(LCD_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVIC_DisableIRQ(LCD_IRQn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: LCD_Start()
|
||||
* 功能说明: 启动一次数据传输
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: LCD_Start()
|
||||
* 功能说明: 启动一次数据传输
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_Start(LCD_TypeDef * LCDx)
|
||||
void LCD_Start(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
|
||||
LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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)
|
||||
uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
|
||||
{
|
||||
return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
|
||||
return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: LCD_INTEn()
|
||||
* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: LCD_INTEn()
|
||||
* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTEn(LCD_TypeDef * LCDx)
|
||||
void LCD_INTEn(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->IM = 0;
|
||||
LCDx->IM = 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: LCD_INTDis()
|
||||
* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: LCD_INTDis()
|
||||
* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTDis(LCD_TypeDef * LCDx)
|
||||
void LCD_INTDis(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->IM = 1;
|
||||
LCDx->IM = 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: LCD_INTClr()
|
||||
* 功能说明: LCD中断标志清除
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: LCD_INTClr()
|
||||
* 功能说明: LCD中断标志清除
|
||||
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTClr(LCD_TypeDef * LCDx)
|
||||
void LCD_INTClr(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->IF = 1;
|
||||
LCDx->IF = 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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)
|
||||
uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
|
||||
{
|
||||
return (LCDx->IF & 0x01) ? 1 : 0;
|
||||
return (LCDx->IF & 0x01) ? 1 : 0;
|
||||
}
|
||||
|
||||
@@ -1,80 +1,70 @@
|
||||
#ifndef __SWM320_LCD_H__
|
||||
#define __SWM320_LCD_H__
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t HnPixel; //水平方向像素个数,最大取值1024
|
||||
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
|
||||
uint8_t Hfp; //horizonal front porch,最大取值32
|
||||
uint8_t Hbp; //horizonal back porch, 最大取值128
|
||||
uint8_t Vfp; //vertical front porch, 最大取值8
|
||||
uint8_t Vbp; //vertical back porch, 最大取值32
|
||||
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
|
||||
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
|
||||
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
|
||||
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
|
||||
|
||||
typedef struct {
|
||||
uint8_t Interface; //LCD屏接口:LCD_INTERFACE_RGB、LCD_INTERFACE_I80、LCD_INTERFACE_M68
|
||||
|
||||
/* RGB同步接口参数 */
|
||||
uint16_t HnPixel; //水平方向像素个数,最大取值1024
|
||||
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
|
||||
uint8_t Hfp; //horizonal front porch,最大取值32
|
||||
uint8_t Hbp; //horizonal back porch, 最大取值128
|
||||
uint8_t Vfp; //vertical front porch, 最大取值8
|
||||
uint8_t Vbp; //vertical back porch, 最大取值32
|
||||
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
|
||||
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
|
||||
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
|
||||
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
|
||||
|
||||
uint8_t IntEOTEn; //End of Transter(传输完成)中断使能
|
||||
uint8_t IntEOTEn; //End of Transter(传输完成)中断使能
|
||||
} LCD_InitStructure;
|
||||
|
||||
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
|
||||
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
|
||||
|
||||
#define LCD_INTERFACE_RGB 0
|
||||
#define LCD_INTERFACE_I80 1
|
||||
#define LCD_INTERFACE_M68 2
|
||||
#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
|
||||
#define LCD_HSYNC_2DOTCLK 1
|
||||
#define LCD_HSYNC_3DOTCLK 2
|
||||
#define LCD_HSYNC_4DOTCLK 3
|
||||
|
||||
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
|
||||
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
|
||||
#define LCD_CLKDIV_2 0
|
||||
#define LCD_CLKDIV_4 1
|
||||
#define LCD_CLKDIV_6 2
|
||||
#define LCD_CLKDIV_8 3
|
||||
#define LCD_CLKDIV_10 4
|
||||
#define LCD_CLKDIV_12 5
|
||||
#define LCD_CLKDIV_14 6
|
||||
#define LCD_CLKDIV_16 7
|
||||
#define LCD_CLKDIV_18 8
|
||||
#define LCD_CLKDIV_20 9
|
||||
#define LCD_CLKDIV_22 10
|
||||
#define LCD_CLKDIV_24 11
|
||||
#define LCD_CLKDIV_26 12
|
||||
#define LCD_CLKDIV_28 13
|
||||
#define LCD_CLKDIV_30 14
|
||||
#define LCD_CLKDIV_32 15
|
||||
#define LCD_CLKDIV_34 16
|
||||
#define LCD_CLKDIV_36 17
|
||||
#define LCD_CLKDIV_38 18
|
||||
#define LCD_CLKDIV_40 19
|
||||
#define LCD_CLKDIV_42 20
|
||||
#define LCD_CLKDIV_44 21
|
||||
#define LCD_CLKDIV_46 22
|
||||
#define LCD_CLKDIV_48 23
|
||||
#define LCD_CLKDIV_50 24
|
||||
#define LCD_CLKDIV_52 25
|
||||
#define LCD_CLKDIV_54 26
|
||||
#define LCD_CLKDIV_56 27
|
||||
#define LCD_CLKDIV_58 28
|
||||
#define LCD_CLKDIV_60 29
|
||||
#define LCD_CLKDIV_62 30
|
||||
#define LCD_CLKDIV_64 31
|
||||
|
||||
#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
|
||||
#define LCD_HSYNC_2DOTCLK 1
|
||||
#define LCD_HSYNC_3DOTCLK 2
|
||||
#define LCD_HSYNC_4DOTCLK 3
|
||||
|
||||
#define LCD_CLKDIV_2 0
|
||||
#define LCD_CLKDIV_4 1
|
||||
#define LCD_CLKDIV_6 2
|
||||
#define LCD_CLKDIV_8 3
|
||||
#define LCD_CLKDIV_10 4
|
||||
#define LCD_CLKDIV_12 5
|
||||
#define LCD_CLKDIV_14 6
|
||||
#define LCD_CLKDIV_16 7
|
||||
#define LCD_CLKDIV_18 8
|
||||
#define LCD_CLKDIV_20 9
|
||||
#define LCD_CLKDIV_22 10
|
||||
#define LCD_CLKDIV_24 11
|
||||
#define LCD_CLKDIV_26 12
|
||||
#define LCD_CLKDIV_28 13
|
||||
#define LCD_CLKDIV_30 14
|
||||
#define LCD_CLKDIV_32 15
|
||||
#define LCD_CLKDIV_34 16
|
||||
#define LCD_CLKDIV_36 17
|
||||
#define LCD_CLKDIV_38 18
|
||||
#define LCD_CLKDIV_40 19
|
||||
#define LCD_CLKDIV_42 20
|
||||
#define LCD_CLKDIV_44 21
|
||||
#define LCD_CLKDIV_46 22
|
||||
#define LCD_CLKDIV_48 23
|
||||
#define LCD_CLKDIV_50 24
|
||||
#define LCD_CLKDIV_52 25
|
||||
#define LCD_CLKDIV_54 26
|
||||
#define LCD_CLKDIV_56 27
|
||||
#define LCD_CLKDIV_58 28
|
||||
#define LCD_CLKDIV_60 29
|
||||
#define LCD_CLKDIV_62 30
|
||||
#define LCD_CLKDIV_64 31
|
||||
|
||||
|
||||
void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct);
|
||||
void LCD_Start(LCD_TypeDef * LCDx);
|
||||
uint32_t LCD_IsBusy(LCD_TypeDef * LCDx);
|
||||
|
||||
void LCD_INTEn(LCD_TypeDef * LCDx);
|
||||
void LCD_INTDis(LCD_TypeDef * LCDx);
|
||||
void LCD_INTClr(LCD_TypeDef * LCDx);
|
||||
uint32_t LCD_INTStat(LCD_TypeDef * LCDx);
|
||||
void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
|
||||
void LCD_Start(LCD_TypeDef *LCDx);
|
||||
uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
|
||||
|
||||
void LCD_INTEn(LCD_TypeDef *LCDx);
|
||||
void LCD_INTDis(LCD_TypeDef *LCDx);
|
||||
void LCD_INTClr(LCD_TypeDef *LCDx);
|
||||
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
|
||||
|
||||
#endif //__SWM320_LCD_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_norflash.c
|
||||
* 功能说明: SWM320单片机的NOR Flash驱动程序
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_norflash.c
|
||||
* 功能说明: SWM320单片机的NOR Flash驱动程序
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -21,152 +21,167 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_norflash.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Init()
|
||||
* 功能说明: NOR Flash控制器初始化
|
||||
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_Init()
|
||||
* 功能说明: NOR Flash控制器初始化
|
||||
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void NORFL_Init(NORFL_InitStructure * initStruct)
|
||||
void NORFL_Init(NORFL_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do {
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while(0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
|
||||
|
||||
NORFLC->CR = ((initStruct->DataWidth == 8 ? 1 : 0) << NORFLC_CR_BYTEIF_Pos) |
|
||||
(initStruct->WELowPulseTime << NORFLC_CR_WRTIME_Pos) |
|
||||
(initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
|
||||
|
||||
NORFLC->IE = 3;
|
||||
NORFLC->IF = 3; // 清除中断标志
|
||||
if(initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
|
||||
else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
|
||||
if(initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do
|
||||
{
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for (i = 0; i < 1000; i++)
|
||||
__NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while (0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
|
||||
|
||||
NORFLC->CR = ((initStruct->DataWidth == 8 ? 1 : 0) << NORFLC_CR_BYTEIF_Pos) |
|
||||
(initStruct->WELowPulseTime << NORFLC_CR_WRTIME_Pos) |
|
||||
(initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
|
||||
|
||||
NORFLC->IE = 3;
|
||||
NORFLC->IF = 3; // 清除中断标志
|
||||
if (initStruct->OperFinishIEn)
|
||||
NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
|
||||
else
|
||||
NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
|
||||
if (initStruct->OperTimeoutIEn)
|
||||
NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
else
|
||||
NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_ChipErase()
|
||||
* 功能说明: NOR Flash整片擦除
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_ChipErase()
|
||||
* 功能说明: NOR Flash整片擦除
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_ChipErase(void)
|
||||
{
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_SectorErase()
|
||||
* 功能说明: NOR Flash扇区擦除
|
||||
* 输 入: uint32_t addr 要擦除扇区的起始地址
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
||||
* 函数名称: NORFL_SectorErase()
|
||||
* 功能说明: NOR Flash扇区擦除
|
||||
* 输 入: uint32_t addr 要擦除扇区的起始地址
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_SectorErase(uint32_t addr)
|
||||
{
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Write()
|
||||
* 功能说明: NOR Flash写
|
||||
* 输 入: uint32_t addr 数据要写入的地址
|
||||
* uint32_t data 要写入的数据
|
||||
* 输 出: uint32_t 0 写入成功 1 写入超时
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入
|
||||
* 函数名称: NORFL_Write()
|
||||
* 功能说明: NOR Flash写
|
||||
* 输 入: uint32_t addr 数据要写入的地址
|
||||
* uint32_t data 要写入的数据
|
||||
* 输 出: uint32_t 0 写入成功 1 写入超时
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_Write(uint32_t addr, uint32_t data)
|
||||
{
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
uint32_t res;
|
||||
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
|
||||
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Read()
|
||||
* 功能说明: NOR Flash读
|
||||
* 输 入: uint32_t addr 数据要读出的地址
|
||||
* 输 出: uint32_t 读出的数据
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出
|
||||
* 函数名称: NORFL_Read()
|
||||
* 功能说明: NOR Flash读
|
||||
* 输 入: uint32_t addr 数据要读出的地址
|
||||
* 输 出: uint32_t 读出的数据
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_Read(uint32_t addr)
|
||||
{
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
return (NORFLC->CMD & NORFLC_CMD_DATA_Msk);
|
||||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
return (NORFLC->CMD & NORFLC_CMD_DATA_Msk);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_ReadID()
|
||||
* 功能说明: NOR Flash读ID
|
||||
* 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同
|
||||
* 输 出: uint16_t 读取到的ID
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_ReadID()
|
||||
* 功能说明: NOR Flash读ID
|
||||
* 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同
|
||||
* 输 出: uint16_t 读取到的ID
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint16_t NORFL_ReadID(uint32_t id_addr)
|
||||
{
|
||||
uint16_t id;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_AUTO_SELECT << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
NORFLC->ADDR = id_addr;
|
||||
NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
|
||||
|
||||
return id;
|
||||
uint16_t id;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_AUTO_SELECT << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
NORFLC->ADDR = id_addr;
|
||||
NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -1,38 +1,34 @@
|
||||
#ifndef __SWM320_NORFLASH_H__
|
||||
#define __SWM320_NORFLASH_H__
|
||||
|
||||
typedef struct {
|
||||
uint8_t DataWidth; // 8、16
|
||||
|
||||
uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
|
||||
uint8_t OEPreValidTime; // Valid data output after OE# low,单位为系统时钟周期,最大值为15
|
||||
|
||||
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
|
||||
uint8_t OperTimeoutIEn;
|
||||
typedef struct
|
||||
{
|
||||
uint8_t DataWidth; // 8、16
|
||||
|
||||
uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
|
||||
uint8_t OEPreValidTime; // Valid data output after OE# low,单位为系统时钟周期,最大值为15
|
||||
|
||||
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
|
||||
uint8_t OperTimeoutIEn;
|
||||
} NORFL_InitStructure;
|
||||
|
||||
|
||||
|
||||
void NORFL_Init(NORFL_InitStructure * initStruct);
|
||||
void NORFL_Init(NORFL_InitStructure *initStruct);
|
||||
uint32_t NORFL_ChipErase(void);
|
||||
uint32_t NORFL_SectorErase(uint32_t addr);
|
||||
uint32_t NORFL_Write(uint32_t addr, uint32_t data);
|
||||
uint32_t NORFL_Read(uint32_t addr);
|
||||
uint16_t NORFL_ReadID(uint32_t id_addr);
|
||||
|
||||
|
||||
/* 当前版本总线读只支持字读
|
||||
/* 当前版本总线读只支持字读
|
||||
#define NORFL_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
|
||||
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
|
||||
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
|
||||
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
|
||||
|
||||
|
||||
|
||||
#define NORFL_CMD_READ 0
|
||||
#define NORFL_CMD_RESET 1
|
||||
#define NORFL_CMD_AUTO_SELECT 2
|
||||
#define NORFL_CMD_PROGRAM 3
|
||||
#define NORFL_CMD_CHIP_ERASE 4
|
||||
#define NORFL_CMD_SECTOR_ERASE 5
|
||||
#define NORFL_CMD_READ 0
|
||||
#define NORFL_CMD_RESET 1
|
||||
#define NORFL_CMD_AUTO_SELECT 2
|
||||
#define NORFL_CMD_PROGRAM 3
|
||||
#define NORFL_CMD_CHIP_ERASE 4
|
||||
#define NORFL_CMD_SECTOR_ERASE 5
|
||||
|
||||
#endif // __SWM320_NORFLASH_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -21,201 +21,200 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_port.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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)
|
||||
{
|
||||
switch((uint32_t)PORTx)
|
||||
{
|
||||
case ((uint32_t)PORTA):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTA_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTA_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTA_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTA_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTA_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
|
||||
PORT->PORTA_INEN &= ~(0x01 << n);
|
||||
PORT->PORTA_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTB):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTB_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTB_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTB_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTB_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTB_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
|
||||
PORT->PORTB_INEN &= ~(0x01 << n);
|
||||
PORT->PORTB_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTC):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTC_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTC_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTC_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTC_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTC_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
|
||||
PORT->PORTC_INEN &= ~(0x01 << n);
|
||||
PORT->PORTC_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTM):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTM_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTM_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTM_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTM_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
{
|
||||
PORT->PORTM_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTM_MUX2 |= (func-100) << ((n-12)*5);
|
||||
}
|
||||
else if(n < PIN24)
|
||||
{
|
||||
PORT->PORTM_MUX3 &= ~(0x1F << ((n-18)*5));
|
||||
PORT->PORTM_MUX3 |= (func-100) << ((n-18)*5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
{
|
||||
PORT->PORTM_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTM_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
}
|
||||
|
||||
PORT->PORTM_INEN &= ~(0x01 << n);
|
||||
PORT->PORTM_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTN):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTN_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTN_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTN_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTN_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
{
|
||||
PORT->PORTN_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTN_MUX2 |= (func-100) << ((n-12)*5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
{
|
||||
PORT->PORTN_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTN_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
}
|
||||
|
||||
PORT->PORTN_INEN &= ~(0x01 << n);
|
||||
PORT->PORTN_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTP):
|
||||
if(func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
{
|
||||
PORT->PORTP_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTP_MUX0 |= (func-100) << (n*5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
{
|
||||
PORT->PORTP_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTP_MUX1 |= (func-100) << ((n-6)*5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
{
|
||||
PORT->PORTP_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTP_MUX2 |= (func-100) << ((n-12)*5);
|
||||
}
|
||||
else if(n < PIN24)
|
||||
{
|
||||
PORT->PORTP_MUX3 &= ~(0x1F << ((n-18)*5));
|
||||
PORT->PORTP_MUX3 |= (func-100) << ((n-18)*5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
{
|
||||
PORT->PORTP_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTP_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
}
|
||||
|
||||
PORT->PORTP_INEN &= ~(0x01 << n);
|
||||
PORT->PORTP_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
}
|
||||
switch ((uint32_t)PORTx)
|
||||
{
|
||||
case ((uint32_t)PORTA):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTA_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTA_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTA_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTA_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTA_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTA_INEN &= ~(0x01 << n);
|
||||
PORT->PORTA_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTB):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTB_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTB_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTB_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTB_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTB_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTB_INEN &= ~(0x01 << n);
|
||||
PORT->PORTB_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTC):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTC_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTC_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTC_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTC_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTC_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTC_INEN &= ~(0x01 << n);
|
||||
PORT->PORTC_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTM):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTM_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTM_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTM_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTM_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTM_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTM_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
else if (n < PIN24)
|
||||
{
|
||||
PORT->PORTM_MUX3 &= ~(0x1F << ((n - 18) * 5));
|
||||
PORT->PORTM_MUX3 |= (func - 100) << ((n - 18) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTM_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTM_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTM_INEN &= ~(0x01 << n);
|
||||
PORT->PORTM_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTN):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTN_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTN_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTN_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTN_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTN_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTN_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTN_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTN_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTN_INEN &= ~(0x01 << n);
|
||||
PORT->PORTN_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTP):
|
||||
if (func > 99)
|
||||
{
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTP_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTP_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTP_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTP_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTP_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTP_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
else if (n < PIN24)
|
||||
{
|
||||
PORT->PORTP_MUX3 &= ~(0x1F << ((n - 18) * 5));
|
||||
PORT->PORTP_MUX3 |= (func - 100) << ((n - 18) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTP_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTP_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTP_INEN &= ~(0x01 << n);
|
||||
PORT->PORTP_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,58 +1,57 @@
|
||||
#ifndef __SWM320_PWM_H__
|
||||
#define __SWM320_PWM_H__
|
||||
#define __SWM320_PWM_H__
|
||||
|
||||
typedef struct {
|
||||
uint8_t clk_div; //PWM_CLKDIV_1、PWM_CLKDIV_8
|
||||
|
||||
uint8_t mode; //PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
|
||||
|
||||
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 高电平
|
||||
|
||||
uint8_t HEndAIEn; //A路高电平结束中断使能
|
||||
uint8_t NCycleAIEn; //A路新周期开始中断使能
|
||||
uint8_t HEndBIEn; //B路高电平结束中断使能
|
||||
uint8_t NCycleBIEn; //B路新周期开始中断使能
|
||||
typedef struct
|
||||
{
|
||||
uint8_t clk_div; //PWM_CLKDIV_1、PWM_CLKDIV_8
|
||||
|
||||
uint8_t mode; //PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
|
||||
|
||||
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 高电平
|
||||
|
||||
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_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
|
||||
#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_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_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__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,73 +1,73 @@
|
||||
#ifndef __SWM320_RTC_H__
|
||||
#define __SWM320_RTC_H__
|
||||
|
||||
#define RTC_SUN 0x01
|
||||
#define RTC_MON 0x02
|
||||
#define RTC_TUE 0x04
|
||||
#define RTC_WED 0x08
|
||||
#define RTC_THU 0x10
|
||||
#define RTC_FRI 0x20
|
||||
#define RTC_SAT 0x40
|
||||
|
||||
#define RTC_SUN 0x01
|
||||
#define RTC_MON 0x02
|
||||
#define RTC_TUE 0x04
|
||||
#define RTC_WED 0x08
|
||||
#define RTC_THU 0x10
|
||||
#define RTC_FRI 0x20
|
||||
#define RTC_SAT 0x40
|
||||
|
||||
|
||||
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 SecondIEn;
|
||||
uint8_t MinuteIEn;
|
||||
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 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 Hour;
|
||||
uint8_t Minute;
|
||||
uint8_t Second;
|
||||
uint8_t AlarmIEn;
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Days; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT及其或运算组合
|
||||
uint8_t Hour;
|
||||
uint8_t Minute;
|
||||
uint8_t Second;
|
||||
uint8_t AlarmIEn;
|
||||
} RTC_AlarmStructure;
|
||||
|
||||
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 Hour;
|
||||
uint8_t Minute;
|
||||
uint8_t Second;
|
||||
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 Hour;
|
||||
uint8_t Minute;
|
||||
uint8_t Second;
|
||||
} RTC_DateTime;
|
||||
|
||||
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct);
|
||||
void RTC_Start(RTC_TypeDef * RTCx);
|
||||
void RTC_Stop(RTC_TypeDef * RTCx);
|
||||
void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
|
||||
void RTC_Start(RTC_TypeDef *RTCx);
|
||||
void RTC_Stop(RTC_TypeDef *RTCx);
|
||||
|
||||
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
|
||||
void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
|
||||
|
||||
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct);
|
||||
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
|
||||
|
||||
|
||||
void RTC_IntSecondEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntSecondDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntSecondClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx);
|
||||
|
||||
#endif //__SWM320_RTC_H__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,126 +1,120 @@
|
||||
#ifndef __SWM320_SDIO_H__
|
||||
#define __SWM320_SDIO_H__
|
||||
|
||||
|
||||
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
||||
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
||||
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
||||
#define SD_CMD_SET_REL_ADDR ((uint8_t)3)
|
||||
#define SD_CMD_SET_DSR ((uint8_t)4)
|
||||
#define SD_CMD_HS_SWITCH ((uint8_t)6)
|
||||
#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
|
||||
#define SD_CMD_SEND_IF_COND ((uint8_t)8)
|
||||
#define SD_CMD_SEND_CSD ((uint8_t)9)
|
||||
#define SD_CMD_SEND_CID ((uint8_t)10)
|
||||
#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
|
||||
#define SD_CMD_SEND_STATUS ((uint8_t)13)
|
||||
#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
|
||||
#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
|
||||
#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
|
||||
#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
|
||||
#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
|
||||
#define SD_CMD_PROG_CID ((uint8_t)26)
|
||||
#define SD_CMD_PROG_CSD ((uint8_t)27)
|
||||
#define SD_CMD_APP_CMD ((uint8_t)55)
|
||||
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
||||
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
||||
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
||||
#define SD_CMD_SET_REL_ADDR ((uint8_t)3)
|
||||
#define SD_CMD_SET_DSR ((uint8_t)4)
|
||||
#define SD_CMD_HS_SWITCH ((uint8_t)6)
|
||||
#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
|
||||
#define SD_CMD_SEND_IF_COND ((uint8_t)8)
|
||||
#define SD_CMD_SEND_CSD ((uint8_t)9)
|
||||
#define SD_CMD_SEND_CID ((uint8_t)10)
|
||||
#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
|
||||
#define SD_CMD_SEND_STATUS ((uint8_t)13)
|
||||
#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
|
||||
#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
|
||||
#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
|
||||
#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
|
||||
#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
|
||||
#define SD_CMD_PROG_CID ((uint8_t)26)
|
||||
#define SD_CMD_PROG_CSD ((uint8_t)27)
|
||||
#define SD_CMD_APP_CMD ((uint8_t)55)
|
||||
|
||||
/*Following commands are SD Card Specific commands.
|
||||
SDIO_APP_CMD should be sent before sending these commands. */
|
||||
#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6)
|
||||
#define SD_CMD_SD_APP_STAUS ((uint8_t)13)
|
||||
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22)
|
||||
#define SD_CMD_SD_APP_OP_COND ((uint8_t)41)
|
||||
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42)
|
||||
#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51)
|
||||
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
|
||||
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
|
||||
#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6)
|
||||
#define SD_CMD_SD_APP_STAUS ((uint8_t)13)
|
||||
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22)
|
||||
#define SD_CMD_SD_APP_OP_COND ((uint8_t)41)
|
||||
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42)
|
||||
#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51)
|
||||
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
|
||||
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
|
||||
|
||||
#define SD_RESP_NO 0 //0 无响应
|
||||
#define SD_RESP_32b 2 //2 32位响应
|
||||
#define SD_RESP_128b 1 //1 128位响应
|
||||
#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
|
||||
|
||||
#define SD_RES_OK 0
|
||||
#define SD_RES_ERR 1
|
||||
#define SD_RES_TIMEOUT 2
|
||||
#define SD_BUSWIDTH_1b 0
|
||||
#define SD_BUSWIDTH_4b 2
|
||||
|
||||
#define SD_RES_OK 0
|
||||
#define SD_RES_ERR 1
|
||||
#define SD_RES_TIMEOUT 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t CSDStruct; // CSD structure
|
||||
__IO uint8_t SysSpecVersion; // System specification version
|
||||
__IO uint8_t Reserved1; // Reserved
|
||||
__IO uint8_t TAAC; // Data read access-time 1
|
||||
__IO uint8_t NSAC; // Data read access-time 2 in CLK cycles
|
||||
__IO uint8_t MaxBusClkFrec; // Max. bus clock frequency
|
||||
__IO uint16_t CardComdClasses; //< Card command classes
|
||||
__IO uint8_t RdBlockLen; // Max. read data block length
|
||||
__IO uint8_t PartBlockRead; // Partial blocks for read allowed
|
||||
__IO uint8_t WrBlockMisalign; // Write block misalignment
|
||||
__IO uint8_t RdBlockMisalign; // Read block misalignment
|
||||
__IO uint8_t DSRImpl; // DSR implemented
|
||||
__IO uint8_t Reserved2; // Reserved
|
||||
__IO uint32_t DeviceSize; // Device Size
|
||||
__IO uint8_t MaxRdCurrentVDDMin; // Max. read current @ VDD min
|
||||
__IO uint8_t MaxRdCurrentVDDMax; // Max. read current @ VDD max
|
||||
__IO uint8_t MaxWrCurrentVDDMin; // Max. write current @ VDD min
|
||||
__IO uint8_t MaxWrCurrentVDDMax; // Max. write current @ VDD max
|
||||
__IO uint8_t DeviceSizeMul; // Device size multiplier
|
||||
__IO uint8_t EraseGrSize; // Erase group size
|
||||
__IO uint8_t EraseGrMul; // Erase group size multiplier
|
||||
__IO uint8_t WrProtectGrSize; // Write protect group size
|
||||
__IO uint8_t WrProtectGrEnable; // Write protect group enable
|
||||
__IO uint8_t ManDeflECC; // Manufacturer default ECC
|
||||
__IO uint8_t WrSpeedFact; // Write speed factor
|
||||
__IO uint8_t MaxWrBlockLen; // Max. write data block length
|
||||
__IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed
|
||||
__IO uint8_t Reserved3; // Reserded
|
||||
__IO uint8_t ContentProtectAppli; // Content protection application
|
||||
__IO uint8_t FileFormatGrouop; // File format group
|
||||
__IO uint8_t CopyFlag; // Copy flag (OTP)
|
||||
__IO uint8_t PermWrProtect; // Permanent write protection
|
||||
__IO uint8_t TempWrProtect; // Temporary write protection
|
||||
__IO uint8_t FileFormat; // File Format
|
||||
__IO uint8_t ECC; // ECC code
|
||||
__IO uint8_t CSDStruct; // CSD structure
|
||||
__IO uint8_t SysSpecVersion; // System specification version
|
||||
__IO uint8_t Reserved1; // Reserved
|
||||
__IO uint8_t TAAC; // Data read access-time 1
|
||||
__IO uint8_t NSAC; // Data read access-time 2 in CLK cycles
|
||||
__IO uint8_t MaxBusClkFrec; // Max. bus clock frequency
|
||||
__IO uint16_t CardComdClasses; //< Card command classes
|
||||
__IO uint8_t RdBlockLen; // Max. read data block length
|
||||
__IO uint8_t PartBlockRead; // Partial blocks for read allowed
|
||||
__IO uint8_t WrBlockMisalign; // Write block misalignment
|
||||
__IO uint8_t RdBlockMisalign; // Read block misalignment
|
||||
__IO uint8_t DSRImpl; // DSR implemented
|
||||
__IO uint8_t Reserved2; // Reserved
|
||||
__IO uint32_t DeviceSize; // Device Size
|
||||
__IO uint8_t MaxRdCurrentVDDMin; // Max. read current @ VDD min
|
||||
__IO uint8_t MaxRdCurrentVDDMax; // Max. read current @ VDD max
|
||||
__IO uint8_t MaxWrCurrentVDDMin; // Max. write current @ VDD min
|
||||
__IO uint8_t MaxWrCurrentVDDMax; // Max. write current @ VDD max
|
||||
__IO uint8_t DeviceSizeMul; // Device size multiplier
|
||||
__IO uint8_t EraseGrSize; // Erase group size
|
||||
__IO uint8_t EraseGrMul; // Erase group size multiplier
|
||||
__IO uint8_t WrProtectGrSize; // Write protect group size
|
||||
__IO uint8_t WrProtectGrEnable; // Write protect group enable
|
||||
__IO uint8_t ManDeflECC; // Manufacturer default ECC
|
||||
__IO uint8_t WrSpeedFact; // Write speed factor
|
||||
__IO uint8_t MaxWrBlockLen; // Max. write data block length
|
||||
__IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed
|
||||
__IO uint8_t Reserved3; // Reserded
|
||||
__IO uint8_t ContentProtectAppli; // Content protection application
|
||||
__IO uint8_t FileFormatGrouop; // File format group
|
||||
__IO uint8_t CopyFlag; // Copy flag (OTP)
|
||||
__IO uint8_t PermWrProtect; // Permanent write protection
|
||||
__IO uint8_t TempWrProtect; // Temporary write protection
|
||||
__IO uint8_t FileFormat; // File Format
|
||||
__IO uint8_t ECC; // ECC code
|
||||
} SD_CSD;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t ManufacturerID; // ManufacturerID
|
||||
__IO uint16_t OEM_AppliID; // OEM/Application ID
|
||||
__IO uint32_t ProdName1; // Product Name part1
|
||||
__IO uint8_t ProdName2; // Product Name part2
|
||||
__IO uint8_t ProdRev; // Product Revision
|
||||
__IO uint32_t ProdSN; // Product Serial Number
|
||||
__IO uint8_t Reserved1; // Reserved1
|
||||
__IO uint16_t ManufactDate; // Manufacturing Date
|
||||
__IO uint8_t ManufacturerID; // ManufacturerID
|
||||
__IO uint16_t OEM_AppliID; // OEM/Application ID
|
||||
__IO uint32_t ProdName1; // Product Name part1
|
||||
__IO uint8_t ProdName2; // Product Name part2
|
||||
__IO uint8_t ProdRev; // Product Revision
|
||||
__IO uint32_t ProdSN; // Product Serial Number
|
||||
__IO uint8_t Reserved1; // Reserved1
|
||||
__IO uint16_t ManufactDate; // Manufacturing Date
|
||||
} SD_CID;
|
||||
|
||||
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
||||
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
||||
#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
|
||||
#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
|
||||
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
|
||||
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
||||
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
||||
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
||||
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
||||
#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
|
||||
#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
|
||||
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
|
||||
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
||||
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SD_CSD SD_csd;
|
||||
SD_CID SD_cid;
|
||||
uint64_t CardCapacity; // Card Capacity
|
||||
uint32_t CardBlockSize; // Card Block Size
|
||||
uint16_t RCA;
|
||||
uint8_t CardType;
|
||||
SD_CSD SD_csd;
|
||||
SD_CID SD_cid;
|
||||
uint64_t CardCapacity; // Card Capacity
|
||||
uint32_t CardBlockSize; // Card Block Size
|
||||
uint16_t RCA;
|
||||
uint8_t CardType;
|
||||
} SD_CardInfo;
|
||||
|
||||
|
||||
extern SD_CardInfo SD_cardInfo;
|
||||
|
||||
uint32_t SDIO_Init(uint32_t freq);
|
||||
@@ -133,11 +127,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]);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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,82 +22,95 @@
|
||||
#include "SWM320_sdram.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SDRAM_Init()
|
||||
* 功能说明: SDRAM控制器初始化
|
||||
* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: SDRAM_Init()
|
||||
* 功能说明: SDRAM控制器初始化
|
||||
* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SDRAM_Init(SDRAM_InitStructure * initStruct)
|
||||
void SDRAM_Init(SDRAM_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t row_n;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
|
||||
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
|
||||
|
||||
SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length为4
|
||||
(initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
|
||||
|
||||
SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
|
||||
(initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
|
||||
(initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
|
||||
(0 << SDRAMC_CR1_32BIT_Pos) |
|
||||
(initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
|
||||
(initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
|
||||
(initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
|
||||
(initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
|
||||
(initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
|
||||
(initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
|
||||
|
||||
SDRAMC->LATCH = 0x02;
|
||||
|
||||
switch(initStruct->CellSize)
|
||||
{
|
||||
case SDRAM_CELLSIZE_16Mb: row_n = 11; break;
|
||||
case SDRAM_CELLSIZE_64Mb: row_n = 12; break;
|
||||
case SDRAM_CELLSIZE_128Mb: row_n = 12; break;
|
||||
case SDRAM_CELLSIZE_256Mb: row_n = 13; break;
|
||||
default: row_n = 13; break;
|
||||
}
|
||||
|
||||
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
|
||||
(((SystemCoreClock/2)/1000*64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
uint32_t row_n;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
|
||||
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
|
||||
|
||||
SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length为4
|
||||
(initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
|
||||
|
||||
SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
|
||||
(initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
|
||||
(initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
|
||||
(0 << SDRAMC_CR1_32BIT_Pos) |
|
||||
(initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
|
||||
(initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
|
||||
(initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
|
||||
(initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
|
||||
(initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
|
||||
(initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
|
||||
|
||||
SDRAMC->LATCH = 0x02;
|
||||
|
||||
switch (initStruct->CellSize)
|
||||
{
|
||||
case SDRAM_CELLSIZE_16Mb:
|
||||
row_n = 11;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_64Mb:
|
||||
row_n = 12;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_128Mb:
|
||||
row_n = 12;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_256Mb:
|
||||
row_n = 13;
|
||||
break;
|
||||
default:
|
||||
row_n = 13;
|
||||
break;
|
||||
}
|
||||
|
||||
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
|
||||
(((SystemCoreClock / 2) / 1000 * 64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
|
||||
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SDRAM_Enable()
|
||||
* 功能说明: SDRAM使能,使能后可读写SDRAM
|
||||
* 输 入: 无
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: SDRAM_Enable()
|
||||
* 功能说明: SDRAM使能,使能后可读写SDRAM
|
||||
* 输 入: 无
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SDRAM_Enable(void)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 100; i++) __NOP();
|
||||
uint32_t i;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for (i = 0; i < 100; i++)
|
||||
__NOP();
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SDRAM_Disable()
|
||||
* 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
|
||||
* 输 入: 无
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: SDRAM_Disable()
|
||||
* 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
|
||||
* 输 入: 无
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SDRAM_Disable(void)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 100; i++) __NOP();
|
||||
uint32_t i;
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for (i = 0; i < 100; i++)
|
||||
__NOP();
|
||||
}
|
||||
|
||||
@@ -1,80 +1,79 @@
|
||||
#ifndef __SWM320_SDRAM_H__
|
||||
#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 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命令到另一个命令间延时
|
||||
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 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命令到另一个命令间延时
|
||||
} SDRAM_InitStructure;
|
||||
|
||||
#define SDRAM_CELLSIZE_16Mb 3
|
||||
#define SDRAM_CELLSIZE_64Mb 0
|
||||
#define SDRAM_CELLSIZE_128Mb 1
|
||||
#define SDRAM_CELLSIZE_256Mb 2
|
||||
#define SDRAM_CELLSIZE_16Mb 3
|
||||
#define SDRAM_CELLSIZE_64Mb 0
|
||||
#define SDRAM_CELLSIZE_128Mb 1
|
||||
#define SDRAM_CELLSIZE_256Mb 2
|
||||
|
||||
#define SDRAM_CELLBANK_2 0
|
||||
#define SDRAM_CELLBANK_4 1
|
||||
#define SDRAM_CELLBANK_2 0
|
||||
#define SDRAM_CELLBANK_4 1
|
||||
|
||||
#define SDRAM_CELLWIDTH_16 0
|
||||
#define SDRAM_CELLWIDTH_32 1
|
||||
#define SDRAM_CELLWIDTH_16 0
|
||||
#define SDRAM_CELLWIDTH_32 1
|
||||
|
||||
#define SDRAM_CASLATENCY_2 2
|
||||
#define SDRAM_CASLATENCY_3 3
|
||||
#define SDRAM_CASLATENCY_2 2
|
||||
#define SDRAM_CASLATENCY_3 3
|
||||
|
||||
#define SDRAM_TMRD_3 3
|
||||
#define SDRAM_TMRD_4 4
|
||||
#define SDRAM_TMRD_5 5
|
||||
#define SDRAM_TMRD_6 6
|
||||
#define SDRAM_TMRD_7 7
|
||||
#define SDRAM_TMRD_3 3
|
||||
#define SDRAM_TMRD_4 4
|
||||
#define SDRAM_TMRD_5 5
|
||||
#define SDRAM_TMRD_6 6
|
||||
#define SDRAM_TMRD_7 7
|
||||
|
||||
#define SDRAM_TRRD_2 2
|
||||
#define SDRAM_TRRD_3 3
|
||||
#define SDRAM_TRRD_2 2
|
||||
#define SDRAM_TRRD_3 3
|
||||
|
||||
#define SDRAM_TRAS_2 2
|
||||
#define SDRAM_TRAS_3 3
|
||||
#define SDRAM_TRAS_4 4
|
||||
#define SDRAM_TRAS_5 5
|
||||
#define SDRAM_TRAS_6 6
|
||||
#define SDRAM_TRAS_7 7
|
||||
#define SDRAM_TRAS_2 2
|
||||
#define SDRAM_TRAS_3 3
|
||||
#define SDRAM_TRAS_4 4
|
||||
#define SDRAM_TRAS_5 5
|
||||
#define SDRAM_TRAS_6 6
|
||||
#define SDRAM_TRAS_7 7
|
||||
|
||||
#define SDRAM_TRC_2 2
|
||||
#define SDRAM_TRC_3 3
|
||||
#define SDRAM_TRC_4 4
|
||||
#define SDRAM_TRC_5 5
|
||||
#define SDRAM_TRC_6 6
|
||||
#define SDRAM_TRC_7 7
|
||||
#define SDRAM_TRC_8 8
|
||||
#define SDRAM_TRC_9 9
|
||||
#define SDRAM_TRC_10 10
|
||||
#define SDRAM_TRC_11 11
|
||||
#define SDRAM_TRC_12 12
|
||||
#define SDRAM_TRC_13 13
|
||||
#define SDRAM_TRC_14 14
|
||||
#define SDRAM_TRC_15 15
|
||||
#define SDRAM_TRC_2 2
|
||||
#define SDRAM_TRC_3 3
|
||||
#define SDRAM_TRC_4 4
|
||||
#define SDRAM_TRC_5 5
|
||||
#define SDRAM_TRC_6 6
|
||||
#define SDRAM_TRC_7 7
|
||||
#define SDRAM_TRC_8 8
|
||||
#define SDRAM_TRC_9 9
|
||||
#define SDRAM_TRC_10 10
|
||||
#define SDRAM_TRC_11 11
|
||||
#define SDRAM_TRC_12 12
|
||||
#define SDRAM_TRC_13 13
|
||||
#define SDRAM_TRC_14 14
|
||||
#define SDRAM_TRC_15 15
|
||||
|
||||
#define SDRAM_TRCD_3 3
|
||||
#define SDRAM_TRCD_4 4
|
||||
#define SDRAM_TRCD_5 5
|
||||
#define SDRAM_TRCD_6 6
|
||||
#define SDRAM_TRCD_7 7
|
||||
#define SDRAM_TRCD_3 3
|
||||
#define SDRAM_TRCD_4 4
|
||||
#define SDRAM_TRCD_5 5
|
||||
#define SDRAM_TRCD_6 6
|
||||
#define SDRAM_TRCD_7 7
|
||||
|
||||
#define SDRAM_TRP_3 3
|
||||
#define SDRAM_TRP_4 4
|
||||
#define SDRAM_TRP_5 5
|
||||
#define SDRAM_TRP_6 6
|
||||
#define SDRAM_TRP_7 7
|
||||
#define SDRAM_TRP_3 3
|
||||
#define SDRAM_TRP_4 4
|
||||
#define SDRAM_TRP_5 5
|
||||
#define SDRAM_TRP_6 6
|
||||
#define SDRAM_TRP_7 7
|
||||
|
||||
|
||||
|
||||
void SDRAM_Init(SDRAM_InitStructure * initStruct);
|
||||
void SDRAM_Init(SDRAM_InitStructure *initStruct);
|
||||
|
||||
void SDRAM_Enable(void);
|
||||
void SDRAM_Disable(void);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,83 +1,80 @@
|
||||
#ifndef __SWM320_SPI_H__
|
||||
#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 RXHFullIEn; //接收FIFO半满中断使能
|
||||
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
|
||||
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
|
||||
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 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
|
||||
#define SPI_CLKDIV_16 2
|
||||
#define SPI_CLKDIV_32 3
|
||||
#define SPI_CLKDIV_64 4
|
||||
#define SPI_CLKDIV_128 5
|
||||
#define SPI_CLKDIV_256 6
|
||||
#define SPI_CLKDIV_512 7
|
||||
#define SPI_CLKDIV_4 0
|
||||
#define SPI_CLKDIV_8 1
|
||||
#define SPI_CLKDIV_16 2
|
||||
#define SPI_CLKDIV_32 3
|
||||
#define SPI_CLKDIV_64 4
|
||||
#define SPI_CLKDIV_128 5
|
||||
#define SPI_CLKDIV_256 6
|
||||
#define SPI_CLKDIV_512 7
|
||||
|
||||
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
|
||||
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开,允许收发
|
||||
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭,禁止收发
|
||||
|
||||
uint32_t SPI_Read(SPI_TypeDef *SPIx);
|
||||
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
|
||||
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
|
||||
|
||||
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化
|
||||
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开,允许收发
|
||||
void SPI_Close(SPI_TypeDef * SPIx); //SPI关闭,禁止收发
|
||||
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_Read(SPI_TypeDef * SPIx);
|
||||
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
|
||||
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx);
|
||||
|
||||
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
|
||||
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
|
||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //发送FIFO是否空
|
||||
|
||||
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx);
|
||||
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx);
|
||||
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
|
||||
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
|
||||
|
||||
#endif //__SWM320_SPI_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: 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日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -21,33 +21,36 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_sram.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SRAM_Init()
|
||||
* 功能说明: SRAM控制器初始化
|
||||
* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: SRAM_Init()
|
||||
* 功能说明: SRAM控制器初始化
|
||||
* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SRAM_Init(SRAM_InitStructure * initStruct)
|
||||
void SRAM_Init(SRAM_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do {
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while(0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
|
||||
for(i = 0; i < 10; i++) __NOP();
|
||||
|
||||
SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
|
||||
(initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
|
||||
(0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do
|
||||
{
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for (i = 0; i < 1000; i++)
|
||||
__NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while (0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
|
||||
for (i = 0; i < 10; i++)
|
||||
__NOP();
|
||||
|
||||
SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
|
||||
(initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
|
||||
(0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
|
||||
}
|
||||
|
||||
@@ -1,31 +1,29 @@
|
||||
#ifndef __SWM320_SRAM_H__
|
||||
#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
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
|
||||
uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
|
||||
} SRAM_InitStructure;
|
||||
|
||||
#define SRAM_CLKDIV_4 3
|
||||
#define SRAM_CLKDIV_5 4
|
||||
#define SRAM_CLKDIV_6 5
|
||||
#define SRAM_CLKDIV_7 6
|
||||
#define SRAM_CLKDIV_8 7
|
||||
#define SRAM_CLKDIV_9 8
|
||||
#define SRAM_CLKDIV_10 9
|
||||
#define SRAM_CLKDIV_11 10
|
||||
#define SRAM_CLKDIV_12 11
|
||||
#define SRAM_CLKDIV_13 12
|
||||
#define SRAM_CLKDIV_14 13
|
||||
#define SRAM_CLKDIV_15 14
|
||||
#define SRAM_CLKDIV_16 15
|
||||
|
||||
#define SRAM_CLKDIV_4 3
|
||||
#define SRAM_CLKDIV_5 4
|
||||
#define SRAM_CLKDIV_6 5
|
||||
#define SRAM_CLKDIV_7 6
|
||||
#define SRAM_CLKDIV_8 7
|
||||
#define SRAM_CLKDIV_9 8
|
||||
#define SRAM_CLKDIV_10 9
|
||||
#define SRAM_CLKDIV_11 10
|
||||
#define SRAM_CLKDIV_12 11
|
||||
#define SRAM_CLKDIV_13 12
|
||||
#define SRAM_CLKDIV_14 13
|
||||
#define SRAM_CLKDIV_15 14
|
||||
#define SRAM_CLKDIV_16 15
|
||||
|
||||
#define SRAM_DATAWIDTH_8 1
|
||||
#define SRAM_DATAWIDTH_16 0
|
||||
|
||||
|
||||
void SRAM_Init(SRAM_InitStructure * initStruct);
|
||||
#define SRAM_DATAWIDTH_8 1
|
||||
#define SRAM_DATAWIDTH_16 0
|
||||
|
||||
void SRAM_Init(SRAM_InitStructure *initStruct);
|
||||
|
||||
#endif //__SWM320_SRAM_H__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +1,29 @@
|
||||
#ifndef __SWM320_TIMR_H__
|
||||
#define __SWM320_TIMR_H__
|
||||
|
||||
#define TIMR_MODE_TIMER 0
|
||||
#define TIMR_MODE_COUNTER 1
|
||||
#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_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_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_INTEn(TIMR_TypeDef *TIMRx); //使能中断
|
||||
void TIMR_INTDis(TIMR_TypeDef *TIMRx); //禁能中断
|
||||
void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
|
||||
uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx); //获取中断状态
|
||||
|
||||
|
||||
|
||||
#define PULSE_LOW 0
|
||||
#define PULSE_HIGH 1
|
||||
#define PULSE_LOW 0
|
||||
#define PULSE_HIGH 1
|
||||
|
||||
void Pulse_Init(uint32_t pulse, uint32_t int_en);
|
||||
void Pulse_Start(void);
|
||||
uint32_t Pulse_Done(void);
|
||||
|
||||
|
||||
#endif //__SWM320_TIMR_H__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,94 +1,90 @@
|
||||
#ifndef __SWM320_UART_H__
|
||||
#define __SWM320_UART_H__
|
||||
|
||||
typedef struct {
|
||||
uint32_t Baudrate;
|
||||
|
||||
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 StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
|
||||
|
||||
uint8_t RXThreshold; //取值0--7
|
||||
uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
|
||||
|
||||
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线上接收到数据时触发中断
|
||||
typedef struct
|
||||
{
|
||||
uint32_t Baudrate;
|
||||
|
||||
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 StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
|
||||
|
||||
uint8_t RXThreshold; //取值0--7
|
||||
uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
|
||||
|
||||
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线上接收到数据时触发中断
|
||||
} UART_InitStructure;
|
||||
|
||||
#define UART_DATA_8BIT 0
|
||||
#define UART_DATA_9BIT 1
|
||||
|
||||
#define UART_DATA_8BIT 0
|
||||
#define UART_DATA_9BIT 1
|
||||
#define UART_PARITY_NONE 0
|
||||
#define UART_PARITY_ODD 1
|
||||
#define UART_PARITY_EVEN 3
|
||||
#define UART_PARITY_ONE 5
|
||||
#define UART_PARITY_ZERO 7
|
||||
|
||||
#define UART_PARITY_NONE 0
|
||||
#define UART_PARITY_ODD 1
|
||||
#define UART_PARITY_EVEN 3
|
||||
#define UART_PARITY_ONE 5
|
||||
#define UART_PARITY_ZERO 7
|
||||
#define UART_STOP_1BIT 0
|
||||
#define UART_STOP_2BIT 1
|
||||
|
||||
#define UART_STOP_1BIT 0
|
||||
#define UART_STOP_2BIT 1
|
||||
#define UART_RTS_1BYTE 0
|
||||
#define UART_RTS_2BYTE 1
|
||||
#define UART_RTS_4BYTE 2
|
||||
#define UART_RTS_6BYTE 3
|
||||
|
||||
#define UART_RTS_1BYTE 0
|
||||
#define UART_RTS_2BYTE 1
|
||||
#define UART_RTS_4BYTE 2
|
||||
#define UART_RTS_6BYTE 3
|
||||
#define UART_ABR_RES_OK 1
|
||||
#define UART_ABR_RES_ERR 2
|
||||
|
||||
#define UART_ABR_RES_OK 1
|
||||
#define UART_ABR_RES_ERR 2
|
||||
#define UART_ERR_FRAME 1
|
||||
#define UART_ERR_PARITY 2
|
||||
#define UART_ERR_NOISE 3
|
||||
|
||||
#define UART_ERR_FRAME 1
|
||||
#define UART_ERR_PARITY 2
|
||||
#define UART_ERR_NOISE 3
|
||||
void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART串口初始化
|
||||
void UART_Open(UART_TypeDef *UARTx);
|
||||
void UART_Close(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data); //发送一个字节数据
|
||||
uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data); //读取一个字节数据,并指出数据是否Valid
|
||||
|
||||
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART串口初始化
|
||||
void UART_Open(UART_TypeDef * UARTx);
|
||||
void UART_Close(UART_TypeDef * UARTx);
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
||||
|
||||
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //发送一个字节数据
|
||||
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //读取一个字节数据,并指出数据是否Valid
|
||||
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
|
||||
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
||||
void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
|
||||
uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
|
||||
uint32_t UART_RTSLineState(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //设置波特率
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //获取当前使用的波特率
|
||||
void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
|
||||
void UART_LINGenerate(UART_TypeDef *UARTx);
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef *UARTx);
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity);
|
||||
uint32_t UART_CTSLineState(UART_TypeDef * UARTx);
|
||||
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
|
||||
uint32_t UART_RTSLineState(UART_TypeDef * UARTx);
|
||||
|
||||
void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
|
||||
void UART_LINGenerate(UART_TypeDef * UARTx);
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef * UARTx);
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx);
|
||||
|
||||
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar);
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef * UARTx);
|
||||
|
||||
|
||||
void UART_INTRXThresholdEn(UART_TypeDef * UARTx);
|
||||
void UART_INTRXThresholdDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx);
|
||||
void UART_INTTXThresholdEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTXThresholdDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx);
|
||||
void UART_INTTimeoutEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTimeoutDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx);
|
||||
|
||||
void UART_INTTXDoneEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTXDoneDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx);
|
||||
void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
|
||||
void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
|
||||
void UART_INTTXThresholdEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTXThresholdDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx);
|
||||
void UART_INTTimeoutEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTimeoutDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_INTTXDoneEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
|
||||
|
||||
#endif //__SWM320_UART_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_wdt.c
|
||||
* 功能说明: SWM320单片机的WDT看门狗功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_wdt.c
|
||||
* 功能说明: SWM320单片机的WDT看门狗功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
@@ -21,106 +21,105 @@
|
||||
#include "SWM320.h"
|
||||
#include "SWM320_wdt.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_Init()
|
||||
* 功能说明: WDT看门狗初始化
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* uint32_t peroid 取值0--4294967295,单位为单片机系统时钟周期
|
||||
* uint32_t mode WDT_MODE_RESET 超时产生复位 WDT_MODE_INTERRUPT 超时产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 复位使能时中断不起作用,因为计数周期结束时芯片直接复位了,无法响应中断
|
||||
* 函数名称: WDT_Init()
|
||||
* 功能说明: WDT看门狗初始化
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* uint32_t peroid 取值0--4294967295,单位为单片机系统时钟周期
|
||||
* uint32_t mode WDT_MODE_RESET 超时产生复位 WDT_MODE_INTERRUPT 超时产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 复位使能时中断不起作用,因为计数周期结束时芯片直接复位了,无法响应中断
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
|
||||
void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
|
||||
{
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
|
||||
|
||||
WDT_Stop(WDTx); //设置前先关闭
|
||||
|
||||
WDTx->LOAD = peroid;
|
||||
|
||||
if(mode == WDT_MODE_RESET)
|
||||
{
|
||||
NVIC_DisableIRQ(WDT_IRQn);
|
||||
|
||||
WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
|
||||
}
|
||||
else //mode == WDT_MODE_INTERRUPT
|
||||
{
|
||||
NVIC_EnableIRQ(WDT_IRQn);
|
||||
|
||||
WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
|
||||
}
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
|
||||
|
||||
WDT_Stop(WDTx); //设置前先关闭
|
||||
|
||||
WDTx->LOAD = peroid;
|
||||
|
||||
if (mode == WDT_MODE_RESET)
|
||||
{
|
||||
NVIC_DisableIRQ(WDT_IRQn);
|
||||
|
||||
WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
|
||||
}
|
||||
else //mode == WDT_MODE_INTERRUPT
|
||||
{
|
||||
NVIC_EnableIRQ(WDT_IRQn);
|
||||
|
||||
WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_Start()
|
||||
* 功能说明: 启动指定WDT,开始倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_Start()
|
||||
* 功能说明: 启动指定WDT,开始倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Start(WDT_TypeDef * WDTx)
|
||||
void WDT_Start(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
|
||||
WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_Stop()
|
||||
* 功能说明: 关闭指定WDT,停止倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_Stop()
|
||||
* 功能说明: 关闭指定WDT,停止倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Stop(WDT_TypeDef * WDTx)
|
||||
void WDT_Stop(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
|
||||
WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_Feed()
|
||||
* 功能说明: 喂狗,重新从装载值开始倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_Feed()
|
||||
* 功能说明: 喂狗,重新从装载值开始倒计时
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Feed(WDT_TypeDef * WDTx)
|
||||
void WDT_Feed(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->FEED = 0x55;
|
||||
WDTx->FEED = 0x55;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_GetValue()
|
||||
* 功能说明: 获取指定看门狗定时器的当前倒计时值
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: int32_t 看门狗当前计数值
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_GetValue()
|
||||
* 功能说明: 获取指定看门狗定时器的当前倒计时值
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: int32_t 看门狗当前计数值
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
int32_t WDT_GetValue(WDT_TypeDef * WDTx)
|
||||
int32_t WDT_GetValue(WDT_TypeDef *WDTx)
|
||||
{
|
||||
return WDTx->VALUE;
|
||||
return WDTx->VALUE;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_INTClr()
|
||||
* 功能说明: 中断标志清除
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_INTClr()
|
||||
* 功能说明: 中断标志清除
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_INTClr(WDT_TypeDef * WDTx)
|
||||
void WDT_INTClr(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->IF = 1;
|
||||
WDTx->IF = 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_INTStat()
|
||||
* 功能说明: 中断状态查询
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: int32_t 1 发生中断溢出 0 未发生中断溢出
|
||||
* 注意事项: 无
|
||||
* 函数名称: WDT_INTStat()
|
||||
* 功能说明: 中断状态查询
|
||||
* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
|
||||
* 输 出: int32_t 1 发生中断溢出 0 未发生中断溢出
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t WDT_INTStat(WDT_TypeDef * WDTx)
|
||||
uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
|
||||
{
|
||||
return WDTx->IF;
|
||||
return WDTx->IF;
|
||||
}
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
#ifndef __SWM320_WDT_H__
|
||||
#define __SWM320_WDT_H__
|
||||
#define __SWM320_WDT_H__
|
||||
|
||||
#define WDT_MODE_RESET 0
|
||||
#define WDT_MODE_INTERRUPT 1
|
||||
#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__
|
||||
|
||||
Reference in New Issue
Block a user