update lib

This commit is contained in:
yanmowudi
2021-09-30 17:55:16 +08:00
parent 1e36db0c38
commit 47d0508a74
112 changed files with 24361 additions and 18587 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -17,11 +17,9 @@ config PKGS_DIR
source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
config SOC_SWM320VET7
bool
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
source "drivers/Kconfig"
config SOC_SWM320
bool
select ARCH_ARM_CORTEX_M4
default y

View File

@@ -2,12 +2,12 @@
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
*
* $Date: 31. July 2014
* $Revision: V1.4.4
* $Revision: V1.4.4
*
* Project: CMSIS DSP Library
* Title: arm_common_tables.h
* Project: CMSIS DSP Library
* Title: arm_common_tables.h
*
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
*
* Target Processor: Cortex-M4/Cortex-M3
*
@@ -85,14 +85,13 @@ extern const float32_t twiddleCoef_rfft_1024[1024];
extern const float32_t twiddleCoef_rfft_2048[2048];
extern const float32_t twiddleCoef_rfft_4096[4096];
/* floating-point bit reversal tables */
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 )
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 )
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 )
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20)
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48)
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56)
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208)
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440)
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448)
#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
@@ -108,13 +107,13 @@ extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENG
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
/* fixed-point bit reversal tables */
#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 )
#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 )
#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 )
#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 )
#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 )
#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 )
#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 )
#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12)
#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24)
#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56)
#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112)
#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240)
#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480)
#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992)
#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)

View File

@@ -2,12 +2,12 @@
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
*
* $Date: 31. July 2014
* $Revision: V1.4.4
* $Revision: V1.4.4
*
* Project: CMSIS DSP Library
* Title: arm_const_structs.h
* Project: CMSIS DSP Library
* Title: arm_const_structs.h
*
* Description: This file has constant structs that are initialized for
* Description: This file has constant structs that are initialized for
* user convenience. For example, some can be given as
* arguments to the arm_cfft_f32() function.
*
@@ -46,34 +46,34 @@
#include "arm_math.h"
#include "arm_common_tables.h"
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
;******************************************************************************************************************************************
; 文件名称: startup_SWM2400.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日
; 升级记录:
;
;
;******************************************************************************************************************************************
@@ -25,7 +25,7 @@
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
Stack_Size EQU 0x00001000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
@@ -36,7 +36,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
@@ -94,7 +94,7 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD GPIOC4_Handler
DCD GPIOC5_Handler
DCD GPIOC6_Handler
DCD GPIOC7_Handler
DCD GPIOC7_Handler
DCD GPIOM0_Handler
DCD GPIOM1_Handler
DCD GPIOM2_Handler
@@ -102,25 +102,25 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD GPIOM4_Handler
DCD GPIOM5_Handler
DCD GPIOM6_Handler
DCD GPIOM7_Handler
DCD DMA_Handler
DCD GPIOM7_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
DCD RTC_Handler
DCD ANAC_Handler
DCD BOD_Handler
DCD SDIO_Handler
DCD GPIOA_Handler
DCD GPIOB_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
@@ -157,262 +157,262 @@ Reset_Handler PROC
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler PROC
EXPORT MemManage_Handler [WEAK]
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler PROC
EXPORT BusFault_Handler [WEAK]
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler PROC
EXPORT UsageFault_Handler [WEAK]
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler PROC
EXPORT DebugMon_Handler [WEAK]
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
EXPORT SysTick_Handler [WEAK]
B .
ENDP
GPIOA0_Handler PROC
EXPORT GPIOA0_Handler [WEAK]
EXPORT GPIOA0_Handler [WEAK]
B .
ENDP
GPIOA1_Handler PROC
EXPORT GPIOA1_Handler [WEAK]
EXPORT GPIOA1_Handler [WEAK]
B .
ENDP
GPIOA2_Handler PROC
EXPORT GPIOA2_Handler [WEAK]
EXPORT GPIOA2_Handler [WEAK]
B .
ENDP
GPIOA3_Handler PROC
EXPORT GPIOA3_Handler [WEAK]
EXPORT GPIOA3_Handler [WEAK]
B .
ENDP
GPIOA4_Handler PROC
EXPORT GPIOA4_Handler [WEAK]
EXPORT GPIOA4_Handler [WEAK]
B .
ENDP
GPIOA5_Handler PROC
EXPORT GPIOA5_Handler [WEAK]
EXPORT GPIOA5_Handler [WEAK]
B .
ENDP
GPIOA6_Handler PROC
EXPORT GPIOA6_Handler [WEAK]
EXPORT GPIOA6_Handler [WEAK]
B .
ENDP
GPIOA7_Handler PROC
EXPORT GPIOA7_Handler [WEAK]
EXPORT GPIOA7_Handler [WEAK]
B .
ENDP
GPIOB0_Handler PROC
EXPORT GPIOB0_Handler [WEAK]
EXPORT GPIOB0_Handler [WEAK]
B .
ENDP
GPIOB1_Handler PROC
EXPORT GPIOB1_Handler [WEAK]
EXPORT GPIOB1_Handler [WEAK]
B .
ENDP
GPIOB2_Handler PROC
EXPORT GPIOB2_Handler [WEAK]
EXPORT GPIOB2_Handler [WEAK]
B .
ENDP
GPIOB3_Handler PROC
EXPORT GPIOB3_Handler [WEAK]
EXPORT GPIOB3_Handler [WEAK]
B .
ENDP
GPIOB4_Handler PROC
EXPORT GPIOB4_Handler [WEAK]
EXPORT GPIOB4_Handler [WEAK]
B .
ENDP
GPIOB5_Handler PROC
EXPORT GPIOB5_Handler [WEAK]
EXPORT GPIOB5_Handler [WEAK]
B .
ENDP
GPIOB6_Handler PROC
EXPORT GPIOB6_Handler [WEAK]
EXPORT GPIOB6_Handler [WEAK]
B .
ENDP
GPIOB7_Handler PROC
EXPORT GPIOB7_Handler [WEAK]
EXPORT GPIOB7_Handler [WEAK]
B .
ENDP
GPIOC0_Handler PROC
EXPORT GPIOC0_Handler [WEAK]
EXPORT GPIOC0_Handler [WEAK]
B .
ENDP
GPIOC1_Handler PROC
EXPORT GPIOC1_Handler [WEAK]
EXPORT GPIOC1_Handler [WEAK]
B .
ENDP
GPIOC2_Handler PROC
EXPORT GPIOC2_Handler [WEAK]
EXPORT GPIOC2_Handler [WEAK]
B .
ENDP
GPIOC3_Handler PROC
EXPORT GPIOC3_Handler [WEAK]
EXPORT GPIOC3_Handler [WEAK]
B .
ENDP
GPIOC4_Handler PROC
EXPORT GPIOC4_Handler [WEAK]
EXPORT GPIOC4_Handler [WEAK]
B .
ENDP
GPIOC5_Handler PROC
EXPORT GPIOC5_Handler [WEAK]
EXPORT GPIOC5_Handler [WEAK]
B .
ENDP
GPIOC6_Handler PROC
EXPORT GPIOC6_Handler [WEAK]
EXPORT GPIOC6_Handler [WEAK]
B .
ENDP
GPIOC7_Handler PROC
EXPORT GPIOC7_Handler [WEAK]
EXPORT GPIOC7_Handler [WEAK]
B .
ENDP
GPIOM0_Handler PROC
EXPORT GPIOM0_Handler [WEAK]
EXPORT GPIOM0_Handler [WEAK]
B .
ENDP
GPIOM1_Handler PROC
EXPORT GPIOM1_Handler [WEAK]
EXPORT GPIOM1_Handler [WEAK]
B .
ENDP
GPIOM2_Handler PROC
EXPORT GPIOM2_Handler [WEAK]
EXPORT GPIOM2_Handler [WEAK]
B .
ENDP
GPIOM3_Handler PROC
EXPORT GPIOM3_Handler [WEAK]
EXPORT GPIOM3_Handler [WEAK]
B .
ENDP
GPIOM4_Handler PROC
EXPORT GPIOM4_Handler [WEAK]
EXPORT GPIOM4_Handler [WEAK]
B .
ENDP
GPIOM5_Handler PROC
EXPORT GPIOM5_Handler [WEAK]
EXPORT GPIOM5_Handler [WEAK]
B .
ENDP
GPIOM6_Handler PROC
EXPORT GPIOM6_Handler [WEAK]
EXPORT GPIOM6_Handler [WEAK]
B .
ENDP
GPIOM7_Handler PROC
EXPORT GPIOM7_Handler [WEAK]
EXPORT GPIOM7_Handler [WEAK]
B .
ENDP
DMA_Handler PROC
EXPORT DMA_Handler [WEAK]
EXPORT DMA_Handler [WEAK]
B .
ENDP
LCD_Handler PROC
EXPORT LCD_Handler [WEAK]
EXPORT LCD_Handler [WEAK]
B .
ENDP
NORFLC_Handler PROC
EXPORT NORFLC_Handler [WEAK]
EXPORT NORFLC_Handler [WEAK]
B .
ENDP
CAN_Handler PROC
EXPORT CAN_Handler [WEAK]
EXPORT CAN_Handler [WEAK]
B .
ENDP
PULSE_Handler PROC
EXPORT PULSE_Handler [WEAK]
EXPORT PULSE_Handler [WEAK]
B .
ENDP
WDT_Handler PROC
EXPORT WDT_Handler [WEAK]
EXPORT WDT_Handler [WEAK]
B .
ENDP
PWM_Handler PROC
EXPORT PWM_Handler [WEAK]
EXPORT PWM_Handler [WEAK]
B .
ENDP
UART0_Handler PROC
EXPORT UART0_Handler [WEAK]
EXPORT UART0_Handler [WEAK]
B .
ENDP
UART1_Handler PROC
EXPORT UART1_Handler [WEAK]
EXPORT UART1_Handler [WEAK]
B .
ENDP
UART2_Handler PROC
EXPORT UART2_Handler [WEAK]
EXPORT UART2_Handler [WEAK]
B .
ENDP
UART3_Handler PROC
EXPORT UART3_Handler [WEAK]
EXPORT UART3_Handler [WEAK]
B .
ENDP
@@ -437,12 +437,12 @@ ADC0_Handler PROC
ENDP
RTC_Handler PROC
EXPORT RTC_Handler [WEAK]
EXPORT RTC_Handler [WEAK]
B .
ENDP
ANAC_Handler PROC
EXPORT ANAC_Handler [WEAK]
BOD_Handler PROC
EXPORT BOD_Handler [WEAK]
B .
ENDP
@@ -452,32 +452,32 @@ SDIO_Handler PROC
ENDP
GPIOA_Handler PROC
EXPORT GPIOA_Handler [WEAK]
EXPORT GPIOA_Handler [WEAK]
B .
ENDP
GPIOB_Handler PROC
EXPORT GPIOB_Handler [WEAK]
EXPORT GPIOB_Handler [WEAK]
B .
ENDP
GPIOC_Handler PROC
EXPORT GPIOC_Handler [WEAK]
EXPORT GPIOC_Handler [WEAK]
B .
ENDP
GPIOM_Handler PROC
EXPORT GPIOM_Handler [WEAK]
EXPORT GPIOM_Handler [WEAK]
B .
ENDP
GPION_Handler PROC
EXPORT GPION_Handler [WEAK]
EXPORT GPION_Handler [WEAK]
B .
ENDP
GPIOP_Handler PROC
EXPORT GPIOP_Handler [WEAK]
EXPORT GPIOP_Handler [WEAK]
B .
ENDP
@@ -487,7 +487,7 @@ ADC1_Handler PROC
ENDP
FPU_Handler PROC
EXPORT FPU_Handler [WEAK]
EXPORT FPU_Handler [WEAK]
B .
ENDP

