Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
RT-Thread
rt-thread
提交
2c052969
R
rt-thread
项目概览
RT-Thread
/
rt-thread
大约 1 年 前同步成功
通知
774
Star
8911
Fork
4735
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2c052969
编写于
5月 06, 2021
作者:
Y
yanmowudi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
format utf-8
上级
c00300d5
变更
46
展开全部
隐藏空白更改
内联
并排
Showing
46 changed file
with
8358 addition
and
8270 deletion
+8358
-8270
bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
+3288
-3346
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
...ibraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
+15
-15
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
...ibraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
+1
-1
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
...ibraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
+1
-1
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
+199
-198
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.h
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.h
+12
-16
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
+242
-227
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
+72
-74
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
+462
-463
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
+110
-106
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
+29
-30
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
+8
-11
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
+83
-81
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
+10
-13
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
+86
-86
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
+12
-14
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
+36
-38
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
+0
-4
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
+288
-289
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
+16
-18
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
+168
-164
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
+22
-22
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
+53
-51
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
+58
-61
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
...wm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
+136
-121
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
...wm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
+17
-21
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
+183
-184
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
+410
-418
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
+530
-437
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
+48
-49
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
+140
-134
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
+58
-58
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
+483
-451
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
+100
-106
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
+62
-49
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
+71
-72
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
+138
-138
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
+73
-76
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
+24
-21
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
+22
-24
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
+263
-258
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
+16
-19
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
+208
-194
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
+64
-68
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
+31
-32
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
+10
-11
未找到文件。
bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
浏览文件 @
2c052969
...
...
@@ -79,7 +79,7 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD
GPIOA5_Handler
DCD
GPIOA6_Handler
DCD
GPIOA7_Handler
DCD
GPIOB0_Handler
DCD
GPIOB0_Handler
DCD
GPIOB1_Handler
DCD
GPIOB2_Handler
DCD
GPIOB3_Handler
...
...
@@ -103,19 +103,19 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD
GPIOM5_Handler
DCD
GPIOM6_Handler
DCD
GPIOM7_Handler
DCD
DMA_Handler
DCD
DMA_Handler
DCD
LCD_Handler
DCD
NORFLC_Handler
DCD
CAN_Handler
DCD
CAN_Handler
DCD
PULSE_Handler
DCD
WDT_Handler
DCD
PWM_Handler
DCD
UART0_Handler
DCD
UART1_Handler
DCD
UART2_Handler
DCD
UART3_Handler
DCD
0
DCD
I2C0_Handler
DCD
UART1_Handler
DCD
UART2_Handler
DCD
UART3_Handler
DCD
0
DCD
I2C0_Handler
DCD
I2C1_Handler
DCD
SPI0_Handler
DCD
ADC0_Handler
...
...
@@ -130,13 +130,13 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD
GPIOP_Handler
DCD
ADC1_Handler
DCD
FPU_Handler
DCD
SPI1_Handler
DCD
TIMR0_Handler
DCD
TIMR1_Handler
DCD
TIMR2_Handler
DCD
TIMR3_Handler
DCD
TIMR4_Handler
DCD
TIMR5_Handler
DCD
SPI1_Handler
DCD
TIMR0_Handler
DCD
TIMR1_Handler
DCD
TIMR2_Handler
DCD
TIMR3_Handler
DCD
TIMR4_Handler
DCD
TIMR5_Handler
__Vectors_End
...
...
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
浏览文件 @
2c052969
...
...
@@ -113,7 +113,7 @@ __isr_vector:
.
long
TIMR4_Handler
.
long
TIMR5_Handler
.
section
.
text
.
Reset_Handler
.
section
.
text
.
Reset_Handler
.
align
2
.
globl
Reset_Handler
.
type
Reset_Handler
,
%
function
...
...
bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
浏览文件 @
2c052969
...
...
@@ -84,7 +84,7 @@ __vector_table
DCD
DMA_Handler
DCD
LCD_Handler
DCD
NORFLC_Handler
DCD
CAN_Handler
DCD
CAN_Handler
DCD
PULSE_Handler
DCD
WDT_Handler
DCD
PWM_Handler
...
...
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
浏览文件 @
2c052969
...
...
@@ -17,56 +17,48 @@
* -ECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
*******************************************************************************************************************************************/
#include <stdint.h>
#include "SWM320.h"
/******************************************************************************************************************************************
* 系统时钟设定
*****************************************************************************************************************************************/
#define SYS_CLK_20MHz 0 //0 内部高频20MHz RC振荡器
#define SYS_CLK_40MHz 1 //1 内部高频40MHz RC振荡器
#define SYS_CLK_32KHz 2 //2 内部低频32KHz RC振荡器
#define SYS_CLK_XTAL 3 //3 外部晶体振荡器(2-30MHz)
#define SYS_CLK_PLL 4 //4 片内锁相环输出
#define SYS_CLK SYS_CLK_PLL
#define SYS_CLK_20MHz 0 //0 内部高频20MHz RC振荡器
#define SYS_CLK_40MHz 1 //1 内部高频40MHz RC振荡器
#define SYS_CLK_32KHz 2 //2 内部低频32KHz RC振荡器
#define SYS_CLK_XTAL 3 //3 外部晶体振荡器(2-30MHz)
#define SYS_CLK_PLL 4 //4 片内锁相环输出
#define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1
#define SYS_CLK SYS_CLK_PLL
#define SYS_CLK_DIV SYS_CLK_DIV_1
#define SYS_CLK_DIV_1 0
#define SYS_CLK_DIV_2 1
#define SYS_CLK_DIV SYS_CLK_DIV_1
#define __HSI (20000000UL) //高速内部时钟
#define __LSI ( 32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
#define __HSI (20000000UL) //高速内部时钟
#define __LSI (32000UL) //低速内部时钟
#define __HSE (20000000UL) //高速外部时钟
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define PLL_IN_DIV 5
#define PLL_FB_DIV 60
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
#define PLL_IN_DIV 5
#define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2
#define PLL_FB_DIV 60
#define PLL_OUT_DIV PLL_OUT_DIV8
#define PLL_OUT_DIV8 0
#define PLL_OUT_DIV4 1
#define PLL_OUT_DIV2 2
#define PLL_OUT_DIV PLL_OUT_DIV8
uint32_t
SystemCoreClock
=
__HSI
;
//System Clock Frequency (Core Clock)
uint32_t
CyclesPerUs
=
(
__HSI
/
1000000
);
//Cycles per micro second
uint32_t
SystemCoreClock
=
__HSI
;
//System Clock Frequency (Core Clock)
uint32_t
CyclesPerUs
=
(
__HSI
/
1000000
);
//Cycles per micro second
/******************************************************************************************************************************************
* 函数名称:
...
...
@@ -75,50 +67,51 @@ uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
* 输 出:
* 注意事项:
******************************************************************************************************************************************/
void
SystemCoreClockUpdate
(
void
)
void
SystemCoreClockUpdate
(
void
)
{
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_SYS_Msk
)
//SYS_CLK <= HFCK
{
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_HFCK_Msk
)
//HFCK <= XTAL
{
SystemCoreClock
=
__HSE
;
}
else
//HFCK <= HRC
{
if
(
SYS
->
HRCCR
&
SYS_HRCCR_DBL_Msk
)
//HRC = 40MHz
{
SystemCoreClock
=
__HSI
*
2
;
}
else
//HRC = 20MHz
{
SystemCoreClock
=
__HSI
;
}
}
}
else
//SYS_CLK <= LFCK
{
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_LFCK_Msk
)
//LFCK <= PLL
{
if
(
SYS
->
PLLCR
&
SYS_PLLCR_INSEL_Msk
)
//PLL_SRC <= HRC
{
SystemCoreClock
=
__HSI
;
}
else
//PLL_SRC <= XTAL
{
SystemCoreClock
=
__HSE
;
}
SystemCoreClock
=
SystemCoreClock
/
PLL_IN_DIV
*
PLL_FB_DIV
*
4
/
(
2
<<
(
2
-
PLL_OUT_DIV
));
}
else
//LFCK <= LRC
{
SystemCoreClock
=
__LSI
;
}
}
if
(
SYS
->
CLKDIV
&
SYS_CLKDIV_SYS_Msk
)
SystemCoreClock
/=
2
;
CyclesPerUs
=
SystemCoreClock
/
1000000
;
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_SYS_Msk
)
//SYS_CLK <= HFCK
{
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_HFCK_Msk
)
//HFCK <= XTAL
{
SystemCoreClock
=
__HSE
;
}
else
//HFCK <= HRC
{
if
(
SYS
->
HRCCR
&
SYS_HRCCR_DBL_Msk
)
//HRC = 40MHz
{
SystemCoreClock
=
__HSI
*
2
;
}
else
//HRC = 20MHz
{
SystemCoreClock
=
__HSI
;
}
}
}
else
//SYS_CLK <= LFCK
{
if
(
SYS
->
CLKSEL
&
SYS_CLKSEL_LFCK_Msk
)
//LFCK <= PLL
{
if
(
SYS
->
PLLCR
&
SYS_PLLCR_INSEL_Msk
)
//PLL_SRC <= HRC
{
SystemCoreClock
=
__HSI
;
}
else
//PLL_SRC <= XTAL
{
SystemCoreClock
=
__HSE
;
}
SystemCoreClock
=
SystemCoreClock
/
PLL_IN_DIV
*
PLL_FB_DIV
*
4
/
(
2
<<
(
2
-
PLL_OUT_DIV
));
}
else
//LFCK <= LRC
{
SystemCoreClock
=
__LSI
;
}
}
if
(
SYS
->
CLKDIV
&
SYS_CLKDIV_SYS_Msk
)
SystemCoreClock
/=
2
;
CyclesPerUs
=
SystemCoreClock
/
1000000
;
}
/******************************************************************************************************************************************
...
...
@@ -129,152 +122,160 @@ void SystemCoreClockUpdate(void)
* 注意事项:
******************************************************************************************************************************************/
void
SystemInit
(
void
)
{
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_ANAC_Pos
);
Flash_Param_at_xMHz
(
120
);
switch
(
SYS_CLK
)
{
case
SYS_CLK_20MHz
:
//0 内部高频20MHz RC振荡器
switchCLK_20MHz
();
break
;
case
SYS_CLK_40MHz
:
//1 内部高频40MHz RC振荡器
switchCLK_40MHz
();
break
;
case
SYS_CLK_32KHz
:
//2 内部低频32KHz RC振荡器
switchCLK_32KHz
();
break
;
case
SYS_CLK_XTAL
:
//3 外部晶体振荡器(2-30MHz)
switchCLK_XTAL
();
break
;
case
SYS_CLK_PLL
:
//4 片内锁相环输出
switchCLK_PLL
();
break
;
}
SYS
->
CLKDIV
&=
~
SYS_CLKDIV_SYS_Msk
;
SYS
->
CLKDIV
|=
(
SYS_CLK_DIV
<<
SYS_CLKDIV_SYS_Pos
);
SystemCoreClockUpdate
();
if
(
SystemCoreClock
>
80000000
)
{
Flash_Param_at_xMHz
(
120
);
}
else
if
(
SystemCoreClock
>
40000000
)
{
Flash_Param_at_xMHz
(
80
);
}
else
if
(
SystemCoreClock
>
30000000
)
{
Flash_Param_at_xMHz
(
40
);
}
else
{
Flash_Param_at_xMHz
(
30
);
}
{
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_ANAC_Pos
);
Flash_Param_at_xMHz
(
120
);
switch
(
SYS_CLK
)
{
case
SYS_CLK_20MHz
:
//0 内部高频20MHz RC振荡器
switchCLK_20MHz
();
break
;
case
SYS_CLK_40MHz
:
//1 内部高频40MHz RC振荡器
switchCLK_40MHz
();
break
;
case
SYS_CLK_32KHz
:
//2 内部低频32KHz RC振荡器
switchCLK_32KHz
();
break
;
case
SYS_CLK_XTAL
:
//3 外部晶体振荡器(2-30MHz)
switchCLK_XTAL
();
break
;
case
SYS_CLK_PLL
:
//4 片内锁相环输出
switchCLK_PLL
();
break
;
}
SYS
->
CLKDIV
&=
~
SYS_CLKDIV_SYS_Msk
;
SYS
->
CLKDIV
|=
(
SYS_CLK_DIV
<<
SYS_CLKDIV_SYS_Pos
);
SystemCoreClockUpdate
();
if
(
SystemCoreClock
>
80000000
)
{
Flash_Param_at_xMHz
(
120
);
}
else
if
(
SystemCoreClock
>
40000000
)
{
Flash_Param_at_xMHz
(
80
);
}
else
if
(
SystemCoreClock
>
30000000
)
{
Flash_Param_at_xMHz
(
40
);
}
else
{
Flash_Param_at_xMHz
(
30
);
}
}
void
switchCLK_20MHz
(
void
)
{
uint32_t
i
;
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
0
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 20MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_HFCK_Msk
;
//HFCK <= HRC
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
uint32_t
i
;
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
0
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 20MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_HFCK_Msk
;
//HFCK <= HRC
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
}
void
switchCLK_40MHz
(
void
)
{
uint32_t
i
;
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
1
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 40MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_HFCK_Msk
;
//HFCK <= HRC
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
uint32_t
i
;
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
1
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 40MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_HFCK_Msk
;
//HFCK <= HRC
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
}
void
switchCLK_32KHz
(
void
)
{
uint32_t
i
;
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_RTCBKP_Pos
);
SYS
->
LRCCR
&=
~
(
1
<<
SYS_LRCCR_OFF_Pos
);
for
(
i
=
0
;
i
<
100
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_LFCK_Msk
;
//LFCK <= LRC
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_SYS_Msk
;
//SYS_CLK <= LFCK
uint32_t
i
;
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_RTCBKP_Pos
);
SYS
->
LRCCR
&=
~
(
1
<<
SYS_LRCCR_OFF_Pos
);
for
(
i
=
0
;
i
<
100
;
i
++
)
__NOP
();
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_LFCK_Msk
;
//LFCK <= LRC
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_SYS_Msk
;
//SYS_CLK <= LFCK
}
void
switchCLK_XTAL
(
void
)
{
uint32_t
i
;
SYS
->
XTALCR
=
(
1
<<
SYS_XTALCR_EN_Pos
);
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_HFCK_Pos
);
//HFCK <= XTAL
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
uint32_t
i
;
SYS
->
XTALCR
=
(
1
<<
SYS_XTALCR_EN_Pos
);
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_HFCK_Pos
);
//HFCK <= XTAL
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_SYS_Pos
);
//SYS_CLK <= HFCK
}
void
switchCLK_PLL
(
void
)
{
uint32_t
i
;
PLLInit
();
SYS
->
PLLCR
|=
(
1
<<
SYS_PLLCR_OUTEN_Pos
);
for
(
i
=
0
;
i
<
10000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_LFCK_Pos
);
//LFCK <= PLL
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_SYS_Msk
;
//SYS_CLK <= LFCK
uint32_t
i
;
PLLInit
();
SYS
->
PLLCR
|=
(
1
<<
SYS_PLLCR_OUTEN_Pos
);
for
(
i
=
0
;
i
<
10000
;
i
++
)
__NOP
();
SYS
->
CLKSEL
|=
(
1
<<
SYS_CLKSEL_LFCK_Pos
);
//LFCK <= PLL
SYS
->
CLKSEL
&=
~
SYS_CLKSEL_SYS_Msk
;
//SYS_CLK <= LFCK
}
void
PLLInit
(
void
)
{
uint32_t
i
;
if
(
SYS_PLL_SRC
==
SYS_CLK_20MHz
)
{
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
0
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 20MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
PLLCR
|=
(
1
<<
SYS_PLLCR_INSEL_Pos
);
//PLL_SRC <= HRC
}
else
if
(
SYS_PLL_SRC
==
SYS_CLK_XTAL
)
{
SYS
->
XTALCR
=
(
1
<<
SYS_XTALCR_EN_Pos
);
for
(
i
=
0
;
i
<
20000
;
i
++
);
SYS
->
PLLCR
&=
~
(
1
<<
SYS_PLLCR_INSEL_Pos
);
//PLL_SRC <= XTAL
}
SYS
->
PLLDIV
&=
~
(
SYS_PLLDIV_INDIV_Msk
|
SYS_PLLDIV_FBDIV_Msk
|
SYS_PLLDIV_OUTDIV_Msk
);
SYS
->
PLLDIV
|=
(
PLL_IN_DIV
<<
SYS_PLLDIV_INDIV_Pos
)
|
(
PLL_FB_DIV
<<
SYS_PLLDIV_FBDIV_Pos
)
|
(
PLL_OUT_DIV
<<
SYS_PLLDIV_OUTDIV_Pos
);
SYS
->
PLLCR
&=
~
(
1
<<
SYS_PLLCR_OFF_Pos
);
while
(
SYS
->
PLLLOCK
==
0
);
//等待PLL锁定
uint32_t
i
;
if
(
SYS_PLL_SRC
==
SYS_CLK_20MHz
)
{
SYS
->
HRCCR
=
(
0
<<
SYS_HRCCR_OFF_Pos
)
|
(
0
<<
SYS_HRCCR_DBL_Pos
);
//HRC = 20MHz
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
PLLCR
|=
(
1
<<
SYS_PLLCR_INSEL_Pos
);
//PLL_SRC <= HRC
}
else
if
(
SYS_PLL_SRC
==
SYS_CLK_XTAL
)
{
SYS
->
XTALCR
=
(
1
<<
SYS_XTALCR_EN_Pos
);
for
(
i
=
0
;
i
<
20000
;
i
++
)
;
SYS
->
PLLCR
&=
~
(
1
<<
SYS_PLLCR_INSEL_Pos
);
//PLL_SRC <= XTAL
}
SYS
->
PLLDIV
&=
~
(
SYS_PLLDIV_INDIV_Msk
|
SYS_PLLDIV_FBDIV_Msk
|
SYS_PLLDIV_OUTDIV_Msk
);
SYS
->
PLLDIV
|=
(
PLL_IN_DIV
<<
SYS_PLLDIV_INDIV_Pos
)
|
(
PLL_FB_DIV
<<
SYS_PLLDIV_FBDIV_Pos
)
|
(
PLL_OUT_DIV
<<
SYS_PLLDIV_OUTDIV_Pos
);
SYS
->
PLLCR
&=
~
(
1
<<
SYS_PLLCR_OFF_Pos
);
while
(
SYS
->
PLLLOCK
==
0
)
;
//等待PLL锁定
}
bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.h
浏览文件 @
2c052969
...
...
@@ -2,28 +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
switchCLK_20MHz
(
void
);
extern
void
switchCLK_40MHz
(
void
);
extern
void
switchCLK_32KHz
(
void
);
extern
void
switchCLK_XTAL
(
void
);
extern
void
switchCLK_PLL
(
void
);
extern
void
PLLInit
(
void
);
extern
void
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
}
...
...
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
浏览文件 @
2c052969
#ifndef __SWM320_ADC_H__
#define __SWM320_ADC_H__
typedef
struct
{
uint8_t
clk_src
;
//ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
uint8_t
clk_div
;
//ADC转换时钟分频,取值1--31
uint8_t
pga_ref
;
//PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
uint8_t
channels
;
//ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
samplAvg
;
//采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
uint8_t
trig_src
;
//ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
uint8_t
Continue
;
//在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
// 0 单次转换模式,转换完成后START位自动清除停止转换
uint8_t
EOC_IEn
;
//EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
OVF_IEn
;
//OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
HFULL_IEn
;
//FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
FULL_IEn
;
//FIFO 满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
#define __SWM320_ADC_H__
typedef
struct
{
uint8_t
clk_src
;
//ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
uint8_t
clk_div
;
//ADC转换时钟分频,取值1--31
uint8_t
pga_ref
;
//PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
uint8_t
channels
;
//ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
samplAvg
;
//采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
uint8_t
trig_src
;
//ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
uint8_t
Continue
;
//在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
// 0 单次转换模式,转换完成后START位自动清除停止转换
uint8_t
EOC_IEn
;
//EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
OVF_IEn
;
//OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
HFULL_IEn
;
//FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
uint8_t
FULL_IEn
;
//FIFO 满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
}
ADC_InitStructure
;
#define ADC_CH0 0x01
#define ADC_CH1 0x02
#define ADC_CH2 0x04
#define ADC_CH3 0x08
#define ADC_CH4 0x10
#define ADC_CH5 0x20
#define ADC_CH6 0x40
#define ADC_CH7 0x80
#define ADC_CLKSRC_HRC 1
#define ADC_CLKSRC_VCO_DIV16 2
#define ADC_CLKSRC_VCO_DIV32 3
#define ADC_CLKSRC_VCO_DIV64 4
#define ADC_AVG_SAMPLE1 0
#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
#define ADC_AVG_SAMPLE4 3
#define ADC_AVG_SAMPLE8 7
#define ADC_AVG_SAMPLE16 15
#define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
#define ADC_TRIGSRC_PWM 1
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
void
ADC_Init
(
ADC_TypeDef
*
ADCx
,
ADC_InitStructure
*
initStruct
);
//ADC模数转换器初始化
void
ADC_Open
(
ADC_TypeDef
*
ADCx
);
//ADC开启,可以软件启动、或硬件触发ADC转换
void
ADC_Close
(
ADC_TypeDef
*
ADCx
);
//ADC关闭,无法软件启动、或硬件触发ADC转换
void
ADC_Start
(
ADC_TypeDef
*
ADCx
);
//启动指定ADC,开始模数转换
void
ADC_Stop
(
ADC_TypeDef
*
ADCx
);
//关闭指定ADC,停止模数转换
uint32_t
ADC_Read
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//从指定通道读取转换结果
uint32_t
ADC_IsEOC
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//指定通道是否End Of Conversion
void
ADC_ChnSelect
(
ADC_TypeDef
*
ADCx
,
uint32_t
chns
);
void
ADC_IntEOCEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断使能
void
ADC_IntEOCDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断禁止
void
ADC_IntEOCClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断标志清除
uint32_t
ADC_IntEOCStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断状态
void
ADC_IntOVFEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断使能
void
ADC_IntOVFDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断禁止
void
ADC_IntOVFClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断标志清除
uint32_t
ADC_IntOVFStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断状态
void
ADC_IntHFULLEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断使能
void
ADC_IntHFULLDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断禁止
void
ADC_IntHFULLClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断标志清除
uint32_t
ADC_IntHFULLStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断状态
void
ADC_IntFULLEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断使能
void
ADC_IntFULLDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断禁止
void
ADC_IntFULLClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断标志清除
uint32_t
ADC_IntFULLStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断状态
#define ADC_CH0 0x01
#define ADC_CH1 0x02
#define ADC_CH2 0x04
#define ADC_CH3 0x08
#define ADC_CH4 0x10
#define ADC_CH5 0x20
#define ADC_CH6 0x40
#define ADC_CH7 0x80
#define ADC_CLKSRC_HRC 1
#define ADC_CLKSRC_VCO_DIV16 2
#define ADC_CLKSRC_VCO_DIV32 3
#define ADC_CLKSRC_VCO_DIV64 4
#define ADC_AVG_SAMPLE1 0
#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
#define ADC_AVG_SAMPLE4 3
#define ADC_AVG_SAMPLE8 7
#define ADC_AVG_SAMPLE16 15
#define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
#define ADC_TRIGSRC_PWM 1
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
void
ADC_Init
(
ADC_TypeDef
*
ADCx
,
ADC_InitStructure
*
initStruct
);
//ADC模数转换器初始化
void
ADC_Open
(
ADC_TypeDef
*
ADCx
);
//ADC开启,可以软件启动、或硬件触发ADC转换
void
ADC_Close
(
ADC_TypeDef
*
ADCx
);
//ADC关闭,无法软件启动、或硬件触发ADC转换
void
ADC_Start
(
ADC_TypeDef
*
ADCx
);
//启动指定ADC,开始模数转换
void
ADC_Stop
(
ADC_TypeDef
*
ADCx
);
//关闭指定ADC,停止模数转换
uint32_t
ADC_Read
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//从指定通道读取转换结果
uint32_t
ADC_IsEOC
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//指定通道是否End Of Conversion
void
ADC_ChnSelect
(
ADC_TypeDef
*
ADCx
,
uint32_t
chns
);
void
ADC_IntEOCEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断使能
void
ADC_IntEOCDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断禁止
void
ADC_IntEOCClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断标志清除
uint32_t
ADC_IntEOCStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//转换完成中断状态
void
ADC_IntOVFEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断使能
void
ADC_IntOVFDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断禁止
void
ADC_IntOVFClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断标志清除
uint32_t
ADC_IntOVFStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//数据溢出中断状态
void
ADC_IntHFULLEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断使能
void
ADC_IntHFULLDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断禁止
void
ADC_IntHFULLClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断标志清除
uint32_t
ADC_IntHFULLStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO半满中断状态
void
ADC_IntFULLEn
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断使能
void
ADC_IntFULLDis
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断禁止
void
ADC_IntFULLClr
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断标志清除
uint32_t
ADC_IntFULLStat
(
ADC_TypeDef
*
ADCx
,
uint32_t
chn
);
//FIFO满中断状态
#endif //__SWM320_ADC_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
浏览文件 @
2c052969
#ifndef __SWM320_CAN_H__
#define __SWM320_CAN_H__
#define CAN_FRAME_STD 0
#define CAN_FRAME_EXT 1
typedef
struct
{
uint8_t
Mode
;
//CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
uint8_t
CAN_BS1
;
//CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
uint8_t
CAN_BS2
;
//CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
uint8_t
CAN_SJW
;
//CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t
Baudrate
;
//波特率,即位传输速率,取值1--1000000
uint8_t
FilterMode
;
//CAN_FILTER_16b、CAN_FILTER_32b
union
{
uint32_t
FilterMask32b
;
//FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
struct
{
// 0 must match 1 don't care
uint16_t
FilterMask16b1
;
uint16_t
FilterMask16b2
;
};
};
union
{
uint32_t
FilterCheck32b
;
struct
{
uint16_t
FilterCheck16b1
;
uint16_t
FilterCheck16b2
;
};
};
uint8_t
RXNotEmptyIEn
;
//接收FIFO非空,有数据可读
uint8_t
RXOverflowIEn
;
//接收FIFO溢出,有数据丢失
uint8_t
ArbitrLostIEn
;
//控制器丢失仲裁变成接收方
uint8_t
ErrPassiveIEn
;
//接收/发送错误计数值达到127
#define CAN_FRAME_STD 0
#define CAN_FRAME_EXT 1
typedef
struct
{
uint8_t
Mode
;
//CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
uint8_t
CAN_BS1
;
//CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
uint8_t
CAN_BS2
;
//CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
uint8_t
CAN_SJW
;
//CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
uint32_t
Baudrate
;
//波特率,即位传输速率,取值1--1000000
uint8_t
FilterMode
;
//CAN_FILTER_16b、CAN_FILTER_32b
union
{
uint32_t
FilterMask32b
;
//FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
struct
{
// 0 must match 1 don't care
uint16_t
FilterMask16b1
;
uint16_t
FilterMask16b2
;
};
};
union
{
uint32_t
FilterCheck32b
;
struct
{
uint16_t
FilterCheck16b1
;
uint16_t
FilterCheck16b2
;
};
};
uint8_t
RXNotEmptyIEn
;
//接收FIFO非空,有数据可读
uint8_t
RXOverflowIEn
;
//接收FIFO溢出,有数据丢失
uint8_t
ArbitrLostIEn
;
//控制器丢失仲裁变成接收方
uint8_t
ErrPassiveIEn
;
//接收/发送错误计数值达到127
}
CAN_InitStructure
;
#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_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_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器
typedef
struct
{
uint32_t
id
;
//消息ID
uint8_t
format
;
//帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t
remote
;
//消息是否为远程帧
uint8_t
size
;
//接收到的数据个数
uint8_t
data
[
8
];
//接收到的数据
#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_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_FILTER_16b 0 //两个16位过滤器
#define CAN_FILTER_32b 1 //一个32位过滤器
typedef
struct
{
uint32_t
id
;
//消息ID
uint8_t
format
;
//帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
uint8_t
remote
;
//消息是否为远程帧
uint8_t
size
;
//接收到的数据个数
uint8_t
data
[
8
];
//接收到的数据
}
CAN_RXMessage
;
void
CAN_Init
(
CAN_TypeDef
*
CANx
,
CAN_InitStructure
*
initStruct
);
void
CAN_Open
(
CAN_TypeDef
*
CANx
);
void
CAN_Close
(
CAN_TypeDef
*
CANx
);
void
CAN_
Init
(
CAN_TypeDef
*
CANx
,
CAN_InitStructure
*
initStruct
);
void
CAN_
Open
(
CAN_TypeDef
*
CANx
);
void
CAN_
Close
(
CAN_TypeDef
*
CANx
);
void
CAN_
Transmit
(
CAN_TypeDef
*
CANx
,
uint32_t
format
,
uint32_t
id
,
uint8_t
data
[],
uint32_t
size
,
uint32_t
once
);
void
CAN_
TransmitRequest
(
CAN_TypeDef
*
CANx
,
uint32_t
format
,
uint32_t
id
,
uint32_t
once
);
void
CAN_
Receive
(
CAN_TypeDef
*
CANx
,
CAN_RXMessage
*
msg
);
void
CAN_Transmit
(
CAN_TypeDef
*
CANx
,
uint32_t
format
,
uint32_t
id
,
uint8_t
data
[],
uint32_t
size
,
uint32_t
once
);
void
CAN_TransmitRequest
(
CAN_TypeDef
*
CANx
,
uint32_t
format
,
uint32_t
id
,
uint32_t
once
);
void
CAN_Receive
(
CAN_TypeDef
*
CANx
,
CAN_RXMessage
*
msg
);
uint32_t
CAN_TXComplete
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_TXSuccess
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_TXComplete
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_TXSuccess
(
CAN_TypeDef
*
CANx
);
void
CAN_AbortTransmit
(
CAN_TypeDef
*
CANx
);
void
CAN_AbortTransmit
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_TXBufferReady
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_RXDataAvailable
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_TXBufferReady
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_RXDataAvailable
(
CAN_TypeDef
*
CANx
);
void
CAN_SetBaudrate
(
CAN_TypeDef
*
CANx
,
uint32_t
baudrate
,
uint32_t
CAN_BS1
,
uint32_t
CAN_BS2
,
uint32_t
CAN_SJW
);
void
CAN_SetBaudrate
(
CAN_TypeDef
*
CANx
,
uint32_t
baudrate
,
uint32_t
CAN_BS1
,
uint32_t
CAN_BS2
,
uint32_t
CAN_SJW
);
void
CAN_SetFilter32b
(
CAN_TypeDef
*
CANx
,
uint32_t
check
,
uint32_t
mask
);
void
CAN_SetFilter16b
(
CAN_TypeDef
*
CANx
,
uint16_t
check1
,
uint16_t
mask1
,
uint16_t
check2
,
uint16_t
mask2
);
void
CAN_
SetFilter32b
(
CAN_TypeDef
*
CANx
,
uint32_t
check
,
uint32_t
mask
);
void
CAN_
SetFilter16b
(
CAN_TypeDef
*
CANx
,
uint16_t
check1
,
uint16_t
mask1
,
uint16_t
check2
,
uint16_t
mask2
);
void
CAN_
INTRXNotEmptyEn
(
CAN_TypeDef
*
CANx
);
void
CAN_
INTRXNotEmptyDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTTXBufEmptyEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTTXBufEmptyDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
RXNotEmptyEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
RXNotEmptyDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrWarningEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrWarningDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTTXBufEmptyEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTTXBufEmptyDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowClear
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrWarningEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrWarningDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
WakeupEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
WakeupDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTRXOverflowClear
(
CAN_TypeDef
*
CANx
);
void
CAN_INTErrPassiveEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTErrPassiveDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
WakeupEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
WakeupDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ArbitrLostEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ArbitrLostDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrPassiveEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
ErrPassiveDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
BusErrorEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INT
BusErrorDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTArbitrLostEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTArbitrLostDis
(
CAN_TypeDef
*
CANx
);
void
CAN_INTBusErrorEn
(
CAN_TypeDef
*
CANx
);
void
CAN_INTBusErrorDis
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_INTStat
(
CAN_TypeDef
*
CANx
);
uint32_t
CAN_INTStat
(
CAN_TypeDef
*
CANx
);
#endif //__SWM320_CAN_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
浏览文件 @
2c052969
/******************************************************************************************************************************************
*
文
件名称: SWM320_crc.c
*
功能说明: SWM320单片
机的CRC模块驱动库
*
技
术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注
意事项:
*
版本日期: V1.1.0 2017年
10月25日
*
升
级记录:
*
文件名称
: SWM320_crc.c
*
功能说明: SWM320单片机的CRC模块驱动库
*
技术支持
: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项
:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录
:
*
*
*******************************************************************************************************************************************
...
...
@@ -21,31 +21,30 @@
#include "SWM320.h"
#include "SWM320_crc.h"
/******************************************************************************************************************************************
* 函数名称: CRC_Init()
*
功能说明: CR
C 初始化
*
输 入: CRC_TypeDef * CRCx 指定要被设置的C
RC接口,有效值包括CRC
* uint32_t mode
工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CR
C16_IN16、CRC16_IN8
* uint32_t out_not
输出
结果是否取反
* uint32_t out_rev
输出
结果是否翻转
* uint32_t ini_val CRC
初始
值
*
输 出
: 无
*
注意事
项: 无
*
函数名称
: CRC_Init()
*
功能说明: CRC 初始化
*
输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括
CRC
* uint32_t mode
工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、
CRC16_IN8
* uint32_t out_not
输出结果是否取反
* uint32_t out_rev
输出结果是否翻转
* uint32_t ini_val CRC
初始值
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
CRC_Init
(
CRC_TypeDef
*
CRCx
,
uint32_t
mode
,
uint32_t
out_not
,
uint32_t
out_rev
,
uint32_t
ini_val
)
void
CRC_Init
(
CRC_TypeDef
*
CRCx
,
uint32_t
mode
,
uint32_t
out_not
,
uint32_t
out_rev
,
uint32_t
ini_val
)
{
switch
((
uint32_t
)
CRCx
)
{
case
((
uint32_t
)
CRC
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_CRC_Pos
);
break
;
}
CRCx
->
CR
=
(
1
<<
CRC_CR_EN_Pos
)
|
(
mode
<<
CRC_CR_CRC16_Pos
)
|
(
out_not
<<
CRC_CR_ONOT_Pos
)
|
(
out_rev
<<
CRC_CR_OREV_Pos
);
CRCx
->
INIVAL
=
ini_val
;
switch
((
uint32_t
)
CRCx
)
{
case
((
uint32_t
)
CRC
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_CRC_Pos
);
break
;
}
CRCx
->
CR
=
(
1
<<
CRC_CR_EN_Pos
)
|
(
mode
<<
CRC_CR_CRC16_Pos
)
|
(
out_not
<<
CRC_CR_ONOT_Pos
)
|
(
out_rev
<<
CRC_CR_OREV_Pos
);
CRCx
->
INIVAL
=
ini_val
;
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
浏览文件 @
2c052969
#ifndef __SWM320_CRC_H__
#define __SWM320_CRC_H__
#define CRC32_IN32 0 //CRC32算法,输入数据32位
#define CRC32_IN16 2 //CRC32算法,输入数据16位
#define CRC32_IN8 4 //CRC32算法,输入数据 8位
#define CRC16_IN16 3 //CRC16算法,输入数据16位
#define CRC16_IN8 5 //CRC16算法,输入数据 8位
#define CRC32_IN32 0 //CRC32算法,输入数据32位
#define CRC32_IN16 2 //CRC32算法,输入数据16位
#define CRC32_IN8 4 //CRC32算法,输入数据 8位
#define CRC16_IN16 3 //CRC16算法,输入数据16位
#define CRC16_IN8 5 //CRC16算法,输入数据 8位
void
CRC_Init
(
CRC_TypeDef
*
CRCx
,
uint32_t
mode
,
uint32_t
out_not
,
uint32_t
out_rev
,
uint32_t
ini_val
);
void
CRC_Init
(
CRC_TypeDef
*
CRCx
,
uint32_t
mode
,
uint32_t
out_not
,
uint32_t
out_rev
,
uint32_t
ini_val
);
/******************************************************************************************************************************************
* 函数名称: CRC_Write()
...
...
@@ -21,7 +18,7 @@ void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_
******************************************************************************************************************************************/
static
__INLINE
void
CRC_Write
(
uint32_t
data
)
{
CRC
->
DATAIN
=
data
;
CRC
->
DATAIN
=
data
;
}
/******************************************************************************************************************************************
...
...
@@ -33,7 +30,7 @@ static __INLINE void CRC_Write(uint32_t data)
******************************************************************************************************************************************/
static
__INLINE
uint32_t
CRC_Result
(
void
)
{
return
CRC
->
RESULT
;
return
CRC
->
RESULT
;
}
#endif //__SWM320_CRC_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
浏览文件 @
2c052969
/******************************************************************************************************************************************
*
文件名称
: SWM320_dma.c
*
功能说明: SWM320单片机的DMA功能驱动库
*
技术支持
: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项
:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录
:
*
文件名称:
SWM320_dma.c
*
功能说明: SWM320单片机的DMA功能驱动库
*
技术支持:
http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录:
*
*
*******************************************************************************************************************************************
...
...
@@ -22,117 +22,119 @@
#include "SWM320_dma.h"
/******************************************************************************************************************************************
*
函数名称
: DMA_CHM_Config()
*
功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
* uint32_t src_addr
源地址,必须字对齐,即地址的最低2位必须是0
0
* uint32_t src_addr_incr 0
固定地址 1 地址递增
* uint32_t dst_addr
目的地址,必须字对齐,即地址的最低2位必须是0
0
* uint32_t dst_addr_incr 0
固定地址 1 地址递增
* uint32_t num_word
要搬运的数据字数,最大1
024
* uint32_t int_en
中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
*
输 出: 无
*
注意事项: 搬运数据量以字为单元,不是字节
*
函数名称:
DMA_CHM_Config()
*
功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
* uint32_t src_addr
源地址,必须字对齐,即地址的最低2位必须是00
* uint32_t src_addr_incr 0
固定地址 1 地址递增
* uint32_t dst_addr
目的地址,必须字对齐,即地址的最低2位必须是00
* uint32_t dst_addr_incr 0
固定地址 1 地址递增
* uint32_t num_word
要搬运的数据字数,最大1024
* uint32_t int_en
中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
*
输 出: 无
*
注意事项: 搬运数据量以字为单元,不是字节
******************************************************************************************************************************************/
void
DMA_CHM_Config
(
uint32_t
chn
,
uint32_t
src_addr
,
uint32_t
src_addr_incr
,
uint32_t
dst_addr
,
uint32_t
dst_addr_incr
,
uint32_t
num_word
,
uint32_t
int_en
)
{
DMA
->
EN
=
1
;
//每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
DMA_CH_Close
(
chn
);
//配置前先关闭该通道
DMA
->
CH
[
chn
].
SRC
=
src_addr
;
DMA
->
CH
[
chn
].
DST
=
dst_addr
;
DMA
->
CH
[
chn
].
CR
=
((
num_word
*
4
-
1
)
<<
DMA_CR_LEN_Pos
)
|
(
0
<<
DMA_CR_AUTORE_Pos
);
DMA
->
CH
[
chn
].
AM
=
(
src_addr_incr
<<
DMA_AM_SRCAM_Pos
)
|
(
dst_addr_incr
<<
DMA_AM_DSTAM_Pos
)
|
(
0
<<
DMA_AM_BURST_Pos
);
DMA
->
IF
=
(
1
<<
chn
);
//清除中断标志
DMA
->
IE
|=
(
1
<<
chn
);
if
(
int_en
)
DMA
->
IM
&=
~
(
1
<<
chn
);
else
DMA
->
IM
|=
(
1
<<
chn
);
if
(
int_en
)
{
NVIC_EnableIRQ
(
DMA_IRQn
);
}
else
{
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
}
DMA
->
EN
=
1
;
//每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
DMA_CH_Close
(
chn
);
//配置前先关闭该通道
DMA
->
CH
[
chn
].
SRC
=
src_addr
;
DMA
->
CH
[
chn
].
DST
=
dst_addr
;
DMA
->
CH
[
chn
].
CR
=
((
num_word
*
4
-
1
)
<<
DMA_CR_LEN_Pos
)
|
(
0
<<
DMA_CR_AUTORE_Pos
);
DMA
->
CH
[
chn
].
AM
=
(
src_addr_incr
<<
DMA_AM_SRCAM_Pos
)
|
(
dst_addr_incr
<<
DMA_AM_DSTAM_Pos
)
|
(
0
<<
DMA_AM_BURST_Pos
);
DMA
->
IF
=
(
1
<<
chn
);
//清除中断标志
DMA
->
IE
|=
(
1
<<
chn
);
if
(
int_en
)
DMA
->
IM
&=
~
(
1
<<
chn
);
else
DMA
->
IM
|=
(
1
<<
chn
);
if
(
int_en
)
{
NVIC_EnableIRQ
(
DMA_IRQn
);
}
else
{
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
}
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_Open()
*
功能说明: DMA通道打开
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: 无
*
注意事项: 无
*
函数名称:
DMA_CH_Open()
*
功能说明: DMA通道打开
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
DMA_CH_Open
(
uint32_t
chn
)
{
DMA
->
CH
[
chn
].
CR
|=
(
1
<<
DMA_CR_TXEN_Pos
);
DMA
->
CH
[
chn
].
CR
|=
(
1
<<
DMA_CR_TXEN_Pos
);
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_Close()
*
功能说明: DMA通道关闭
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: 无
*
注意事项: 无
*
函数名称:
DMA_CH_Close()
*
功能说明: DMA通道关闭
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
DMA_CH_Close
(
uint32_t
chn
)
{
DMA
->
CH
[
chn
].
CR
&=
~
(
1
<<
DMA_CR_TXEN_Pos
);
DMA
->
CH
[
chn
].
CR
&=
~
(
1
<<
DMA_CR_TXEN_Pos
);
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_INTEn()
*
功能说明: DMA中断使能,数据搬运完成后触发中断
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: 无
*
注意事项: 无
*
函数名称:
DMA_CH_INTEn()
*
功能说明: DMA中断使能,数据搬运完成后触发中断
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
DMA_CH_INTEn
(
uint32_t
chn
)
{
DMA
->
IM
&=
~
(
1
<<
chn
);
DMA
->
IM
&=
~
(
1
<<
chn
);
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_INTDis()
*
功能说明: DMA中断禁止,数据搬运完成后不触发中断
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: 无
*
注意事项: 无
*
函数名称:
DMA_CH_INTDis()
*
功能说明: DMA中断禁止,数据搬运完成后不触发中断
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
DMA_CH_INTDis
(
uint32_t
chn
)
{
DMA
->
IM
|=
(
1
<<
chn
);
DMA
->
IM
|=
(
1
<<
chn
);
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_INTClr()
*
功能说明: DMA中断标志清除
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: 无
*
注意事项: 无
*
函数名称:
DMA_CH_INTClr()
*
功能说明: DMA中断标志清除
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
DMA_CH_INTClr
(
uint32_t
chn
)
{
DMA
->
IF
=
(
1
<<
chn
);
DMA
->
IF
=
(
1
<<
chn
);
}
/******************************************************************************************************************************************
*
函数名称
: DMA_CH_INTStat()
*
功能说明: DMA中断状态查询
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、D
MA_CH2
*
输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
*
注意事项: 无
*
函数名称:
DMA_CH_INTStat()
*
功能说明: DMA中断状态查询
*
输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
*
输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
*
注意事项: 无
******************************************************************************************************************************************/
uint32_t
DMA_CH_INTStat
(
uint32_t
chn
)
{
return
(
DMA
->
IF
&
(
1
<<
chn
))
?
1
:
0
;
{
return
(
DMA
->
IF
&
(
1
<<
chn
))
?
1
:
0
;
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
浏览文件 @
2c052969
#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__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
浏览文件 @
2c052969
/******************************************************************************************************************************************
*
文件名称
: SWM320_exti.c
*
功能说明: SWM320单片机的外部中断功能驱动库
*
技术支持
: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项
:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录
:
*
文件名称:
SWM320_exti.c
*
功能说明: SWM320单片机的外部中断功能驱动库
*
技术支持:
http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录:
*
*******************************************************************************************************************************************
* @attention
...
...
@@ -21,111 +21,111 @@
#include "SWM320_exti.h"
/******************************************************************************************************************************************
*
函数名称
: EXTI_Init()
*
功能说明: 指定引脚外部中断初始化
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
* uint32_t mode
有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、E
XTI_HIGH_LEVEL
*
输 出: 无
*
注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
*
所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和N
VIC_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、EXT
I_HIGH_LEVEL
*
输 出: 无
*
注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
*
所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableI
RQ(GPIOA_IRQn)
******************************************************************************************************************************************/
void
EXTI_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
mode
)
void
EXTI_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
mode
)
{
EXTI_Close
(
GPIOx
,
n
);
//配置关键寄存器前先关闭
if
(
mode
&
0x10
)
{
GPIOx
->
INTLVLTRG
|=
(
0x01
<<
n
);
//电平触发
if
(
mode
&
0x01
)
GPIOx
->
INTRISEEN
|=
(
0x01
<<
n
);
//高电平触发
else
GPIOx
->
INTRISEEN
&=
~
(
0x01
<<
n
);
//低电平触发
}
else
{
GPIOx
->
INTLVLTRG
&=
~
(
0x01
<<
n
);
//边沿触发
if
(
mode
&
0x02
)
{
GPIOx
->
INTBE
|=
(
0x01
<<
n
);
//双边沿触发
}
else
{
GPIOx
->
INTBE
&=
~
(
0x01
<<
n
);
//单边沿触发
if
(
mode
&
0x01
)
GPIOx
->
INTRISEEN
|=
(
0x01
<<
n
);
//上升沿触发
else
GPIOx
->
INTRISEEN
&=
~
(
0x01
<<
n
);
//下降沿触发
}
}
GPIOx
->
INTCLR
=
(
1
<<
n
);
//清除掉因为模式配置可能产生的中断
EXTI_Close
(
GPIOx
,
n
);
//配置关键寄存器前先关闭
if
(
mode
&
0x10
)
{
GPIOx
->
INTLVLTRG
|=
(
0x01
<<
n
);
//电平触发
if
(
mode
&
0x01
)
GPIOx
->
INTRISEEN
|=
(
0x01
<<
n
);
//高电平触发
else
GPIOx
->
INTRISEEN
&=
~
(
0x01
<<
n
);
//低电平触发
}
else
{
GPIOx
->
INTLVLTRG
&=
~
(
0x01
<<
n
);
//边沿触发
if
(
mode
&
0x02
)
{
GPIOx
->
INTBE
|=
(
0x01
<<
n
);
//双边沿触发
}
else
{
GPIOx
->
INTBE
&=
~
(
0x01
<<
n
);
//单边沿触发
if
(
mode
&
0x01
)
GPIOx
->
INTRISEEN
|=
(
0x01
<<
n
);
//上升沿触发
else
GPIOx
->
INTRISEEN
&=
~
(
0x01
<<
n
);
//下降沿触发
}
}
GPIOx
->
INTCLR
=
(
1
<<
n
);
//清除掉因为模式配置可能产生的中断
}
/******************************************************************************************************************************************
*
函数名称
: EXTI_Open()
*
功能说明: 指定引脚外部中断打开(即使能)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
*
输 出: 无
*
注意事项: 无
*
函数名称:
EXTI_Open()
*
功能说明: 指定引脚外部中断打开(即使能)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
EXTI_Open
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
void
EXTI_Open
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
{
GPIOx
->
INTEN
|=
(
0x01
<<
n
);
GPIOx
->
INTEN
|=
(
0x01
<<
n
);
}
/******************************************************************************************************************************************
*
函数名称
: EXTI_Close()
*
功能说明: 指定引脚外部中断关闭(即禁能)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
*
输 出: 无
*
注意事项: 无
*
函数名称:
EXTI_Close()
*
功能说明: 指定引脚外部中断关闭(即禁能)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
EXTI_Close
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
void
EXTI_Close
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
{
GPIOx
->
INTEN
&=
~
(
0x01
<<
n
);
GPIOx
->
INTEN
&=
~
(
0x01
<<
n
);
}
/******************************************************************************************************************************************
*
函数名称
: EXTI_State()
*
功能说明: 指定引脚是否触发了中断
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
*
输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
*
注意事项: 无
*
函数名称:
EXTI_State()
*
功能说明: 指定引脚是否触发了中断
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
*
输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
*
注意事项: 无
******************************************************************************************************************************************/
uint32_t
EXTI_State
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
uint32_t
EXTI_State
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
{
return
(
GPIOx
->
INTSTAT
>>
n
)
&
0x01
;
return
(
GPIOx
->
INTSTAT
>>
n
)
&
0x01
;
}
/******************************************************************************************************************************************
*
函数名称
: EXTI_RawState()
*
功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
*
输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
*
注意事项: 无
*
函数名称:
EXTI_RawState()
*
功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
*
输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
*
注意事项: 无
******************************************************************************************************************************************/
uint32_t
EXTI_RawState
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
uint32_t
EXTI_RawState
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
{
return
(
GPIOx
->
INTRAWSTAT
>>
n
)
&
0x01
;
return
(
GPIOx
->
INTRAWSTAT
>>
n
)
&
0x01
;
}
/******************************************************************************************************************************************
*
函数名称
: EXTI_Clear()
*
功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、G
PIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、P
IN23
*
输 出: 无
*
注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
*
函数名称:
EXTI_Clear()
*
功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
*
输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
* uint32_t n
指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
*
输 出: 无
*
注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
******************************************************************************************************************************************/
void
EXTI_Clear
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
void
EXTI_Clear
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
)
{
GPIOx
->
INTCLR
=
(
0x01
<<
n
);
GPIOx
->
INTCLR
=
(
0x01
<<
n
);
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
浏览文件 @
2c052969
#ifndef __SWM320_EXTI_H__
#define
__SWM320_EXTI_H__
#define
__SWM320_EXTI_H__
void
EXTI_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
mode
);
//指定引脚外部中断初始化
void
EXTI_Open
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断打开(即使能)
void
EXTI_Close
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断关闭(即禁能)
void
EXTI_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
mode
);
//指定引脚外部中断初始化
void
EXTI_Open
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断打开(即使能)
void
EXTI_Close
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断关闭(即禁能)
uint32_t
EXTI_State
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚是否触发了中断
uint32_t
EXTI_RawState
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void
EXTI_Clear
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
uint32_t
EXTI_State
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚是否触发了中断
uint32_t
EXTI_RawState
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
void
EXTI_Clear
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#endif //__SWM320_EXTI_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
浏览文件 @
2c052969
...
...
@@ -19,13 +19,11 @@
#include "SWM320.h"
#include "SWM320_flash.h"
IAP_Cache_Reset_t
IAP_Cache_Reset
=
(
IAP_Cache_Reset_t
)
0x11000601
;
IAP_Flash_Param_t
IAP_Flash_Param
=
(
IAP_Flash_Param_t
)
0x11000681
;
IAP_Flash_Erase_t
IAP_Flash_Erase
=
(
IAP_Flash_Erase_t
)
0x11000781
;
IAP_Flash_Write_t
IAP_Flash_Write
=
(
IAP_Flash_Write_t
)
0x11000801
;
/******************************************************************************************************************************************
* 函数名称: FLASH_Erase()
* 功能说明: 片内Flash擦除
...
...
@@ -34,14 +32,14 @@ IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
* 注意事项: 无
******************************************************************************************************************************************/
void
FLASH_Erase
(
uint32_t
addr
)
{
__disable_irq
();
IAP_Flash_Erase
(
addr
/
0x1000
);
IAP_Cache_Reset
();
__enable_irq
();
{
__disable_irq
();
IAP_Flash_Erase
(
addr
/
0x1000
);
IAP_Cache_Reset
();
__enable_irq
();
}
/******************************************************************************************************************************************
...
...
@@ -55,13 +53,13 @@ void FLASH_Erase(uint32_t addr)
******************************************************************************************************************************************/
void
FLASH_Write
(
uint32_t
addr
,
uint32_t
buff
[],
uint32_t
count
)
{
__disable_irq
();
IAP_Flash_Write
(
addr
,
(
uint32_t
)
buff
,
count
/
4
);
IAP_Cache_Reset
();
__enable_irq
();
__disable_irq
();
IAP_Flash_Write
(
addr
,
(
uint32_t
)
buff
,
count
/
4
);
IAP_Cache_Reset
();
__enable_irq
();
}
/******************************************************************************************************************************************
...
...
@@ -73,25 +71,25 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
******************************************************************************************************************************************/
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
();
__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
();
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
浏览文件 @
2c052969
#ifndef __SWM320_FLASH_H__
#define __SWM320_FLASH_H__
void
FLASH_Erase
(
uint32_t
addr
);
void
FLASH_Write
(
uint32_t
addr
,
uint32_t
buff
[],
uint32_t
count
);
void
Flash_Param_at_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
);
...
...
@@ -19,5 +16,4 @@ extern IAP_Flash_Param_t IAP_Flash_Param;
extern
IAP_Flash_Erase_t
IAP_Flash_Erase
;
extern
IAP_Flash_Write_t
IAP_Flash_Write
;
#endif //__SWM320_FLASH_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
浏览文件 @
2c052969
#ifndef __SWM320_GPIO_H__
#define
__SWM320_GPIO_H__
#define
__SWM320_GPIO_H__
void
GPIO_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
dir
,
uint32_t
pull_up
,
uint32_t
pull_down
);
//引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void
GPIO_Init
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
dir
,
uint32_t
pull_up
,
uint32_t
pull_down
);
//引脚初始化,包含引脚方向、上拉电阻、下拉电阻
void
GPIO_SetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平置高
void
GPIO_ClrBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平置低
void
GPIO_InvBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平反转
uint32_t
GPIO_GetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//读取参数指定的引脚的电平状态
void
GPIO_SetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平置高
void
GPIO_ClrBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平置低
void
GPIO_InvBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平反转
uint32_t
GPIO_GetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//读取参数指定的从n开始的w位连续引脚的电平状态
void
GPIO_AtomicSetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicClrBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicInvBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicSetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
void
GPIO_AtomicClrBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
void
GPIO_AtomicInvBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
void
GPIO_SetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平置高
void
GPIO_ClrBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平置低
void
GPIO_InvBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//将参数指定的引脚电平反转
uint32_t
GPIO_GetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
//读取参数指定的引脚的电平状态
void
GPIO_SetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平置高
void
GPIO_ClrBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平置低
void
GPIO_InvBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//将参数指定的从n开始的w位连续引脚的电平反转
uint32_t
GPIO_GetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
//读取参数指定的从n开始的w位连续引脚的电平状态
void
GPIO_AtomicSetBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicClrBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicInvBit
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
);
void
GPIO_AtomicSetBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
void
GPIO_AtomicClrBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
void
GPIO_AtomicInvBits
(
GPIO_TypeDef
*
GPIOx
,
uint32_t
n
,
uint32_t
w
);
#endif //__SWM320_GPIO_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
浏览文件 @
2c052969
/******************************************************************************************************************************************
*
文
件名称: SWM320_i2c.c
*
功能说明: SWM320单片机的
I2C串行接口功能驱动库
*
技
术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注
意事项:
*
版本日期: V1.1.0 2017年
10月25日
*
升
级记录:
*
文件名称
: SWM320_i2c.c
*
功能说明: SWM320单片机的I2C串行接口功能驱动库
*
技术支持
: http://www.synwit.com.cn/e/tool/gbook/?bid=1
*
注意事项
:
*
版本日期: V1.1.0 2017年10月25日
*
升级记录
:
*
*
*******************************************************************************************************************************************
...
...
@@ -22,194 +22,198 @@
#include "SWM320_i2c.h"
/******************************************************************************************************************************************
* 函数名称: I2C_Init()
*
功能说明: I
2C初始化
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
* I2C_InitStructure * initStruct
包含I2C相关
设定值的结构体
*
输 出
: 无
*
注意事项: 模块
只能工作于主机模式
*
函数名称
: I2C_Init()
*
功能说明: I2C初始化
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
* I2C_InitStructure * initStruct
包含I2C相关设定值的结构体
*
输 出: 无
*
注意事项: 模块只能工作于主机模式
******************************************************************************************************************************************/
void
I2C_Init
(
I2C_TypeDef
*
I2Cx
,
I2C_InitStructure
*
initStruct
)
void
I2C_Init
(
I2C_TypeDef
*
I2Cx
,
I2C_InitStructure
*
initStruct
)
{
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_I2C0_Pos
);
break
;
case
((
uint32_t
)
I2C1
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_I2C1_Pos
);
break
;
}
I2C_Close
(
I2Cx
);
//一些关键寄存器只能在
I2C关闭时设置
if
(
initStruct
->
Master
==
1
)
{
I2Cx
->
CLKDIV
=
SystemCoreClock
/
5
/
initStruct
->
MstClk
;
I2Cx
->
MSTCMD
=
(
I2Cx
->
MSTCMD
&
(
~
I2C_MSTCMD_IF_Msk
))
|
(
1
<<
I2C_MSTCMD_IF_Pos
);
//使能中断之前先
清除中断标志
I2Cx
->
CTRL
&=
~
I2C_CTRL_MSTIE_Msk
;
I2Cx
->
CTRL
|=
(
initStruct
->
MstIEn
<<
I2C_CTRL_MSTIE_Pos
);
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
if
(
initStruct
->
MstIEn
)
{
NVIC_EnableIRQ
(
I2C0_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C0_IRQn
);
}
break
;
case
((
uint32_t
)
I2C1
):
if
(
initStruct
->
MstIEn
)
{
NVIC_EnableIRQ
(
I2C1_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C1_IRQn
);
}
break
;
}
}
else
{
I2Cx
->
SLVCR
|=
(
1
<<
I2C_SLVCR_SLAVE_Pos
);
I2Cx
->
SLVCR
&=
~
(
I2C_SLVCR_ADDR7b_Msk
|
I2C_SLVCR_ADDR_Msk
);
I2Cx
->
SLVCR
|=
(
1
<<
I2C_SLVCR_ACK_Pos
)
|
(
initStruct
->
Addr7b
<<
I2C_SLVCR_ADDR7b_Pos
)
|
(
initStruct
->
SlvAddr
<<
I2C_SLVCR_ADDR_Pos
);
I2Cx
->
SLVIF
=
I2C_SLVIF_RXEND_Msk
|
I2C_SLVIF_TXEND_Msk
|
I2C_SLVIF_STADET_Msk
|
I2C_SLVIF_STODET_Msk
;
//清中断
标志
I2Cx
->
SLVCR
&=
~
(
I2C_SLVCR_IM_RXEND_Msk
|
I2C_SLVCR_IM_TXEND_Msk
|
I2C_SLVCR_IM_STADET_Msk
|
I2C_SLVCR_IM_STODET_Msk
|
I2C_SLVCR_IM_RDREQ_Msk
|
I2C_SLVCR_IM_WRREQ_Msk
);
I2Cx
->
SLVCR
|=
((
initStruct
->
SlvRxEndIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_RXEND_Pos
)
|
((
initStruct
->
SlvTxEndIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_TXEND_Pos
)
|
((
initStruct
->
SlvSTADetIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_STADET_Pos
)
|
((
initStruct
->
SlvSTODetIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_STODET_Pos
)
|
((
initStruct
->
SlvRdReqIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_RDREQ_Pos
)
|
((
initStruct
->
SlvWrReqIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_WRREQ_Pos
);
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
if
(
initStruct
->
SlvRxEndIEn
|
initStruct
->
SlvTxEndIEn
|
initStruct
->
SlvSTADetIEn
|
initStruct
->
SlvSTODetIEn
|
initStruct
->
SlvRdReqIEn
|
initStruct
->
SlvWrReqIEn
)
{
NVIC_EnableIRQ
(
I2C0_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C0_IRQn
);
}
break
;
case
((
uint32_t
)
I2C1
):
if
(
initStruct
->
SlvRxEndIEn
|
initStruct
->
SlvTxEndIEn
|
initStruct
->
SlvSTADetIEn
|
initStruct
->
SlvSTODetIEn
|
initStruct
->
SlvRdReqIEn
|
initStruct
->
SlvWrReqIEn
)
{
NVIC_EnableIRQ
(
I2C1_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C1_IRQn
);
}
break
;
}
}
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_I2C0_Pos
);
break
;
case
((
uint32_t
)
I2C1
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_I2C1_Pos
);
break
;
}
I2C_Close
(
I2Cx
);
//一些关键寄存器只能在I2C关闭时设置
if
(
initStruct
->
Master
==
1
)
{
I2Cx
->
CLKDIV
=
SystemCoreClock
/
5
/
initStruct
->
MstClk
;
I2Cx
->
MSTCMD
=
(
I2Cx
->
MSTCMD
&
(
~
I2C_MSTCMD_IF_Msk
))
|
(
1
<<
I2C_MSTCMD_IF_Pos
);
//使能中断之前先清除中断标志
I2Cx
->
CTRL
&=
~
I2C_CTRL_MSTIE_Msk
;
I2Cx
->
CTRL
|=
(
initStruct
->
MstIEn
<<
I2C_CTRL_MSTIE_Pos
);
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
if
(
initStruct
->
MstIEn
)
{
NVIC_EnableIRQ
(
I2C0_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C0_IRQn
);
}
break
;
case
((
uint32_t
)
I2C1
):
if
(
initStruct
->
MstIEn
)
{
NVIC_EnableIRQ
(
I2C1_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C1_IRQn
);
}
break
;
}
}
else
{
I2Cx
->
SLVCR
|=
(
1
<<
I2C_SLVCR_SLAVE_Pos
);
I2Cx
->
SLVCR
&=
~
(
I2C_SLVCR_ADDR7b_Msk
|
I2C_SLVCR_ADDR_Msk
);
I2Cx
->
SLVCR
|=
(
1
<<
I2C_SLVCR_ACK_Pos
)
|
(
initStruct
->
Addr7b
<<
I2C_SLVCR_ADDR7b_Pos
)
|
(
initStruct
->
SlvAddr
<<
I2C_SLVCR_ADDR_Pos
);
I2Cx
->
SLVIF
=
I2C_SLVIF_RXEND_Msk
|
I2C_SLVIF_TXEND_Msk
|
I2C_SLVIF_STADET_Msk
|
I2C_SLVIF_STODET_Msk
;
//清中断标志
I2Cx
->
SLVCR
&=
~
(
I2C_SLVCR_IM_RXEND_Msk
|
I2C_SLVCR_IM_TXEND_Msk
|
I2C_SLVCR_IM_STADET_Msk
|
I2C_SLVCR_IM_STODET_Msk
|
I2C_SLVCR_IM_RDREQ_Msk
|
I2C_SLVCR_IM_WRREQ_Msk
);
I2Cx
->
SLVCR
|=
((
initStruct
->
SlvRxEndIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_RXEND_Pos
)
|
((
initStruct
->
SlvTxEndIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_TXEND_Pos
)
|
((
initStruct
->
SlvSTADetIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_STADET_Pos
)
|
((
initStruct
->
SlvSTODetIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_STODET_Pos
)
|
((
initStruct
->
SlvRdReqIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_RDREQ_Pos
)
|
((
initStruct
->
SlvWrReqIEn
?
0
:
1
)
<<
I2C_SLVCR_IM_WRREQ_Pos
);
switch
((
uint32_t
)
I2Cx
)
{
case
((
uint32_t
)
I2C0
):
if
(
initStruct
->
SlvRxEndIEn
|
initStruct
->
SlvTxEndIEn
|
initStruct
->
SlvSTADetIEn
|
initStruct
->
SlvSTODetIEn
|
initStruct
->
SlvRdReqIEn
|
initStruct
->
SlvWrReqIEn
)
{
NVIC_EnableIRQ
(
I2C0_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C0_IRQn
);
}
break
;
case
((
uint32_t
)
I2C1
):
if
(
initStruct
->
SlvRxEndIEn
|
initStruct
->
SlvTxEndIEn
|
initStruct
->
SlvSTADetIEn
|
initStruct
->
SlvSTODetIEn
|
initStruct
->
SlvRdReqIEn
|
initStruct
->
SlvWrReqIEn
)
{
NVIC_EnableIRQ
(
I2C1_IRQn
);
}
else
{
NVIC_DisableIRQ
(
I2C1_IRQn
);
}
break
;
}
}
}
/******************************************************************************************************************************************
* 函数名称: I2C_Open()
*
功能说明: I2
C打开,允许收发
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
*
输 出
: 无
*
注意事
项: 无
*
函数名称
: I2C_Open()
*
功能说明: I2C打开,允许收发
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
I2C_Open
(
I2C_TypeDef
*
I2Cx
)
void
I2C_Open
(
I2C_TypeDef
*
I2Cx
)
{
I2Cx
->
CTRL
|=
(
0x01
<<
I2C_CTRL_EN_Pos
);
I2Cx
->
CTRL
|=
(
0x01
<<
I2C_CTRL_EN_Pos
);
}
/******************************************************************************************************************************************
* 函数名称: I2C_Close()
*
功能说明: I2C关
闭,禁止收发
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
*
输 出
: 无
*
注意事
项: 无
*
函数名称
: I2C_Close()
*
功能说明: I2C关闭,禁止收发
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
I2C_Close
(
I2C_TypeDef
*
I2Cx
)
void
I2C_Close
(
I2C_TypeDef
*
I2Cx
)
{
I2Cx
->
CTRL
&=
~
I2C_CTRL_EN_Msk
;
I2Cx
->
CTRL
&=
~
I2C_CTRL_EN_Msk
;
}
/******************************************************************************************************************************************
* 函数名称: I2C_Start()
*
功能说明: 产生
起始信号并发送设备地址
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
* uint8_t addr
设备
地址
*
输 出: uint8_t 1 接收到ACK
0 接收到NACK
*
注意事
项: 无
*
函数名称
: I2C_Start()
*
功能说明: 产生起始信号并发送设备地址
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
* uint8_t addr
设备地址
*
输 出: uint8_t 1 接收到ACK 0 接收到
NACK
*
注意事项: 无
******************************************************************************************************************************************/
uint8_t
I2C_Start
(
I2C_TypeDef
*
I2Cx
,
uint8_t
addr
)
uint8_t
I2C_Start
(
I2C_TypeDef
*
I2Cx
,
uint8_t
addr
)
{
I2Cx
->
MSTDAT
=
addr
;
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_STA_Pos
)
|
(
1
<<
I2C_MSTCMD_WR_Pos
);
//发送起始位和从机地址
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
return
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_RXACK_Msk
)
?
0
:
1
;
I2Cx
->
MSTDAT
=
addr
;
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_STA_Pos
)
|
(
1
<<
I2C_MSTCMD_WR_Pos
);
//发送起始位和从机地址
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
return
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_RXACK_Msk
)
?
0
:
1
;
}
/******************************************************************************************************************************************
* 函数名称: I2C_Stop()
*
功能说明:
产生停止信号
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
*
输 出
: 无
*
注意事
项: 无
*
函数名称
: I2C_Stop()
*
功能说明: 产生停止信号
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
*
输 出: 无
*
注意事项: 无
******************************************************************************************************************************************/
void
I2C_Stop
(
I2C_TypeDef
*
I2Cx
)
void
I2C_Stop
(
I2C_TypeDef
*
I2Cx
)
{
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_STO_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_STO_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
}
/******************************************************************************************************************************************
* 函数名称: I2C_Write()
*
功能说明:
写入一个数据
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
* uint8_t data
要写
的数据
*
输 出: uint8_t 1 接收到ACK
0 接收到NACK
*
注意事
项: 无
*
函数名称
: I2C_Write()
*
功能说明: 写入一个数据
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
* uint8_t data
要写的数据
*
输 出: uint8_t 1 接收到ACK 0 接收到
NACK
*
注意事项: 无
******************************************************************************************************************************************/
uint8_t
I2C_Write
(
I2C_TypeDef
*
I2Cx
,
uint8_t
data
)
{
I2Cx
->
MSTDAT
=
data
;
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_WR_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
return
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_RXACK_Msk
)
?
0
:
1
;
uint8_t
I2C_Write
(
I2C_TypeDef
*
I2Cx
,
uint8_t
data
)
{
I2Cx
->
MSTDAT
=
data
;
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_WR_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待发送完成
return
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_RXACK_Msk
)
?
0
:
1
;
}
/******************************************************************************************************************************************
* 函数名称: I2C_Read()
*
功能说明:
读取一个数据
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C
,有效值包括I2C0、I2C1
* uint8_t ack 1
发送ACK
0 发送NACK
*
输 出: uint8_t
读取到的数据
*
注意事
项: 无
*
函数名称
: I2C_Read()
*
功能说明: 读取一个数据
*
输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、
I2C1
* uint8_t ack 1
发送ACK 0 发送
NACK
*
输 出: uint8_t 读取到的数据
*
注意事项: 无
******************************************************************************************************************************************/
uint8_t
I2C_Read
(
I2C_TypeDef
*
I2Cx
,
uint8_t
ack
)
uint8_t
I2C_Read
(
I2C_TypeDef
*
I2Cx
,
uint8_t
ack
)
{
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_RD_Pos
)
|
((
ack
?
0
:
1
)
<<
I2C_MSTCMD_ACK_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待接收完成
I2Cx
->
MSTCMD
=
(
1
<<
I2C_MSTCMD_RD_Pos
)
|
((
ack
?
0
:
1
)
<<
I2C_MSTCMD_ACK_Pos
);
while
(
I2Cx
->
MSTCMD
&
I2C_MSTCMD_TIP_Msk
)
__NOP
();
//等待接收完成
return
I2Cx
->
MSTDAT
;
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
浏览文件 @
2c052969
#ifndef __SWM320_I2C_H__
#define __SWM320_I2C_H__
typedef
struct
{
uint8_t
Master
;
//1 主机模式
uint8_t
Addr7b
;
//1 7位地址 0 10位地址
uint32_t
MstClk
;
//主机传输时钟频率
uint8_t
MstIEn
;
//主机模式中断使能
uint16_t
SlvAddr
;
//从机地址
uint8_t
SlvRxEndIEn
;
//从机接收完成中断使能
uint8_t
SlvTxEndIEn
;
//从机发送完成中断使能
uint8_t
SlvSTADetIEn
;
//从机检测到起始中断使能
uint8_t
SlvSTODetIEn
;
//从机检测到终止中断使能
uint8_t
SlvRdReqIEn
;
//从机接收到读请求中断使能
uint8_t
SlvWrReqIEn
;
//从机接收到写请求中断使能
}
I2C_InitStructure
;
typedef
struct
{
uint8_t
Master
;
//1 主机模式
uint8_t
Addr7b
;
//1 7位地址 0 10位地址
uint32_t
MstClk
;
//主机传输时钟频率
uint8_t
MstIEn
;
//主机模式中断使能
uint16_t
SlvAddr
;
//从机地址
uint8_t
SlvRxEndIEn
;
//从机接收完成中断使能
uint8_t
SlvTxEndIEn
;
//从机发送完成中断使能
uint8_t
SlvSTADetIEn
;
//从机检测到起始中断使能
uint8_t
SlvSTODetIEn
;
//从机检测到终止中断使能
uint8_t
SlvRdReqIEn
;
//从机接收到读请求中断使能
uint8_t
SlvWrReqIEn
;
//从机接收到写请求中断使能
}
I2C_InitStructure
;
void
I2C_Init
(
I2C_TypeDef
*
I2Cx
,
I2C_InitStructure
*
initStruct
);
void
I2C_Init
(
I2C_TypeDef
*
I2Cx
,
I2C_InitStructure
*
initStruct
);
void
I2C_Open
(
I2C_TypeDef
*
I2Cx
);
void
I2C_Close
(
I2C_TypeDef
*
I2Cx
);
void
I2C_Open
(
I2C_TypeDef
*
I2Cx
);
void
I2C_Close
(
I2C_TypeDef
*
I2Cx
);
uint8_t
I2C_Start
(
I2C_TypeDef
*
I2Cx
,
uint8_t
addr
);
void
I2C_Stop
(
I2C_TypeDef
*
I2Cx
);
uint8_t
I2C_Write
(
I2C_TypeDef
*
I2Cx
,
uint8_t
data
);
uint8_t
I2C_Read
(
I2C_TypeDef
*
I2Cx
,
uint8_t
ack
);
uint8_t
I2C_Start
(
I2C_TypeDef
*
I2Cx
,
uint8_t
addr
);
void
I2C_Stop
(
I2C_TypeDef
*
I2Cx
);
uint8_t
I2C_Write
(
I2C_TypeDef
*
I2Cx
,
uint8_t
data
);
uint8_t
I2C_Read
(
I2C_TypeDef
*
I2Cx
,
uint8_t
ack
);
#endif //__SWM320_I2C_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
浏览文件 @
2c052969
...
...
@@ -31,45 +31,47 @@
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
LCD_Init
(
LCD_TypeDef
*
LCDx
,
LCD_InitStructure
*
initStruct
)
{
switch
((
uint32_t
)
LCDx
)
{
case
((
uint32_t
)
LCD
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_LCD_Pos
);
break
;
}
LCDx
->
CR0
=
((
initStruct
->
HnPixel
-
1
)
<<
LCD_CR0_HPIX_Pos
)
|
((
initStruct
->
VnPixel
-
1
)
<<
LCD_CR0_VPIX_Pos
)
|
(
initStruct
->
ClkAlways
<<
LCD_CR0_DCLK_Pos
)
|
(
initStruct
->
HsyncWidth
<<
LCD_CR0_HLOW_Pos
);
LCDx
->
CR1
=
((
initStruct
->
Hfp
-
1
)
<<
LCD_CR1_HFP_Pos
)
|
((
initStruct
->
Hbp
-
1
)
<<
LCD_CR1_HBP_Pos
)
|
((
initStruct
->
Vfp
-
1
)
<<
LCD_CR1_VFP_Pos
)
|
((
initStruct
->
Vbp
-
1
)
<<
LCD_CR1_VBP_Pos
)
|
(
initStruct
->
ClkDiv
<<
LCD_CR1_DCLKDIV_Pos
)
|
(
initStruct
->
SamplEdge
<<
LCD_CR1_DCLKINV_Pos
);
LCDx
->
IE
=
1
;
LCDx
->
IF
=
1
;
//清除标志
if
(
initStruct
->
IntEOTEn
)
LCD_INTEn
(
LCDx
);
else
LCD_INTDis
(
LCDx
);
switch
((
uint32_t
)
LCDx
)
{
case
((
uint32_t
)
LCD
):
if
(
initStruct
->
IntEOTEn
)
{
NVIC_EnableIRQ
(
LCD_IRQn
);
}
else
{
NVIC_DisableIRQ
(
LCD_IRQn
);
}
break
;
}
void
LCD_Init
(
LCD_TypeDef
*
LCDx
,
LCD_InitStructure
*
initStruct
)
{
switch
((
uint32_t
)
LCDx
)
{
case
((
uint32_t
)
LCD
):
SYS
->
CLKEN
|=
(
0x01
<<
SYS_CLKEN_LCD_Pos
);
break
;
}
LCDx
->
CR0
=
((
initStruct
->
HnPixel
-
1
)
<<
LCD_CR0_HPIX_Pos
)
|
((
initStruct
->
VnPixel
-
1
)
<<
LCD_CR0_VPIX_Pos
)
|
(
initStruct
->
ClkAlways
<<
LCD_CR0_DCLK_Pos
)
|
(
initStruct
->
HsyncWidth
<<
LCD_CR0_HLOW_Pos
);
LCDx
->
CR1
=
((
initStruct
->
Hfp
-
1
)
<<
LCD_CR1_HFP_Pos
)
|
((
initStruct
->
Hbp
-
1
)
<<
LCD_CR1_HBP_Pos
)
|
((
initStruct
->
Vfp
-
1
)
<<
LCD_CR1_VFP_Pos
)
|
((
initStruct
->
Vbp
-
1
)
<<
LCD_CR1_VBP_Pos
)
|
(
initStruct
->
ClkDiv
<<
LCD_CR1_DCLKDIV_Pos
)
|
(
initStruct
->
SamplEdge
<<
LCD_CR1_DCLKINV_Pos
);
LCDx
->
IE
=
1
;
LCDx
->
IF
=
1
;
//清除标志
if
(
initStruct
->
IntEOTEn
)
LCD_INTEn
(
LCDx
);
else
LCD_INTDis
(
LCDx
);
switch
((
uint32_t
)
LCDx
)
{
case
((
uint32_t
)
LCD
):
if
(
initStruct
->
IntEOTEn
)
{
NVIC_EnableIRQ
(
LCD_IRQn
);
}
else
{
NVIC_DisableIRQ
(
LCD_IRQn
);
}
break
;
}
}
/******************************************************************************************************************************************
...
...
@@ -79,9 +81,9 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
LCD_Start
(
LCD_TypeDef
*
LCDx
)
void
LCD_Start
(
LCD_TypeDef
*
LCDx
)
{
LCDx
->
START
|=
(
1
<<
LCD_START_GO_Pos
)
|
(
1
<<
LCD_START_BURST_Pos
);
LCDx
->
START
|=
(
1
<<
LCD_START_GO_Pos
)
|
(
1
<<
LCD_START_BURST_Pos
);
}
/******************************************************************************************************************************************
...
...
@@ -91,9 +93,9 @@ void LCD_Start(LCD_TypeDef * LCDx)
* 输 出: uint32_t 1 正在传输数据 0 数据传输已完成
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t
LCD_IsBusy
(
LCD_TypeDef
*
LCDx
)
uint32_t
LCD_IsBusy
(
LCD_TypeDef
*
LCDx
)
{
return
(
LCDx
->
START
&
LCD_START_GO_Msk
)
?
1
:
0
;
return
(
LCDx
->
START
&
LCD_START_GO_Msk
)
?
1
:
0
;
}
/******************************************************************************************************************************************
...
...
@@ -103,9 +105,9 @@ uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
LCD_INTEn
(
LCD_TypeDef
*
LCDx
)
void
LCD_INTEn
(
LCD_TypeDef
*
LCDx
)
{
LCDx
->
IM
=
0
;
LCDx
->
IM
=
0
;
}
/******************************************************************************************************************************************
...
...
@@ -115,9 +117,9 @@ void LCD_INTEn(LCD_TypeDef * LCDx)
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
LCD_INTDis
(
LCD_TypeDef
*
LCDx
)
void
LCD_INTDis
(
LCD_TypeDef
*
LCDx
)
{
LCDx
->
IM
=
1
;
LCDx
->
IM
=
1
;
}
/******************************************************************************************************************************************
...
...
@@ -127,9 +129,9 @@ void LCD_INTDis(LCD_TypeDef * LCDx)
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
LCD_INTClr
(
LCD_TypeDef
*
LCDx
)
void
LCD_INTClr
(
LCD_TypeDef
*
LCDx
)
{
LCDx
->
IF
=
1
;
LCDx
->
IF
=
1
;
}
/******************************************************************************************************************************************
...
...
@@ -139,7 +141,7 @@ void LCD_INTClr(LCD_TypeDef * LCDx)
* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t
LCD_INTStat
(
LCD_TypeDef
*
LCDx
)
uint32_t
LCD_INTStat
(
LCD_TypeDef
*
LCDx
)
{
return
(
LCDx
->
IF
&
0x01
)
?
1
:
0
;
return
(
LCDx
->
IF
&
0x01
)
?
1
:
0
;
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
浏览文件 @
2c052969
#ifndef __SWM320_LCD_H__
#define __SWM320_LCD_H__
typedef
struct
{
uint16_t
HnPixel
;
//水平方向像素个数,最大取值1024
uint16_t
VnPixel
;
//垂直方向像素个数,最大取值 768
uint8_t
Hfp
;
//horizonal front porch,最大取值32
uint8_t
Hbp
;
//horizonal back porch, 最大取值128
uint8_t
Vfp
;
//vertical front porch, 最大取值8
uint8_t
Vbp
;
//vertical back porch, 最大取值32
uint8_t
ClkDiv
;
//系统时钟经ClkDiv分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t
SamplEdge
;
//屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t
ClkAlways
;
//1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t
HsyncWidth
;
//HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
typedef
struct
{
uint16_t
HnPixel
;
//水平方向像素个数,最大取值1024
uint16_t
VnPixel
;
//垂直方向像素个数,最大取值 768
uint8_t
Hfp
;
//horizonal front porch,最大取值32
uint8_t
Hbp
;
//horizonal back porch, 最大取值128
uint8_t
Vfp
;
//vertical front porch, 最大取值8
uint8_t
Vbp
;
//vertical back porch, 最大取值32
uint8_t
ClkDiv
;
//系统时钟经ClkDiv分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
uint8_t
SamplEdge
;
//屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
uint8_t
ClkAlways
;
//1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
uint8_t
HsyncWidth
;
//HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
uint8_t
IntEOTEn
;
//End of Transter(传输完成)中断使能
uint8_t
IntEOTEn
;
//End of Transter(传输完成)中断使能
}
LCD_InitStructure
;
#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
#define LCD_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_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_CLKDIV_2 0
#define LCD_CLKDIV_4 1
#define LCD_CLKDIV_6 2
#define LCD_CLKDIV_8 3
#define LCD_CLKDIV_10 4
#define LCD_CLKDIV_12 5
#define LCD_CLKDIV_14 6
#define LCD_CLKDIV_16 7
#define LCD_CLKDIV_18 8
#define LCD_CLKDIV_20 9
#define LCD_CLKDIV_22 10
#define LCD_CLKDIV_24 11
#define LCD_CLKDIV_26 12
#define LCD_CLKDIV_28 13
#define LCD_CLKDIV_30 14
#define LCD_CLKDIV_32 15
#define LCD_CLKDIV_34 16
#define LCD_CLKDIV_36 17
#define LCD_CLKDIV_38 18
#define LCD_CLKDIV_40 19
#define LCD_CLKDIV_42 20
#define LCD_CLKDIV_44 21
#define LCD_CLKDIV_46 22
#define LCD_CLKDIV_48 23
#define LCD_CLKDIV_50 24
#define LCD_CLKDIV_52 25
#define LCD_CLKDIV_54 26
#define LCD_CLKDIV_56 27
#define LCD_CLKDIV_58 28
#define LCD_CLKDIV_60 29
#define LCD_CLKDIV_62 30
#define LCD_CLKDIV_64 31
void
LCD_Init
(
LCD_TypeDef
*
LCDx
,
LCD_InitStructure
*
initStruct
);
void
LCD_Start
(
LCD_TypeDef
*
LCDx
);
uint32_t
LCD_IsBusy
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTEn
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTDis
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTClr
(
LCD_TypeDef
*
LCDx
);
uint32_t
LCD_INTStat
(
LCD_TypeDef
*
LCDx
);
void
LCD_Init
(
LCD_TypeDef
*
LCDx
,
LCD_InitStructure
*
initStruct
);
void
LCD_Start
(
LCD_TypeDef
*
LCDx
);
uint32_t
LCD_IsBusy
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTEn
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTDis
(
LCD_TypeDef
*
LCDx
);
void
LCD_INTClr
(
LCD_TypeDef
*
LCDx
);
uint32_t
LCD_INTStat
(
LCD_TypeDef
*
LCDx
);
#endif //__SWM320_LCD_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
浏览文件 @
2c052969
#ifndef __SWM320_NORFLASH_H__
#define __SWM320_NORFLASH_H__
typedef
struct
{
uint8_t
DataWidth
;
// 8、16
uint8_t
WELowPulseTime
;
// WE# pulse width,单位为系统时钟周期,最大值为7
uint8_t
OEPreValidTime
;
// Valid data output after OE# low,单位为系统时钟周期,最大值为15
uint8_t
OperFinishIEn
;
// 操作(写入、擦除)完成中断使能
uint8_t
OperTimeoutIEn
;
}
NORFL_InitStructure
;
typedef
struct
{
uint8_t
DataWidth
;
// 8、16
uint8_t
WELowPulseTime
;
// WE# pulse width,单位为系统时钟周期,最大值为7
uint8_t
OEPreValidTime
;
// Valid data output after OE# low,单位为系统时钟周期,最大值为15
uint8_t
OperFinishIEn
;
// 操作(写入、擦除)完成中断使能
uint8_t
OperTimeoutIEn
;
}
NORFL_InitStructure
;
void
NORFL_Init
(
NORFL_InitStructure
*
initStruct
);
void
NORFL_Init
(
NORFL_InitStructure
*
initStruct
);
uint32_t
NORFL_ChipErase
(
void
);
uint32_t
NORFL_SectorErase
(
uint32_t
addr
);
uint32_t
NORFL_Write
(
uint32_t
addr
,
uint32_t
data
);
uint32_t
NORFL_Read
(
uint32_t
addr
);
uint16_t
NORFL_ReadID
(
uint32_t
id_addr
);
/* 当前版本总线读只支持字读
#define NORFL_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
#define NORFL_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_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
#endif // __SWM320_NORFLASH_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
浏览文件 @
2c052969
#ifndef __SWM320_PWM_H__
#define __SWM320_PWM_H__
typedef
struct
{
uint8_t
clk_div
;
//PWM_CLKDIV_1、PWM_CLKDIV_8
uint8_t
mode
;
//PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
uint16_t
cycleA
;
//A路周期
uint16_t
hdutyA
;
//A路占空比
uint16_t
deadzoneA
;
//A路死区时长,取值0--1023
uint8_t
initLevelA
;
//A路初始输出电平,0 低电平 1 高电平
uint16_t
cycleB
;
//B路周期
uint16_t
hdutyB
;
//B路占空比
uint16_t
deadzoneB
;
//B路死区时长,取值0--1023
uint8_t
initLevelB
;
//B路初始输出电平,0 低电平 1 高电平
uint8_t
HEndAIEn
;
//A路高电平结束中断使能
uint8_t
NCycleAIEn
;
//A路新周期开始中断使能
uint8_t
HEndBIEn
;
//B路高电平结束中断使能
uint8_t
NCycleBIEn
;
//B路新周期开始中断使能
}
PWM_InitStructure
;
#define PWM_CLKDIV_1 0
#define PWM_CLKDIV_8 1
#define __SWM320_PWM_H__
#define PWM_MODE_INDEP 0 //A路和B路为两路独立输出
#define PWM_MODE_COMPL 1 //A路和B路为一路互补输出
#define PWM_MODE_INDEP_CALIGN 3 //A路和B路为两路独立输出,中心对齐
#define PWM_MODE_COMPL_CALIGN 4 //A路和B路为一路互补输出,中心对齐
typedef
struct
{
uint8_t
clk_div
;
//PWM_CLKDIV_1、PWM_CLKDIV_8
#define PWM_CH_A 0
#define PWM_CH_B 1
uint8_t
mode
;
//PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
uint16_t
cycleA
;
//A路周期
uint16_t
hdutyA
;
//A路占空比
uint16_t
deadzoneA
;
//A路死区时长,取值0--1023
uint8_t
initLevelA
;
//A路初始输出电平,0 低电平 1 高电平
void
PWM_Init
(
PWM_TypeDef
*
PWMx
,
PWM_InitStructure
*
initStruct
);
//PWM初始化
void
PWM_Start
(
PWM_TypeDef
*
PWMx
,
uint32_t
chA
,
uint32_t
chB
);
//启动PWM,开始PWM输出
void
PWM_Stop
(
PWM_TypeDef
*
PWMx
,
uint32_t
chA
,
uint32_t
chB
);
//关闭PWM,停止PWM输出
uint16_t
cycleB
;
//B路周期
uint16_t
hdutyB
;
//B路占空比
uint16_t
deadzoneB
;
//B路死区时长,取值0--1023
uint8_t
initLevelB
;
//B路初始输出电平,0 低电平 1 高电平
void
PWM_SetCycle
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint16_t
cycle
);
//设置周期
uint16_t
PWM_GetCycle
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取周期
void
PWM_SetHDuty
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint16_t
hduty
);
//设置高电平时长
uint16_t
PWM_GetHDuty
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取高电平时长
void
PWM_SetDeadzone
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint8_t
deadzone
);
//设置死区时长
uint8_t
PWM_GetDeadzone
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取死区时长
void
PWM_IntNCycleEn
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断使能
void
PWM_IntNCycleDis
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断禁能
void
PWM_IntNCycleClr
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断标志清除
uint32_t
PWM_IntNCycleStat
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断是否发生
void
PWM_IntHEndEn
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断使能
void
PWM_IntHEndDis
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断禁能
void
PWM_IntHEndClr
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断标志清除
uint32_t
PWM_IntHEndStat
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断是否发生
uint8_t
HEndAIEn
;
//A路高电平结束中断使能
uint8_t
NCycleAIEn
;
//A路新周期开始中断使能
uint8_t
HEndBIEn
;
//B路高电平结束中断使能
uint8_t
NCycleBIEn
;
//B路新周期开始中断使能
}
PWM_InitStructure
;
#define PWM_CLKDIV_1 0
#define PWM_CLKDIV_8 1
#define PWM_MODE_INDEP 0 //A路和B路为两路独立输出
#define PWM_MODE_COMPL 1 //A路和B路为一路互补输出
#define PWM_MODE_INDEP_CALIGN 3 //A路和B路为两路独立输出,中心对齐
#define PWM_MODE_COMPL_CALIGN 4 //A路和B路为一路互补输出,中心对齐
#define PWM_CH_A 0
#define PWM_CH_B 1
void
PWM_Init
(
PWM_TypeDef
*
PWMx
,
PWM_InitStructure
*
initStruct
);
//PWM初始化
void
PWM_Start
(
PWM_TypeDef
*
PWMx
,
uint32_t
chA
,
uint32_t
chB
);
//启动PWM,开始PWM输出
void
PWM_Stop
(
PWM_TypeDef
*
PWMx
,
uint32_t
chA
,
uint32_t
chB
);
//关闭PWM,停止PWM输出
void
PWM_SetCycle
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint16_t
cycle
);
//设置周期
uint16_t
PWM_GetCycle
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取周期
void
PWM_SetHDuty
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint16_t
hduty
);
//设置高电平时长
uint16_t
PWM_GetHDuty
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取高电平时长
void
PWM_SetDeadzone
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
,
uint8_t
deadzone
);
//设置死区时长
uint8_t
PWM_GetDeadzone
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//获取死区时长
void
PWM_IntNCycleEn
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断使能
void
PWM_IntNCycleDis
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断禁能
void
PWM_IntNCycleClr
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断标志清除
uint32_t
PWM_IntNCycleStat
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//新周期开始中断是否发生
void
PWM_IntHEndEn
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断使能
void
PWM_IntHEndDis
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断禁能
void
PWM_IntHEndClr
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断标志清除
uint32_t
PWM_IntHEndStat
(
PWM_TypeDef
*
PWMx
,
uint32_t
chn
);
//高电平结束中断是否发生
#endif //__SWM320_PWM_H__
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
浏览文件 @
2c052969
...
...
@@ -21,7 +21,6 @@
#include "SWM320.h"
#include "SWM320_sram.h"
/******************************************************************************************************************************************
* 函数名称: SRAM_Init()
* 功能说明: SRAM控制器初始化
...
...
@@ -29,25 +28,29 @@
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void
SRAM_Init
(
SRAM_InitStructure
*
initStruct
)
void
SRAM_Init
(
SRAM_InitStructure
*
initStruct
)
{
uint32_t
i
;
// 配置SRAM前需要刷新下SDRAM控制器
do
{
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_SDRAM_Pos
);
while
(
SDRAMC
->
REFDONE
==
0
);
SDRAMC
->
REFRESH
&=
~
(
1
<<
SDRAMC_REFRESH_EN_Pos
);
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKEN
&=
~
(
1
<<
SYS_CLKEN_SDRAM_Pos
);
}
while
(
0
);
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_RAMC_Pos
);
for
(
i
=
0
;
i
<
10
;
i
++
)
__NOP
();
SRAMC
->
CR
=
(
initStruct
->
ClkDiv
<<
SRAMC_CR_RWTIME_Pos
)
|
(
initStruct
->
DataWidth
<<
SRAMC_CR_BYTEIF_Pos
)
|
(
0
<<
SRAMC_CR_HBLBDIS_Pos
);
// 使能字节、半字访问
uint32_t
i
;
// 配置SRAM前需要刷新下SDRAM控制器
do
{
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_SDRAM_Pos
);
while
(
SDRAMC
->
REFDONE
==
0
)
;
SDRAMC
->
REFRESH
&=
~
(
1
<<
SDRAMC_REFRESH_EN_Pos
);
for
(
i
=
0
;
i
<
1000
;
i
++
)
__NOP
();
SYS
->
CLKEN
&=
~
(
1
<<
SYS_CLKEN_SDRAM_Pos
);
}
while
(
0
);
SYS
->
CLKEN
|=
(
1
<<
SYS_CLKEN_RAMC_Pos
);
for
(
i
=
0
;
i
<
10
;
i
++
)
__NOP
();
SRAMC
->
CR
=
(
initStruct
->
ClkDiv
<<
SRAMC_CR_RWTIME_Pos
)
|
(
initStruct
->
DataWidth
<<
SRAMC_CR_BYTEIF_Pos
)
|
(
0
<<
SRAMC_CR_HBLBDIS_Pos
);
// 使能字节、半字访问
}
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
浏览文件 @
2c052969
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录