mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-02-09 05:00:00 +08:00
update lib
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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__
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
#ifndef __SWM320_DMA_H__
|
||||
#define __SWM320_DMA_H__
|
||||
|
||||
#define DMA_CH0 0
|
||||
#define DMA_CH1 1
|
||||
#define DMA_CH2 2
|
||||
|
||||
#define DMA_CH0 0
|
||||
#define DMA_CH1 1
|
||||
#define DMA_CH2 2
|
||||
|
||||
|
||||
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
void DMA_CH_Open(uint32_t chn); //DMA通道打开
|
||||
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
|
||||
|
||||
void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
|
||||
void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
|
||||
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
|
||||
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
|
||||
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
void DMA_CH_Open(uint32_t chn); //DMA通道打开
|
||||
void DMA_CH_Close(uint32_t chn); //DMA通道关闭
|
||||
|
||||
void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
|
||||
void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
|
||||
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
|
||||
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
|
||||
|
||||
#endif //__SWM320_DMA_H__
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
* @attention
|
||||
@@ -21,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)
|
||||
{
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
|
||||
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
|
||||
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
|
||||
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
|
||||
|
||||
/* 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分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
|
||||
uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
|
||||
uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
|
||||
uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
|
||||
|
||||
/* MPU(8080)接口参数 */
|
||||
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__
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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]);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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颗粒有几个bank,SDRAM_CELLBANK_2、SDRAM_CELLBANK_4
|
||||
uint8_t CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
|
||||
uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
|
||||
|
||||
uint8_t CellSize; // SDRAM颗粒的容量
|
||||
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 delay,Refresh命令到Activate命令间延时,也是两个连续Refresh命令间延时
|
||||
uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
|
||||
uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
|
||||
} SDRAM_InitStructure;
|
||||
|
||||
#define SDRAM_CELLSIZE_16Mb 3
|
||||
#define SDRAM_CELLSIZE_64Mb 0
|
||||
#define SDRAM_CELLSIZE_128Mb 1
|
||||
#define SDRAM_CELLSIZE_256Mb 2
|
||||
#define SDRAM_CELLSIZE_16Mb 3
|
||||
#define SDRAM_CELLSIZE_64Mb 0
|
||||
#define SDRAM_CELLSIZE_128Mb 1
|
||||
#define SDRAM_CELLSIZE_256Mb 2
|
||||
|
||||
#define SDRAM_CELLBANK_2 0
|
||||
#define SDRAM_CELLBANK_4 1
|
||||
#define SDRAM_CELLBANK_2 0
|
||||
#define SDRAM_CELLBANK_4 1
|
||||
|
||||
#define SDRAM_CELLWIDTH_16 0
|
||||
#define SDRAM_CELLWIDTH_32 1
|
||||
|
||||
#define SDRAM_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__
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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__
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user