View File

@@ -57,7 +57,7 @@ __vector_table
DCD GPIOA5_Handler
DCD GPIOA6_Handler
DCD GPIOA7_Handler
DCD GPIOB0_Handler
DCD GPIOB0_Handler
DCD GPIOB1_Handler
DCD GPIOB2_Handler
DCD GPIOB3_Handler
@@ -72,7 +72,7 @@ __vector_table
DCD GPIOC4_Handler
DCD GPIOC5_Handler
DCD GPIOC6_Handler
DCD GPIOC7_Handler
DCD GPIOC7_Handler
DCD GPIOM0_Handler
DCD GPIOM1_Handler
DCD GPIOM2_Handler
@@ -80,25 +80,25 @@ __vector_table
DCD GPIOM4_Handler
DCD GPIOM5_Handler
DCD GPIOM6_Handler
DCD GPIOM7_Handler
DCD DMA_Handler
DCD GPIOM7_Handler
DCD DMA_Handler
DCD LCD_Handler
DCD NORFLC_Handler
DCD CAN_Handler
DCD TIMR_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
DCD RTC_Handler
DCD ANAC_Handler
DCD BOD_Handler
DCD SDIO_Handler
DCD GPIOA_Handler
DCD GPIOB_Handler
@@ -108,7 +108,13 @@ __vector_table
DCD GPIOP_Handler
DCD ADC1_Handler
DCD FPU_Handler
DCD SPI1_Handler
DCD SPI1_Handler
DCD TIMR0_Handler
DCD TIMR1_Handler
DCD TIMR2_Handler
DCD TIMR3_Handler
DCD TIMR4_Handler
DCD TIMR5_Handler
THUMB
@@ -345,10 +351,10 @@ NORFLC_Handler
CAN_Handler
B CAN_Handler
PUBWEAK TIMR_Handler
PUBWEAK PULSE_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR_Handler
B TIMR_Handler
PULSE_Handler
B PULSE_Handler
PUBWEAK WDT_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
@@ -405,10 +411,10 @@ ADC0_Handler
RTC_Handler
B RTC_Handler
PUBWEAK ANAC_Handler
PUBWEAK BOD_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
ANAC_Handler
B ANAC_Handler
BOD_Handler
B BOD_Handler
PUBWEAK SDIO_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
@@ -459,6 +465,36 @@ FPU_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SPI1_Handler
B SPI1_Handler
PUBWEAK TIMR0_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR0_Handler
B TIMR0_Handler
PUBWEAK TIMR1_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR1_Handler
B TIMR1_Handler
PUBWEAK TIMR2_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR2_Handler
B TIMR2_Handler
PUBWEAK TIMR3_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR3_Handler
B TIMR3_Handler
PUBWEAK TIMR4_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR4_Handler
B TIMR4_Handler
PUBWEAK TIMR5_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
TIMR5_Handler
B TIMR5_Handler
END

View File

@@ -38,14 +38,15 @@
#define SYS_CLK_DIV SYS_CLK_DIV_1
#define __HSI (20000000UL) //高速内部时钟
#define __LSI (32000UL) //低速内部时钟
#define __LSI (32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
* 注意VCO输出频率需要在 [600MHz, 1200MHz] 之间
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_XTAL //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define PLL_IN_DIV 5
@@ -57,8 +58,8 @@
#define PLL_OUT_DIV PLL_OUT_DIV8
uint32_t SystemCoreClock = (120000000UL); //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = ((120000000UL) / 1000000); //Cycles per micro second
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
/******************************************************************************************************************************************
* 函数名称:
@@ -110,6 +111,8 @@ void SystemCoreClockUpdate(void)
if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
SystemCoreClock /= 2;
CyclesPerUs = SystemCoreClock / 1000000;
}
/******************************************************************************************************************************************
@@ -121,56 +124,30 @@ void SystemCoreClockUpdate(void)
******************************************************************************************************************************************/
void SystemInit(void)
{
uint32_t i;
SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
Flash_Param_at_xMHz(120);
switch (SYS_CLK)
{
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
switchCLK_20MHz();
break;
case SYS_CLK_40MHz: //1 内部高频40MHz RC振荡器
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
switchCLK_40MHz();
break;
case SYS_CLK_32KHz: //2 内部低频32KHz RC振荡器
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
for (i = 0; i < 20000; i++)
;
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
switchCLK_32KHz();
break;
case SYS_CLK_XTAL: //3 外部晶体振荡器2-30MHz
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for (i = 0; i < 20000; i++)
;
SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
switchCLK_XTAL();
break;
case SYS_CLK_PLL: //4 片内锁相环输出
PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
switchCLK_PLL();
break;
}
@@ -178,25 +155,114 @@ 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);
}
}
static void delay_3ms(void)
{
uint32_t i;
if (((SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) == 0) &&
((SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) == 0)) //32KHz
{
for (i = 0; i < 20; i++)
__NOP();
}
else
{
for (i = 0; i < 20000; i++)
__NOP();
}
}
void switchCLK_20MHz(void)
{
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
delay_3ms();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_40MHz(void)
{
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
delay_3ms();
SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk; //HFCK <= HRC
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_32KHz(void)
{
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
delay_3ms();
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
}
void switchCLK_XTAL(void)
{
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
delay_3ms();
delay_3ms();
SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK <= XTAL
SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK <= HFCK
}
void switchCLK_PLL(void)
{
PLLInit();
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK <= PLL
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
}
void PLLInit(void)
{
uint32_t i;
if (SYS_PLL_SRC == SYS_CLK_20MHz)
{
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
delay_3ms();
SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
}
else if (SYS_PLL_SRC == SYS_CLK_XTAL)
{
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
for (i = 0; i < 20000; i++)
;
delay_3ms();
delay_3ms();
SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
}

View File

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

View File

@@ -22,7 +22,7 @@
/******************************************************************************************************************************************
* 函数名称: ADC_Init()
* 功能说明: ADC模数转换器初始化
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC有效值包括ADC0、ADC1
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC有效值包括ADC0、ADC1
* ADC_InitStructure * initStruct 包含ADC各相关定值的结构体
* 输 出: 无
* 注意事项: 无
@@ -63,9 +63,12 @@ void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
}
ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
(PGA_VCM_INTERNAL << ADC_CTRL2_PGAIVCM_Pos) |
(initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
(6 << ADC_CTRL2_PGAGAIN_Pos) |
((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
@@ -152,7 +155,7 @@ void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
/******************************************************************************************************************************************
* 函数名称: ADC_Open()
* 功能说明: ADC开启可以软件启动、或硬件触发ADC转换
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -164,7 +167,7 @@ void ADC_Open(ADC_TypeDef *ADCx)
/******************************************************************************************************************************************
* 函数名称: ADC_Close()
* 功能说明: ADC关闭无法软件启动、或硬件触发ADC转换
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -176,7 +179,7 @@ void ADC_Close(ADC_TypeDef *ADCx)
/******************************************************************************************************************************************
* 函数名称: ADC_Start()
* 功能说明: 软件触发模式下启动ADC转换
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -188,7 +191,7 @@ void ADC_Start(ADC_TypeDef *ADCx)
/******************************************************************************************************************************************
* 函数名称: ADC_Stop()
* 功能说明: 软件触发模式下停止ADC转换
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -235,9 +238,9 @@ static uint32_t chn2idx(uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_Read()
* 功能说明: 从指定通道读取转换结果
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要读取转换结果的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 读取到的转换结果
* 输 出: uint32_t 读取到的转换结果
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
@@ -255,9 +258,9 @@ uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IsEOC()
* 功能说明: 指定通道是否End Of Conversion
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要查询状态的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
@@ -270,7 +273,7 @@ uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_ChnSelect()
* 功能说明: ADC通道选通模数转换会在选通的通道上依次采样转换
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chns 要选通的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合即“按位或”运算
* 输 出: 无
* 注意事项: 无
@@ -284,7 +287,7 @@ void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
/******************************************************************************************************************************************
* 函数名称: ADC_IntEOCEn()
* 功能说明: 转换完成中断使能
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -299,7 +302,7 @@ void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntEOCDis()
* 功能说明: 转换完成中断禁止
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -314,7 +317,7 @@ void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntEOCClr()
* 功能说明: 转换完成中断标志清除
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -329,9 +332,9 @@ void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntEOCStat()
* 功能说明: 转换完成中断状态
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要查询的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -344,7 +347,7 @@ uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntOVFEn()
* 功能说明: 数据溢出中断使能
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -359,7 +362,7 @@ void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntOVFDis()
* 功能说明: 数据溢出中断禁止
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -374,7 +377,7 @@ void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntOVFClr()
* 功能说明: 数据溢出中断标志清除
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -389,9 +392,9 @@ void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntOVFStat()
* 功能说明: 数据溢出中断状态
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要查询的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -404,7 +407,7 @@ uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntHFULLEn()
* 功能说明: FIFO半满中断使能
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -419,7 +422,7 @@ void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntHFULLDis()
* 功能说明: FIFO半满中断禁止
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -434,7 +437,7 @@ void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntHFULLClr()
* 功能说明: FIFO半满中断标志清除
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -449,9 +452,9 @@ void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntHFULLStat()
* 功能说明: FIFO半满中断状态
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要查询的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -464,7 +467,7 @@ uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntFULLEn()
* 功能说明: FIFO满中断使能
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -479,7 +482,7 @@ void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntFULLDis()
* 功能说明: FIFO满中断禁止
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -494,7 +497,7 @@ void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntFULLClr()
* 功能说明: FIFO满中断标志清除
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要设置的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: 无
* 注意事项: 无
@@ -509,9 +512,9 @@ void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: ADC_IntFULLStat()
* 功能说明: FIFO满中断状态
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC可取值包括ADC
* uint32_t chn 要查询的通道有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)

View File

@@ -3,13 +3,14 @@
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 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 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及其组合即“按位或”运算
@@ -39,8 +40,8 @@ typedef struct
#define ADC_TRIGSRC_SW 0 //软件触发即ADC->START.GO写1启动转换
#define ADC_TRIGSRC_PWM 1
#define PGA_VCM_INTERNAL 1 //PGA输入共模电平由内部电路产生ADC_REFP和ADC_REFN可悬空
#define PGA_VCM_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转换
@@ -73,11 +74,4 @@ void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断禁止
void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断标志清除
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
/* ADC 内部 1.2V REFP电压输出到外部REFP引脚用于测量或在需要1.2V外部REFP时节省成本 */
#define ADC_TEST_INNER_REFP_OUT_EN(ADCx) (ADCx->CTRL3 |= (1 << ADC_CTRL3_REFP_OUT_Pos))
#define ADC_TEST_INNER_REFP_OUT_DIS(ADCx) (ADCx->CTRL3 &= ~(1 << ADC_CTRL3_REFP_OUT_Pos))
#define ADC_TEST_ADC_PGA_EXT_VCM_EN(ADCx) (ADCx->CTRL3 |= (1 << ADC_CTRL3_EXTVCM_Pos))
#define ADC_TEST_ADC_PGA_EXT_VCM_DIS(ADCx) (ADCx->CTRL3 &= ~(1 << ADC_CTRL3_EXTVCM_Pos))
#endif //__SWM320_ADC_H__

View File

@@ -1,22 +1,22 @@
#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
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
{
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
struct
{ // 0 must match 1 don't care
uint16_t FilterMask16b1;
uint16_t FilterMask16b2;
};
@@ -30,59 +30,59 @@ typedef struct
uint16_t FilterCheck16b2;
};
};
uint8_t RXNotEmptyIEn; //接收FIFO非空有数据可读
uint8_t RXOverflowIEn; //接收FIFO溢出有数据丢失
uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
uint8_t RXNotEmptyIEn; //接收FIFO非空有数据可读
uint8_t RXOverflowIEn; //接收FIFO溢出有数据丢失
uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
} CAN_InitStructure;
#define CAN_MODE_NORMAL 0 //常规模式
#define CAN_MODE_LISTEN 1 //监听模式
#define CAN_MODE_SELFTEST 2 //自测模式
#define CAN_MODE_NORMAL 0 //常规模式
#define CAN_MODE_LISTEN 1 //监听模式
#define CAN_MODE_SELFTEST 2 //自测模式
#define CAN_BS1_1tq 0
#define CAN_BS1_2tq 1
#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 remote; //消息是否为远程帧
uint8_t data[8]; //接收到的数据
uint8_t size; //接收到的数据个数
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);
@@ -104,38 +104,31 @@ void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uin
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);
uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef *CANx);
void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
uint32_t CAN_INTErrWarningStat(CAN_TypeDef *CANx);
void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
uint32_t CAN_INTRXOverflowStat(CAN_TypeDef *CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
void CAN_INTWakeupEn(CAN_TypeDef *CANx);
void CAN_INTWakeupDis(CAN_TypeDef *CANx);
uint32_t CAN_INTWakeupStat(CAN_TypeDef *CANx);
void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
uint32_t CAN_INTErrPassiveStat(CAN_TypeDef *CANx);
void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
uint32_t CAN_INTArbitrLostStat(CAN_TypeDef *CANx);
void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
uint32_t CAN_INTBusErrorStat(CAN_TypeDef *CANx);
uint32_t CAN_INTStat(CAN_TypeDef *CANx);
#endif //__SWM320_CAN_H__

View File

@@ -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,17 +21,16 @@
#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)
{

View File

@@ -1,23 +1,20 @@
#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);
/******************************************************************************************************************************************
* 函数名称: CRC_Write()
* 功能说明: CRC写入数据
* 输 入: uint32_t data 要写入的数据
* 输 出: 无
* 注意事项: 无
* 函数名称: CRC_Write()
* 功能说明: CRC写入数据
* 输 入: uint32_t data 要写入的数据
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE void CRC_Write(uint32_t data)
{
@@ -25,11 +22,11 @@ static __INLINE void CRC_Write(uint32_t data)
}
/******************************************************************************************************************************************
* 函数名称: CRC_Result()
* 功能说明: 获取CRC计算结果
* 输 入: 无
* 输 出: uint32_t CRC 计算结果
* 注意事项: 无
* 函数名称: CRC_Result()
* 功能说明: 获取CRC计算结果
* 输 入: 无
* 输 出: uint32_t CRC 计算结果
* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE uint32_t CRC_Result(void)
{

View File

@@ -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,23 +22,23 @@
#include "SWM320_dma.h"
/******************************************************************************************************************************************
* 函数名称: DMA_CHM_Config()
* 功能说明: DMA通道配置用于存储器间如Flash和RAM间搬运数据
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 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->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
DMA_CH_Close(chn); //配置前先关闭该通道
DMA_CH_Close(chn); //配置前先关闭该通道
DMA->CH[chn].SRC = src_addr;
DMA->CH[chn].DST = dst_addr;
@@ -50,10 +50,12 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
(dst_addr_incr << DMA_AM_DSTAM_Pos) |
(0 << DMA_AM_BURST_Pos);
DMA->IF = (1 << chn); //清除中断标志
DMA->IF = (1 << chn); //清除中断标志
DMA->IE |= (1 << chn);
if (int_en) DMA->IM &= ~(1 << chn);
else DMA->IM |= (1 << chn);
if (int_en)
DMA->IM &= ~(1 << chn);
else
DMA->IM |= (1 << chn);
if (int_en)
{
@@ -61,16 +63,16 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
}
else
{
//不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断
//不能调用NVIC_DisalbeIRQ(DMA_IRQn)因为其他通道可能使用DMA中断
}
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_Open()
* 功能说明: DMA通道打开
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 无
* 注意事项: 无
* 函数名称: DMA_CH_Open()
* 功能说明: DMA通道打开
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH2
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_Open(uint32_t chn)
{
@@ -78,11 +80,11 @@ void DMA_CH_Open(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_Close()
* 功能说明: DMA通道关闭
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 无
* 注意事项: 无
* 函数名称: DMA_CH_Close()
* 功能说明: DMA通道关闭
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH2
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_Close(uint32_t chn)
{
@@ -90,11 +92,11 @@ void DMA_CH_Close(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTEn()
* 功能说明: DMA中断使能数据搬运完成后触发中断
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 无
* 注意事项: 无
* 函数名称: DMA_CH_INTEn()
* 功能说明: DMA中断使能数据搬运完成后触发中断
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH2
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn)
{
@@ -102,11 +104,11 @@ void DMA_CH_INTEn(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTDis()
* 功能说明: DMA中断禁止数据搬运完成后不触发中断
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 无
* 注意事项: 无
* 函数名称: DMA_CH_INTDis()
* 功能说明: DMA中断禁止数据搬运完成后不触发中断
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH2
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTDis(uint32_t chn)
{
@@ -114,11 +116,11 @@ void DMA_CH_INTDis(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTClr()
* 功能说明: DMA中断标志清除
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 无
* 注意事项: 无
* 函数名称: DMA_CH_INTClr()
* 功能说明: DMA中断标志清除
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH2
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTClr(uint32_t chn)
{
@@ -126,11 +128,11 @@ void DMA_CH_INTClr(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTStat()
* 功能说明: DMA中断状态查询
* 输 入: uint32_t chn 指定要配置的通道有效值有DMA_CH0、DMA_CH1、DMA_CH1
* 输 出: 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)
{

View File

@@ -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__

View File

@@ -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,57 +21,57 @@
#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)
{
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
if (mode & 0x10)
{
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
if (mode & 0x01)
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
else
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
}
else
{
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
if (mode & 0x02)
{
GPIOx->INTBE |= (0x01 << n); //双边沿触发
GPIOx->INTBE |= (0x01 << n); //双边沿触发
}
else
{
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
if (mode & 0x01)
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
else
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
}
}
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
}
/******************************************************************************************************************************************
* 函数名称: EXTI_Open()
* 功能说明: 指定引脚外部中断打开(即使能)
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口有效值包括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)
{
@@ -79,12 +79,12 @@ void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t 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)
{
@@ -92,12 +92,12 @@ void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t 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)
{
@@ -105,25 +105,25 @@ uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* 函数名称: 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)
{
return (GPIOx->INTRAWSTAT >> 1) & 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)
{

View File

@@ -1,20 +1,18 @@
#ifndef __SWM320_EXTI_H__
#define __SWM320_EXTI_H__
void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否触发了中断
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
#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__

View File

@@ -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,77 +19,77 @@
#include "SWM320.h"
#include "SWM320_flash.h"
__attribute__((section("PlaceInRAM")))
static void switchTo80M(void)
{
uint32_t i;
for (i = 0; i < 50; i++) __NOP();
FLASH->CFG0 = 0x4bf;
FLASH->CFG1 = 0xabfc7a6e;
for (i = 0; i < 50; i++) __NOP();
}
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 擦除地址
* 输 出: 无
* 注意事项: 无
* 函数名称: FLASH_Erase()
* 功能说明: 片内Flash擦除
* 输 入: uint32_t addr 擦除地址扇区大小为4K Byte
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void FLASH_Erase(uint32_t addr)
{
// switchTo80M();
__disable_irq();
FLASH->ERASE = addr | ((uint32_t)1 << FLASH_ERASE_REQ_Pos);
while ((FLASH->STAT & FLASH_STAT_ERASE_GOING_Msk) == 0);
while ((FLASH->STAT & FLASH_STAT_ERASE_GOING_Msk) == 1);
IAP_Flash_Erase(addr / 0x1000);
FLASH->ERASE = 0;
IAP_Cache_Reset();
// switchTo40M();
__enable_irq();
}
/******************************************************************************************************************************************
* 函数名称: FLASH_Write()
* 功能说明: 片内Flash写入
* 输 入: uint32_t addr 写入地址
* uint32_t buff[] 要写入的数据
* uint32_t size 要写入数据的个数,字为单位
* 输 出: 无
* 注意事项:
* 函数名称: 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 size)
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
{
uint32_t i, j;
__disable_irq();
switchTo80M();
IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
FLASH->CACHE |= (1 << FLASH_CACHE_PROG_Pos);
IAP_Cache_Reset();
for (i = 0; i < size / 4; i++)
{
FLASH->ADDR = addr + i * 4 * 4;
for (j = 0; j < 4; j++)
FLASH->DATA = buff[i * 4 + j];
while ((FLASH->STAT & FLASH_STAT_FIFO_EMPTY_Msk) == 0) __NOP();
}
if ((size % 4) != 0)
{
FLASH->ADDR = addr + i * 4 * 4;
for (j = 0; j < size % 4; j++)
FLASH->DATA = buff[i * 4 + j];
while ((FLASH->STAT & FLASH_STAT_FIFO_EMPTY_Msk) == 0) __NOP();
}
while (FLASH->STAT & FLASH_STAT_PROG_GOING_Msk);
FLASH->CACHE |= (1 << FLASH_CACHE_CLEAR_Pos);
FLASH->CACHE = 0;
// switchTo40M();
__enable_irq();
}
/******************************************************************************************************************************************
* 函数名称: Flash_Param_at_xMHz()
* 功能说明: 将Flash参数设置成xMHz主频下运行时所需的参数
* 输 入: uint32_t x 可取值
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void Flash_Param_at_xMHz(uint32_t x)
{
__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();
}

View File

@@ -1,9 +1,19 @@
#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 size);
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
void Flash_Param_at_xMHz(uint32_t x);
typedef void (*IAP_Cache_Reset_t)(void);
typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
typedef void (*IAP_Flash_Erase_t)(uint32_t sector);
typedef void (*IAP_Flash_Write_t)(uint32_t flash_addr, uint32_t ram_addr, uint32_t count);
extern IAP_Cache_Reset_t IAP_Cache_Reset;
extern IAP_Flash_Param_t IAP_Flash_Param;
extern IAP_Flash_Erase_t IAP_Flash_Erase;
extern IAP_Flash_Write_t IAP_Flash_Write;
#endif //__SWM320_FLASH_H__

View File

@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* 文件名称: SWM320_gpio.c
* 功能说明: SWM320单片机的通用输入输出功能驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
* 文件名称: SWM320_gpio.c
* 功能说明: SWM320单片机的通用输入输出功能驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,17 +21,16 @@
#include "SWM320.h"
#include "SWM320_gpio.h"
/******************************************************************************************************************************************
* 函数名称: GPIO_Init()
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t dir 引脚方向0 输入 1 输出
* uint32_t pull_up 上拉电阻0 关闭上拉 1 开启上拉
* uint32_t pull_down 下拉电阻0 关闭下拉 1 开启下拉
* 输 出: 无
* 注意事项:
* 函数名称: GPIO_Init()
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t dir 引脚方向0 输入 1 输出
* uint32_t pull_up 上拉电阻0 关闭上拉 1 开启上拉
* uint32_t pull_down 下拉电阻0 关闭下拉 1 开启下拉
* 输 出: 无
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉GPIOB、GPION只有下拉PN0、PN1、PN2三个引脚有上拉没下拉
******************************************************************************************************************************************/
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
{
@@ -40,7 +39,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOA):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOA->DIR |= (0x01 << n);
@@ -59,7 +58,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOB):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOB->DIR |= (0x01 << n);
@@ -78,7 +77,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOC):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOC->DIR |= (0x01 << n);
@@ -97,7 +96,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOM):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOM->DIR |= (0x01 << n);
@@ -116,7 +115,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPION):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPION->DIR |= (0x01 << n);
@@ -135,7 +134,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
case ((uint32_t)GPIOP):
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能数字输入开启
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能数字输入开启
if (dir == 1)
{
GPIOP->DIR |= (0x01 << n);
@@ -154,12 +153,12 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
}
/******************************************************************************************************************************************
* 函数名称: GPIO_SetBit()
* 功能说明: 将参数指定的引脚电平置高
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_SetBit()
* 功能说明: 将参数指定的引脚电平置高
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@@ -167,12 +166,12 @@ void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_ClrBit()
* 功能说明: 将参数指定的引脚电平置低
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_ClrBit()
* 功能说明: 将参数指定的引脚电平置低
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@@ -180,12 +179,12 @@ void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_InvBit()
* 功能说明: 将参数指定的引脚电平反转
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_InvBit()
* 功能说明: 将参数指定的引脚电平反转
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@@ -193,12 +192,12 @@ void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_GetBit()
* 功能说明: 读取参数指定的引脚的电平状态
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
* 注意事项: 无
* 函数名称: GPIO_GetBit()
* 功能说明: 读取参数指定的引脚的电平状态
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
@@ -206,13 +205,13 @@ uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_SetBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置高的引脚的个数
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_SetBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置高的引脚的个数
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@@ -224,13 +223,13 @@ void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_ClrBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置低的引脚的个数
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_ClrBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置低的引脚的个数
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@@ -242,13 +241,13 @@ void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_InvBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平反转的引脚的个数
* 输 出: 无
* 注意事项: 无
* 函数名称: GPIO_InvBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平反转的引脚的个数
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@@ -260,14 +259,14 @@ void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
}
/******************************************************************************************************************************************
* 函数名称: GPIO_GetBits()
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置高的引脚的个数
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
* 注意事项: 无
* 函数名称: GPIO_GetBits()
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
* uint32_t w 指定要将引脚电平置高的引脚的个数
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
@@ -277,3 +276,102 @@ uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
return ((GPIOx->DATA >> n) & bits);
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBit()
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicClrBit()
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 0;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicInvBit()
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4));
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* uint32_t w 指定要将引脚电平置高的引脚的个数
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
uint32_t bits;
bits = 0xFFFFFF >> (24 - w);
__disable_irq();
GPIOx->DATA |= (bits << n);
__enable_irq();
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicClrBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* uint32_t w 指定要将引脚电平置低的引脚的个数
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
uint32_t bits;
bits = 0xFFFFFF >> (24 - w);
__disable_irq();
GPIOx->DATA &= ~(bits << n);
__enable_irq();
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicInvBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转确保引脚”读-改-写“操作的原子性不被中断ISR打断
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* uint32_t w 指定要将引脚电平反转的引脚的个数
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中有些在主循环中操作有些在中断ISR中操作时GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
uint32_t bits;
bits = 0xFFFFFF >> (24 - w);
__disable_irq();
GPIOx->DATA ^= (bits << n);
__enable_irq();
}

View File

@@ -1,17 +1,22 @@
#ifndef __SWM320_GPIO_H__
#define __SWM320_GPIO_H__
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n); //参数指定的引脚电平置低
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平反转
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //参数指定的从n开始的w位连续引脚的电平置低
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置低
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平反转
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n); //读取参数指定的引脚电平状态
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚电平置高
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //参数指定的从n开始的w位连续引脚的电平置低
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n);
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n);
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__

View File

@@ -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,12 +22,12 @@
#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)
{
@@ -42,13 +42,13 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
break;
}
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
if (initStruct->Master == 1)
{
I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
@@ -86,21 +86,21 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
(initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
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);
((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)
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
{
NVIC_EnableIRQ(I2C0_IRQn);
}
@@ -112,7 +112,7 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
case ((uint32_t)I2C1):
if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
{
NVIC_EnableIRQ(I2C1_IRQn);
}
@@ -126,11 +126,11 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
}
/******************************************************************************************************************************************
* 函数名称: I2C_Open()
* 功能说明: I2C打开允许收发
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C有效值包括I2C0、I2C1
* 输 出: 无
* 注意事项: 无
* 函数名称: I2C_Open()
* 功能说明: I2C打开允许收发
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C有效值包括I2C0、I2C1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void I2C_Open(I2C_TypeDef *I2Cx)
{
@@ -138,13 +138,82 @@ void I2C_Open(I2C_TypeDef *I2Cx)
}
/******************************************************************************************************************************************
* 函数名称: I2C_Close()
* 功能说明: I2C关闭禁止收发
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C有效值包括I2C0、I2C1
* 输 出: 无
* 注意事项: 无
* 函数名称: I2C_Close()
* 功能说明: I2C关闭禁止收发
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C有效值包括I2C0、I2C1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void I2C_Close(I2C_TypeDef *I2Cx)
{
I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
* 函数名称: 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)
{
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
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void I2C_Stop(I2C_TypeDef *I2Cx)
{
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
* 注意事项: 无
******************************************************************************************************************************************/
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 读取到的数据
* 注意事项: 无
******************************************************************************************************************************************/
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(); //等待接收完成
return I2Cx->MSTDAT;
}

View File

@@ -3,25 +3,29 @@
typedef struct
{
uint8_t Master; //1 主机模式
uint8_t Addr7b; //1 7位地址 0 10位地址
uint8_t Master; //1 主机模式
uint8_t Addr7b; //1 7位地址 0 10位地址
uint32_t MstClk; //主机传输时钟频率
uint8_t MstIEn; //主机模式中断使能
uint32_t MstClk; //主机传输时钟频率
uint8_t MstIEn; //主机模式中断使能
uint16_t SlvAddr; //从机地址
uint8_t SlvRxEndIEn; //从机接收完成中断使能
uint8_t SlvTxEndIEn; //从机发送完成中断使能
uint8_t SlvSTADetIEn; //从机检测到起始中断使能
uint8_t SlvSTODetIEn; //从机检测到终止中断使能
uint8_t SlvRdReqIEn; //从机接收到读请求中断使能
uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
uint16_t SlvAddr; //从机地址
uint8_t SlvRxEndIEn; //从机接收完成中断使能
uint8_t SlvTxEndIEn; //从机发送完成中断使能
uint8_t SlvSTADetIEn; //从机检测到起始中断使能
uint8_t SlvSTODetIEn; //从机检测到终止中断使能
uint8_t SlvRdReqIEn; //从机接收到读请求中断使能
uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
} I2C_InitStructure;
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
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);
#endif //__SWM320_I2C_H__

View File

@@ -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,12 +24,12 @@
#include <string.h>
/******************************************************************************************************************************************
* 函数名称: LCD_Init()
* 功能说明: LCD初始化
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* LCD_InitStructure * initStruct 包含LCD相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_Init()
* 功能说明: LCD初始化
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* LCD_InitStructure * initStruct 包含LCD相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
{
@@ -40,56 +40,24 @@ void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
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);
if (initStruct->Dir == LCD_DIR_LANDSCAPE)
{
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->Dir << LCD_CR1_DIRV_Pos) |
((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
{
LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_VPIX_Pos) |
((initStruct->VnPixel - 1) << LCD_CR0_HPIX_Pos) |
(initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
(initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
LCDx->CR1 = (initStruct->Dir << LCD_CR1_DIRV_Pos) |
((initStruct->Hfp - 1) << LCD_CR1_VFP_Pos) |
((initStruct->Hbp - 1) << LCD_CR1_VBP_Pos) |
((initStruct->Vfp - 1) << LCD_CR1_HFP_Pos) |
((initStruct->Vbp - 1) << LCD_CR1_HBP_Pos) |
(initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
(initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
}
}
else if (initStruct->Interface == LCD_INTERFACE_I80)
{
LCDx->START = (1 << LCD_START_MPUEN_Pos);
LCDx->CR1 = (1 << LCD_CR1_I80_Pos) |
(initStruct->T_CSf_WRf << LCD_CR1_TAS_Pos) |
(initStruct->T_WRnHold << LCD_CR1_TPWLW_Pos) |
(initStruct->T_WRr_CSr << LCD_CR1_TAH_Pos) |
(initStruct->T_CSr_CSf << LCD_CR1_TTAIL_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);
LCDx->IF = 1; //清除标志
if (initStruct->IntEOTEn)
LCD_INTEn(LCDx);
else
LCD_INTDis(LCDx);
switch ((uint32_t)LCDx)
{
@@ -107,23 +75,23 @@ void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
}
/******************************************************************************************************************************************
* 函数名称: LCD_Start()
* 功能说明: 启动一次数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_Start()
* 功能说明: 启动一次数据传输
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_Start(LCD_TypeDef *LCDx)
{
LCDx->START |= (1 << LCD_START_GO_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)
{
@@ -131,91 +99,11 @@ uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_I80_WriteReg()
* 功能说明: MPU接口时写寄存器
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* uint16_t reg 要写的寄存器其实地址,地址自增
* uint16_t val[] 寄存器值,数组地址必须自对齐
* uint16_t cnt 要写的寄存器个数
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_I80_WriteReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val[], uint16_t cnt)
{
LCD->SRCADDR = (uint32_t)val;
LCD->CR0 &= ~LCD_CR0_DLEN_Msk;
LCD->CR0 |= ((cnt - 1) << LCD_CR0_DLEN_Pos);
LCD->CR1 |= (1 << LCD_CR1_CMD_Pos);
LCD->CR1 &= ~LCD_CR1_REG_Msk;
LCD->CR1 |= (reg << LCD_CR1_REG_Pos);
LCD_Start(LCDx);
while (LCD_IsBusy(LCDx));
}
/******************************************************************************************************************************************
* 函数名称: LCD_I80_WriteOneReg()
* 功能说明: MPU接口时写寄存器
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* uint16_t reg 要写的寄存器其实地址
* uint16_t val 寄存器值
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_I80_WriteOneReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val)
{
uint16_t buf[1] __attribute__((aligned(4)));
buf[0] = val;
LCD_I80_WriteReg(LCDx, reg, buf, 1);
}
/******************************************************************************************************************************************
* 函数名称: LCD_I80_WriteData()
* 功能说明: MPU接口时写数据
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* uint16_t val[] 要写的数据,数组地址必须自对齐
* uint16_t cnt 要写的数据个数
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_I80_WriteData(LCD_TypeDef *LCDx, uint16_t val[], uint16_t cnt)
{
LCD->SRCADDR = (uint32_t)val;
LCD->CR0 &= ~LCD_CR0_DLEN_Msk;
LCD->CR0 |= ((cnt - 1) << LCD_CR0_DLEN_Pos);
LCD->CR1 &= ~(1 << LCD_CR1_CMD_Pos);
LCD_Start(LCDx);
while (LCD_IsBusy(LCDx));
}
/******************************************************************************************************************************************
* 函数名称: LCD_I80_WriteOneData()
* 功能说明: MPU接口时写数据
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* uint16_t val 要写的数据
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_I80_WriteOneData(LCD_TypeDef *LCDx, uint16_t val)
{
uint16_t buf[1] __attribute__((aligned(4)));
buf[0] = val;
LCD_I80_WriteData(LCDx, buf, 2);
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTEn()
* 功能说明: LCD中断使能完成指定长度的数据传输时触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTEn()
* 功能说明: LCD中断使能完成指定长度的数据传输时触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTEn(LCD_TypeDef *LCDx)
{
@@ -223,11 +111,11 @@ void LCD_INTEn(LCD_TypeDef *LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTDis()
* 功能说明: LCD中断禁止完成指定长度的数据传输时不触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTDis()
* 功能说明: LCD中断禁止完成指定长度的数据传输时不触发中断
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTDis(LCD_TypeDef *LCDx)
{
@@ -235,11 +123,11 @@ void LCD_INTDis(LCD_TypeDef *LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTClr()
* 功能说明: LCD中断标志清除
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
* 函数名称: LCD_INTClr()
* 功能说明: LCD中断标志清除
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void LCD_INTClr(LCD_TypeDef *LCDx)
{
@@ -247,11 +135,11 @@ void LCD_INTClr(LCD_TypeDef *LCDx)
}
/******************************************************************************************************************************************
* 函数名称: LCD_INTStat()
* 功能说明: LCD中断状态查询
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
* 注意事项: 无
* 函数名称: LCD_INTStat()
* 功能说明: LCD中断状态查询
* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD有效值包括LCD
* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
{

View File

@@ -1,96 +1,70 @@
#ifndef __SWM320_LCD_H__
#define __SWM320_LCD_H__
typedef struct
{
uint8_t Interface; //LCD屏接口LCD_INTERFACE_RGB、LCD_INTERFACE_I80、LCD_INTERFACE_M68
uint16_t HnPixel; //水平方向像素个数最大取值1024
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
uint8_t Hfp; //horizonal front porch最大取值32
uint8_t Hbp; //horizonal back porch 最大取值128
uint8_t Vfp; //vertical front porch 最大取值8
uint8_t Vbp; //vertical back porch 最大取值32
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK取值LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
/* RGB同步接口参数 */
uint8_t Dir; //LCD_DIR_LANDSCAPE 横屏 LCD_DIR_PORTRAIT 竖屏
uint16_t HnPixel; //水平方向像素个数最大取值1024
uint16_t VnPixel; //垂直方向像素个数,最大取值 768
uint8_t Hfp; //horizonal front porch最大取值32
uint8_t Hbp; //horizonal back porch 最大取值128
uint8_t Vfp; //vertical front porch 最大取值8
uint8_t Vbp; //vertical back porch 最大取值32
uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK取值LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
/* MPU8080接口参数 */
uint8_t T_CSf_WRf; //CSn下降沿到WRn下降沿的时间取值0--3
uint8_t T_WRnHold; //WRn低电平的持续时间 取值0--7
uint8_t T_WRr_CSr; //WRn上升沿到CSn上升沿的时间取值0--3
uint8_t T_CSr_CSf; //CSn上升沿到CSn下降沿的时间取值0--7
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_DIR_LANDSCAPE 0 //横屏
#define LCD_DIR_PORTRAIT 1 //竖屏
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#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
#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_I80_WriteReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val[], uint16_t cnt);
void LCD_I80_WriteOneReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val);
void LCD_I80_WriteData(LCD_TypeDef *LCDx, uint16_t data[], uint16_t cnt);
void LCD_I80_WriteOneData(LCD_TypeDef *LCDx, uint16_t val);
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__

View File

@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
* 文件名称: SWM320_norflash.c
* 功能说明: SWM320单片机的NOR Flash驱动程序
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 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,30 +21,30 @@
#include "SWM320.h"
#include "SWM320_norflash.h"
/******************************************************************************************************************************************
* 函数名称: NORFL_Init()
* 功能说明: NOR Flash控制器初始化
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: NORFL_Init()
* 功能说明: NOR Flash控制器初始化
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void NORFL_Init(NORFL_InitStructure *initStruct)
{
uint32_t i;
// 配置SRAM前需要刷新下SDRAM控制器
// 配置SRAM前需要刷新下SDRAM控制器
do
{
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
while (SDRAMC->REFDONE == 0);
while (SDRAMC->REFDONE == 0)
;
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
for (i = 0; i < 1000; i++) __NOP();
for (i = 0; i < 1000; i++)
__NOP();
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
}
while (0);
} while (0);
SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
@@ -53,19 +53,23 @@ void NORFL_Init(NORFL_InitStructure *initStruct)
(initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
NORFLC->IE = 3;
NORFLC->IF = 3; // 清除中断标志
if (initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
if (initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
NORFLC->IF = 3; // 清除中断标志
if (initStruct->OperFinishIEn)
NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
else
NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
if (initStruct->OperTimeoutIEn)
NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
else
NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
}
/******************************************************************************************************************************************
* 函数名称: NORFL_ChipErase()
* 功能说明: NOR Flash整片擦除
* 输 入: 无
* 输 出: uint32_t 0 擦除成功 1 擦除超时
* 注意事项: 无
* 函数名称: NORFL_ChipErase()
* 功能说明: NOR Flash整片擦除
* 输 入: 无
* 输 出: uint32_t 0 擦除成功 1 擦除超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t NORFL_ChipErase(void)
{
@@ -74,10 +78,13 @@ uint32_t NORFL_ChipErase(void)
NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if (NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@@ -85,11 +92,11 @@ uint32_t NORFL_ChipErase(void)
}
/******************************************************************************************************************************************
* 函数名称: 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)
{
@@ -99,10 +106,13 @@ uint32_t NORFL_SectorErase(uint32_t addr)
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if (NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@@ -110,12 +120,12 @@ uint32_t NORFL_SectorErase(uint32_t addr)
}
/******************************************************************************************************************************************
* 函数名称: NORFL_Write()
* 功能说明: NOR Flash写
* 输 入: uint32_t addr 数据要写入的地址
* uint32_t data 要写入的数据
* 输 出: uint32_t 0 写入成功 1 写入超时
* 注意事项: 硬件连接数据线为16位时半字写入数据线为8位时字节写入
* 函数名称: NORFL_Write()
* 功能说明: NOR Flash写
* 输 入: uint32_t addr 数据要写入的地址
* uint32_t data 要写入的数据
* 输 出: uint32_t 0 写入成功 1 写入超时
* 注意事项: 硬件连接数据线为16位时半字写入数据线为8位时字节写入
******************************************************************************************************************************************/
uint32_t NORFL_Write(uint32_t addr, uint32_t data)
{
@@ -125,10 +135,13 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
__NOP();
if (NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
else res = 1;
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
res = 0;
else
res = 1;
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
@@ -136,11 +149,11 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
}
/******************************************************************************************************************************************
* 函数名称: NORFL_Read()
* 功能说明: NOR Flash读
* 输 入: uint32_t addr 数据要读出的地址
* 输 出: uint32_t 读出的数据
* 注意事项: 硬件连接数据线为16位时半字读出数据线为8位时字节读出
* 函数名称: NORFL_Read()
* 功能说明: NOR Flash读
* 输 入: uint32_t addr 数据要读出的地址
* 输 出: uint32_t 读出的数据
* 注意事项: 硬件连接数据线为16位时半字读出数据线为8位时字节读出
******************************************************************************************************************************************/
uint32_t NORFL_Read(uint32_t addr)
{
@@ -151,11 +164,11 @@ uint32_t NORFL_Read(uint32_t addr)
}
/******************************************************************************************************************************************
* 函数名称: NORFL_ReadID()
* 功能说明: NOR Flash读ID
* 输 入: uint32_t id_addr ID地址此参数是芯片相关的每种芯片都不同
* 输 出: uint16_t 读取到的ID
* 注意事项: 无
* 函数名称: NORFL_ReadID()
* 功能说明: NOR Flash读ID
* 输 入: uint32_t id_addr ID地址此参数是芯片相关的每种芯片都不同
* 输 出: uint16_t 读取到的ID
* 注意事项: 无
******************************************************************************************************************************************/
uint16_t NORFL_ReadID(uint32_t id_addr)
{
@@ -168,7 +181,7 @@ uint16_t NORFL_ReadID(uint32_t id_addr)
id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
return id;
}

View File

@@ -3,17 +3,15 @@
typedef struct
{
uint8_t DataWidth; // 8、16
uint8_t DataWidth; // 8、16
uint8_t WELowPulseTime; // WE# pulse width单位为系统时钟周期最大值为7
uint8_t OEPreValidTime; // Valid data output after OE# low单位为系统时钟周期最大值为15
uint8_t WELowPulseTime; // WE# pulse width单位为系统时钟周期最大值为7
uint8_t OEPreValidTime; // Valid data output after OE# low单位为系统时钟周期最大值为15
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
uint8_t OperTimeoutIEn;
} NORFL_InitStructure;
void NORFL_Init(NORFL_InitStructure *initStruct);
uint32_t NORFL_ChipErase(void);
uint32_t NORFL_SectorErase(uint32_t addr);
@@ -21,19 +19,16 @@ 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_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
#define NORFL_CMD_READ 0
#define NORFL_CMD_RESET 1
#define NORFL_CMD_AUTO_SELECT 2
#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__

View File

@@ -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,17 +21,16 @@
#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)
{

View File

@@ -24,7 +24,7 @@
/******************************************************************************************************************************************
* 函数名称: PWM_Init()
* 功能说明: PWM初始化
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* PWM_InitStructure * initStruct 包含PWM相关设定值的结构体
* 输 出: 无
* 注意事项: 无
@@ -101,9 +101,9 @@ void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
/******************************************************************************************************************************************
* 函数名称: PWM_Start()
* 功能说明: 启动PWM开始PWM输出
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chA 0 通道A不启动 1 通道A启动
* uint32_t chB 0 通道B不启动 1 通道B启动
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chA 0 通道A不启动 1 通道A启动
* uint32_t chB 0 通道B不启动 1 通道B启动
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -140,9 +140,9 @@ void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
/******************************************************************************************************************************************
* 函数名称: PWM_Stop()
* 功能说明: 关闭PWM停止PWM输出
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chA 0 通道A不关闭 1 通道A关闭
* uint32_t chB 0 通道B不关闭 1 通道B关闭
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chA 0 通道A不关闭 1 通道A关闭
* uint32_t chB 0 通道B不关闭 1 通道B关闭
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -179,7 +179,7 @@ void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
/******************************************************************************************************************************************
* 函数名称: PWM_SetCycle()
* 功能说明: 设置周期
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* uint16_t cycle 要设定的周期值
* 输 出: 无
@@ -196,9 +196,9 @@ void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
/******************************************************************************************************************************************
* 函数名称: PWM_GetCycle()
* 功能说明: 获取周期
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要查询哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: uint16_t 获取到的周期值
* 输 出: uint16_t 获取到的周期值
* 注意事项: 无
******************************************************************************************************************************************/
uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
@@ -216,7 +216,7 @@ uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_SetHDuty()
* 功能说明: 设置高电平时长
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* uint16_t hduty 要设定的高电平时长
* 输 出: 无
@@ -233,9 +233,9 @@ void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
/******************************************************************************************************************************************
* 函数名称: PWM_GetHDuty()
* 功能说明: 获取高电平时长
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要查询哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: uint16_t 获取到的高电平时长
* 输 出: uint16_t 获取到的高电平时长
* 注意事项: 无
******************************************************************************************************************************************/
uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
@@ -253,7 +253,7 @@ uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_SetDeadzone()
* 功能说明: 设置死区时长
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* uint8_t deadzone 要设定的死区时长
* 输 出: 无
@@ -270,9 +270,9 @@ void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
/******************************************************************************************************************************************
* 函数名称: PWM_GetDeadzone()
* 功能说明: 获取死区时长
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要查询哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: uint8_t 获取到的死区时长
* 输 出: uint8_t 获取到的死区时长
* 注意事项: 无
******************************************************************************************************************************************/
uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
@@ -290,7 +290,7 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntNCycleEn()
* 功能说明: 新周期开始中断使能
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -346,7 +346,7 @@ void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntNCycleDis()
* 功能说明: 新周期开始中断禁能
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -402,7 +402,7 @@ void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntNCycleClr()
* 功能说明: 新周期开始中断标志清除
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -458,9 +458,9 @@ void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntNCycleStat()
* 功能说明: 新周期开始中断是否发生
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
* 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
@@ -518,7 +518,7 @@ uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntHEndEn()
* 功能说明: 高电平结束中断使能
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -574,7 +574,7 @@ void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntHEndDis()
* 功能说明: 高电平结束中断禁能
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -630,7 +630,7 @@ void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntHEndClr()
* 功能说明: 高电平结束中断标志清除
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: 无
* 注意事项: 无
@@ -686,9 +686,9 @@ void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
/******************************************************************************************************************************************
* 函数名称: PWM_IntHEndStat()
* 功能说明: 高电平结束中断是否发生
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
* uint32_t chn 选择要设置哪个通道有效值PWM_CH_A、PWM_CH_B
* 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
* 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)

View File

@@ -1,46 +1,44 @@
#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;
uint8_t Date;
uint8_t Hour;
uint8_t Minute;
uint8_t Second;
uint8_t SecondIEn;
uint8_t MinuteIEn;
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;
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;
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);
@@ -51,7 +49,6 @@ void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
void RTC_IntSecondEn(RTC_TypeDef *RTCx);
void RTC_IntSecondDis(RTC_TypeDef *RTCx);
void RTC_IntSecondClr(RTC_TypeDef *RTCx);

View File

@@ -1,116 +1,109 @@
#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_CLK_400KHz 0
#define SD_CLK_20MHz 1
#define SD_BUSWIDTH_1b 0
#define SD_BUSWIDTH_4b 2
#define SD_RES_OK 0
#define SD_RES_ERR 1
#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
{
@@ -122,14 +115,23 @@ typedef struct
uint8_t CardType;
} SD_CardInfo;
extern SD_CardInfo SD_cardInfo;
uint32_t SDIO_Init(void);
void SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[]);
void SDIO_BlockRead(uint32_t block_addr, uint32_t buff[]);
uint32_t SDIO_Init(uint32_t freq);
uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[]);
uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[]);
void SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read);
uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
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);
#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]);

View File

@@ -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,37 +22,95 @@
#include "SWM320_sdram.h"
/******************************************************************************************************************************************
* 函数名称: SDRAM_Init()
* 功能说明: SDRAM控制器初始化
* 输 入: SDRAM_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
* 函数名称: SDRAM_Init()
* 功能说明: SDRAM控制器初始化
* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
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分频
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length为4
(2 << SDRAMC_CR0_CASDELAY_Pos);
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 == 16 ? 0 : 1) << SDRAMC_CR1_CELL32BIT_Pos) |
(initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
(initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
((initStruct->DataWidth == 16 ? 0 : 1) << SDRAMC_CR1_32BIT_Pos) |
(7 << SDRAMC_CR1_TMRD_Pos) |
(3 << SDRAMC_CR1_TRRD_Pos) |
(7 << SDRAMC_CR1_TRAS_Pos) |
(8 << SDRAMC_CR1_TRC_Pos) |
(3 << SDRAMC_CR1_TRCD_Pos) |
(3 << SDRAMC_CR1_TRP_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;
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
(0x0FA << SDRAMC_REFRESH_RATE_Pos);
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;
}
while (SDRAMC->REFDONE == 0);
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
* 输 入: 无
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
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();
}
/******************************************************************************************************************************************
* 函数名称: 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();
}

View File

@@ -3,21 +3,79 @@
typedef struct
{
uint8_t DataWidth; // 16、32
uint8_t CellSize; // SDRAM颗粒的容量SDRAM_CELLSIZE_16Mb、SDRAM_CELLSIZE_64Mb、SDRAM_CELLSIZE_128Mb、SDRAM_CELLSIZE_256Mb
uint8_t CellBank; // SDRAM颗粒有几个bankSDRAM_CELLBANK_2、SDRAM_CELLBANK_4
uint8_t CellWidth; // SDRAM颗粒的位宽SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
uint8_t CASLatency; // 列地址到有效数据输出间隔SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
uint8_t CellSize; // SDRAM颗粒的容量
uint8_t CellBank; // SDRAM颗粒有几个bank
uint8_t CellWidth; // SDRAM颗粒的位宽 16、32
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 delayRefresh命令到Activate命令间延时也是两个连续Refresh命令间延时
uint8_t TimeTRCD; // Row to column delay行地址到列地址间延时也即Activate命令到读写命令间延时
uint8_t TimeTRP; // Row precharge delayPrecharge命令到另一个命令间延时
} 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_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_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_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_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_Enable(void);
void SDRAM_Disable(void);
#endif //__SWM320_SDRAM_H__

View File

@@ -3,57 +3,56 @@
typedef struct
{
uint8_t FrameFormat; //帧格式SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下选择数据采样边沿SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下选择空闲时无数据传输时时钟线的电平SPI_LOW_LEVEL、SPI_HIGH_LEVEL
uint8_t WordSize; //字长度, 有效值4-16
uint8_t Master; //1 主机模式 0 从机模式
uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv有效值SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
uint8_t FrameFormat; //帧格式SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下选择数据采样边沿SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下选择空闲时无数据传输时时钟线的电平SPI_LOW_LEVEL、SPI_HIGH_LEVEL
uint8_t WordSize; //字长度, 有效值4-16
uint8_t Master; //1 主机模式 0 从机模式
uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv有效值SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
uint8_t RXHFullIEn; //接收FIFO半满中断使能
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
uint8_t RXHFullIEn; //接收FIFO半满中断使能
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
} SPI_InitStructure;
#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
#define SPI_LOW_LEVEL 0 //空闲时时钟线保持低电平
#define SPI_HIGH_LEVEL 1 //空闲时时钟线保持高电平
#define SPI_LOW_LEVEL 0 //空闲时时钟线保持低电平
#define SPI_HIGH_LEVEL 1 //空闲时时钟线保持高电平
#define SPI_CLKDIV_4 0
#define SPI_CLKDIV_8 1
#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关闭禁止收发
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开允许收发
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭禁止收发
uint32_t SPI_Read(SPI_TypeDef *SPIx);
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //接收FIFO是否空如果不空则可以继续SPI_Read()
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满如果不满则可以继续SPI_Write()
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //接收FIFO是否空如果不空则可以继续SPI_Read()
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满如果不满则可以继续SPI_Write()
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
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);
@@ -62,14 +61,20 @@ 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);
#endif //__SWM320_SPI_H__

View File

@@ -0,0 +1,56 @@
/******************************************************************************************************************************************
* 文件名称: SWM320_sram.c
* 功能说明: SWM320单片机的SRAM驱动程序
* 技术支持: 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
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
* -ECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
#include "SWM320.h"
#include "SWM320_sram.h"
/******************************************************************************************************************************************
* 函数名称: SRAM_Init()
* 功能说明: SRAM控制器初始化
* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
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); // 使能字节、半字访问
}

Some files were not shown because too many files have changed in this diff Show More