mirror of https://github.com/RT-Thread/rt-thread
format utf-8
This commit is contained in:
parent
c00300d5f4
commit
2c05296948
|
@ -8,7 +8,7 @@
|
|||
*/
|
||||
typedef enum IRQn
|
||||
{
|
||||
/****** Cortex-M0 Processor Exceptions Numbers **********************************************/
|
||||
/****** Cortex-M0 Processor Exceptions Numbers **********************************************/
|
||||
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
|
||||
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
|
||||
BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */
|
||||
|
@ -18,7 +18,7 @@ typedef enum IRQn
|
|||
PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
|
||||
SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */
|
||||
|
||||
/****** Cortex-M4 specific Interrupt Numbers ************************************************/
|
||||
/****** Cortex-M4 specific Interrupt Numbers ************************************************/
|
||||
GPIOA0_IRQn = 0,
|
||||
GPIOA1_IRQn = 1,
|
||||
GPIOA2_IRQn = 2,
|
||||
|
@ -100,19 +100,19 @@ typedef enum IRQn
|
|||
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
|
||||
#define __FPU_PRESENT 0 /*!< FPU present */
|
||||
|
||||
#if defined ( __CC_ARM )
|
||||
#pragma anon_unions
|
||||
#if defined(__CC_ARM)
|
||||
#pragma anon_unions
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include "core_cm4.h" /* Cortex-M0 processor and core peripherals */
|
||||
#include "system_SWM320.h"
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* Device Specific Peripheral registers structures */
|
||||
/******************************************************************************/
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CLKSEL; //Clock Select
|
||||
|
||||
__IO uint32_t CLKDIV;
|
||||
|
@ -127,29 +127,29 @@ typedef struct {
|
|||
|
||||
__IO uint32_t RTCWKEN; //[0] 1 使能RTC唤醒功能
|
||||
|
||||
uint32_t RESERVED[52+64];
|
||||
uint32_t RESERVED[52 + 64];
|
||||
|
||||
__IO uint32_t PAWKEN; //Port A Wakeup Enable
|
||||
__IO uint32_t PBWKEN;
|
||||
__IO uint32_t PCWKEN;
|
||||
|
||||
uint32_t RESERVED2[1+4];
|
||||
uint32_t RESERVED2[1 + 4];
|
||||
|
||||
__IO uint32_t PAWKSR; //Port A Wakeup Status Register,写1清零
|
||||
__IO uint32_t PBWKSR;
|
||||
__IO uint32_t PCWKSR;
|
||||
|
||||
uint32_t RESERVED3[64-10];
|
||||
uint32_t RESERVED3[64 - 10];
|
||||
|
||||
__IO uint32_t RSTCR; //Reset Control Register
|
||||
__IO uint32_t RSTSR; //Reset Status Register
|
||||
|
||||
uint32_t RESERVED4[61+64];
|
||||
uint32_t RESERVED4[61 + 64];
|
||||
|
||||
__IO uint32_t BKP[3]; //数据备份寄存器
|
||||
|
||||
//RTC Power Domain: 0x4001E000
|
||||
uint32_t RESERVED5[(0x4001E000-0x40000508)/4-1];
|
||||
uint32_t RESERVED5[(0x4001E000 - 0x40000508) / 4 - 1];
|
||||
|
||||
__IO uint32_t RTCBKP[8]; //RTC电源域数据备份寄存器
|
||||
|
||||
|
@ -162,7 +162,7 @@ typedef struct {
|
|||
__IO uint32_t RTCLDOTRIM; //RTC Power Domain LDO Trim
|
||||
|
||||
//Analog Control: 0x40031000
|
||||
uint32_t RESERVED7[(0x40031000-0x4001E030)/4-1];
|
||||
uint32_t RESERVED7[(0x40031000 - 0x4001E030) / 4 - 1];
|
||||
|
||||
__IO uint32_t HRCCR; //High speed RC Control Register
|
||||
|
||||
|
@ -181,7 +181,6 @@ typedef struct {
|
|||
__IO uint32_t ADC1IN7;
|
||||
} SYS_TypeDef;
|
||||
|
||||
|
||||
#define SYS_CLKSEL_LFCK_Pos 0 //Low Frequency Clock Source 0 LRC 1 PLL
|
||||
#define SYS_CLKSEL_LFCK_Msk (0x01 << SYS_CLKSEL_LFCK_Pos)
|
||||
#define SYS_CLKSEL_HFCK_Pos 1 //High Frequency Clock Source 0 HRC 1 XTAL
|
||||
|
@ -313,7 +312,6 @@ typedef struct {
|
|||
#define SYS_LRCTRIM1_U_Pos 0 //LRC U调控制位
|
||||
#define SYS_LRCTRIM1_U_Msk (0x7FFF << SYS_LRCTRIM1_U_Pos)
|
||||
|
||||
|
||||
#define SYS_HRCCR_DBL_Pos 0 //Double Frequency 0 20MHz 1 40MHz
|
||||
#define SYS_HRCCR_DBL_Msk (0x01 << SYS_HRCCR_DBL_Pos)
|
||||
#define SYS_HRCCR_OFF_Pos 1 //High speed RC Off
|
||||
|
@ -329,8 +327,8 @@ typedef struct {
|
|||
#define SYS_PLLCR_OFF_Pos 2
|
||||
#define SYS_PLLCR_OFF_Msk (0x01 << SYS_PLLCR_OFF_Pos)
|
||||
|
||||
#define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器
|
||||
//VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
|
||||
#define SYS_PLLDIV_FBDIV_Pos 0 //PLL FeedBack分频寄存器 \
|
||||
//VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV \
|
||||
//PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
|
||||
#define SYS_PLLDIV_FBDIV_Msk (0x1FF << SYS_PLLDIV_FBDIV_Pos)
|
||||
#define SYS_PLLDIV_ADDIV_Pos 9 //ADC时钟基(即VCO输出分频后的时钟)经ADDIV分频后作为ADC的转换时钟
|
||||
|
@ -364,10 +362,8 @@ typedef struct {
|
|||
#define SYS_ADC1IN7_IOON_Pos 4 //ADC1模块模拟通道7所用IO开关
|
||||
#define SYS_ADC1IN7_IOON_Msk (0x01 << SYS_ADC1IN7_IOON_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t PORTA_SEL; //给PORTA_SEL[2n+2:2n]赋相应的值,将PORTA.PINn引脚配置成GPIO、模拟、数字等功能
|
||||
//当赋值为PORTA_PINn_FUNMUX时,PORTA.PINn引脚可通过PORTA_MUX寄存器连接到各种数字外设
|
||||
__IO uint32_t PORTB_SEL;
|
||||
|
@ -501,7 +497,6 @@ typedef struct {
|
|||
__IO uint32_t PORTP_INEN;
|
||||
} PORT_TypeDef;
|
||||
|
||||
|
||||
#define PORT_PORTA_PULLU_PIN0_Pos 0
|
||||
#define PORT_PORTA_PULLU_PIN0_Msk (0x01 << PORT_PORTA_PULLU_PIN0_Pos)
|
||||
#define PORT_PORTA_PULLU_PIN1_Pos 1
|
||||
|
@ -1141,10 +1136,8 @@ typedef struct {
|
|||
#define PORT_PORTP_INEN_PIN23_Pos 23
|
||||
#define PORT_PORTP_INEN_PIN23_Msk (0x01 << PORT_PORTP_INEN_PIN23_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t DATA;
|
||||
#define PIN0 0
|
||||
#define PIN1 1
|
||||
|
@ -1189,7 +1182,6 @@ typedef struct {
|
|||
__IO uint32_t INTCLR; //写1清除中断标志,只对边沿触发中断有用
|
||||
} GPIO_TypeDef;
|
||||
|
||||
|
||||
#define GPIO_DATA_PIN0_Pos 0
|
||||
#define GPIO_DATA_PIN0_Msk (0x01 << GPIO_DATA_PIN0_Pos)
|
||||
#define GPIO_DATA_PIN1_Pos 1
|
||||
|
@ -1631,10 +1623,8 @@ typedef struct {
|
|||
#define GPIO_INTCLR_PIN23_Pos 23
|
||||
#define GPIO_INTCLR_PIN23_Msk (0x01 << GPIO_INTCLR_PIN23_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t LDVAL; //定时器加载值,使能后定时器从此数值开始向下递减计数
|
||||
|
||||
__I uint32_t CVAL; //定时器当前值,LDVAL-CVAL 可计算出计时时长
|
||||
|
@ -1642,7 +1632,6 @@ typedef struct {
|
|||
__IO uint32_t CTRL;
|
||||
} TIMR_TypeDef;
|
||||
|
||||
|
||||
#define TIMR_CTRL_EN_Pos 0 //此位赋1导致TIMR从LDVAL开始向下递减计数
|
||||
#define TIMR_CTRL_EN_Msk (0x01 << TIMR_CTRL_EN_Pos)
|
||||
#define TIMR_CTRL_CLKSRC_Pos 1 //时钟源:0 内部系统时钟 1 外部引脚脉冲计数
|
||||
|
@ -1650,8 +1639,8 @@ typedef struct {
|
|||
#define TIMR_CTRL_CASCADE_Pos 2 //1 TIMRx的计数时钟为TIMRx-1的溢出信号
|
||||
#define TIMR_CTRL_CASCADE_Msk (0x01 << TIMR_CTRL_CASCADE_Pos)
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t PCTRL; //Pulse Control,脉宽测量模块控制寄存器
|
||||
|
||||
__I uint32_t PCVAL; //脉宽测量定时器当前值
|
||||
|
@ -1665,7 +1654,6 @@ typedef struct {
|
|||
__IO uint32_t HALT;
|
||||
} TIMRG_TypeDef;
|
||||
|
||||
|
||||
#define TIMRG_PCTRL_EN_Pos 0 //开始测量脉宽,脉宽内32位计数器从0开始向上计数
|
||||
#define TIMRG_PCTRL_EN_Msk (0x01 << TIMRG_PCTRL_EN_Pos)
|
||||
#define TIMRG_PCTRL_HIGH_Pos 1 //0 测量低电平长度 1 测量高电平长度
|
||||
|
@ -1716,10 +1704,8 @@ typedef struct {
|
|||
#define TIMRG_HALT_TIMR5_Pos 5
|
||||
#define TIMRG_HALT_TIMR5_Msk (0x01 << TIMRG_HALT_TIMR5_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t DATA;
|
||||
|
||||
__IO uint32_t CTRL;
|
||||
|
@ -1730,14 +1716,14 @@ typedef struct {
|
|||
|
||||
__IO uint32_t LINCR;
|
||||
|
||||
union {
|
||||
union
|
||||
{
|
||||
__IO uint32_t CTSCR;
|
||||
|
||||
__IO uint32_t RTSCR;
|
||||
};
|
||||
} UART_TypeDef;
|
||||
|
||||
|
||||
#define UART_DATA_DATA_Pos 0
|
||||
#define UART_DATA_DATA_Msk (0x1FF << UART_DATA_DATA_Pos)
|
||||
#define UART_DATA_VALID_Pos 9 //当DATA字段有有效的接收数据时,该位硬件置1,读取数据后自动清零
|
||||
|
@ -1780,7 +1766,7 @@ typedef struct {
|
|||
#define UART_CTRL_STOP2b_Pos 22 //1 2位停止位 0 1位停止位
|
||||
#define UART_CTRL_STOP2b_Msk (0x03 << UART_CTRL_STOP2b_Pos)
|
||||
#define UART_CTRL_TOTIME_Pos 24 //TimeOut 时长 = TOTIME/(BAUDRAUD/10) 秒
|
||||
#define UART_CTRL_TOTIME_Msk (0xFFu<< UART_CTRL_TOTIME_Pos)
|
||||
#define UART_CTRL_TOTIME_Msk (0xFFu << UART_CTRL_TOTIME_Pos)
|
||||
|
||||
#define UART_BAUD_BAUD_Pos 0 //串口波特率 = SYS_Freq/16/BAUD - 1
|
||||
#define UART_BAUD_BAUD_Msk (0x3FFF << UART_BAUD_BAUD_Pos)
|
||||
|
@ -1804,9 +1790,9 @@ typedef struct {
|
|||
#define UART_BAUD_RXIF_Msk (0x01 << UART_BAUD_RXIF_Pos)
|
||||
#define UART_BAUD_ABREN_Pos 23 //Auto Baudrate Enable,写1启动自动波特率校准,完成后自动清零
|
||||
#define UART_BAUD_ABREN_Msk (0x01 << UART_BAUD_ABREN_Pos)
|
||||
#define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit,用于计算波特率的检测位长,0 1位,通过测起始位 脉宽计算波特率,要求发送端发送0xFF
|
||||
// 1 2位,通过测起始位加1位数据位脉宽计算波特率,要求发送端发送0xFE
|
||||
// 1 4位,通过测起始位加3位数据位脉宽计算波特率,要求发送端发送0xF8
|
||||
#define UART_BAUD_ABRBIT_Pos 24 //Auto Baudrate Bit,用于计算波特率的检测位长,0 1位,通过测起始位 脉宽计算波特率,要求发送端发送0xFF \
|
||||
// 1 2位,通过测起始位加1位数据位脉宽计算波特率,要求发送端发送0xFE \
|
||||
// 1 4位,通过测起始位加3位数据位脉宽计算波特率,要求发送端发送0xF8 \
|
||||
// 1 8位,通过测起始位加7位数据位脉宽计算波特率,要求发送端发送0x80
|
||||
#define UART_BAUD_ABRBIT_Msk (0x03 << UART_BAUD_ABRBIT_Pos)
|
||||
#define UART_BAUD_ABRERR_Pos 26 //Auto Baudrate Error,0 自动波特率校准成功 1 自动波特率校准失败
|
||||
|
@ -1821,7 +1807,7 @@ typedef struct {
|
|||
#define UART_FIFO_RXTHR_Pos 16 //RX FIFO Threshold,RX中断触发门限,中断使能时 RXLVL >= RXTHR 触发RX中断
|
||||
#define UART_FIFO_RXTHR_Msk (0xFF << UART_FIFO_RXTHR_Pos)
|
||||
#define UART_FIFO_TXTHR_Pos 24 //TX FIFO Threshold,TX中断触发门限,中断使能时 TXLVL <= TXTHR 触发TX中断
|
||||
#define UART_FIFO_TXTHR_Msk (0xFFu<< UART_FIFO_TXTHR_Pos)
|
||||
#define UART_FIFO_TXTHR_Msk (0xFFu << UART_FIFO_TXTHR_Pos)
|
||||
|
||||
#define UART_LINCR_BRKDETIE_Pos 0 //检测到LIN Break中断使能
|
||||
#define UART_LINCR_BRKDETIE_Msk (0x01 << UART_LINCR_BRKDETIE_Pos)
|
||||
|
@ -1850,10 +1836,8 @@ typedef struct {
|
|||
#define UART_RTSCR_STAT_Pos 8 //RTS信号的当前状态
|
||||
#define UART_RTSCR_STAT_Msk (0x01 << UART_RTSCR_STAT_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CTRL;
|
||||
|
||||
__IO uint32_t DATA;
|
||||
|
@ -1865,7 +1849,6 @@ typedef struct {
|
|||
__IO uint32_t IF;
|
||||
} SPI_TypeDef;
|
||||
|
||||
|
||||
#define SPI_CTRL_CLKDIV_Pos 0 //Clock Divider, SPI工作时钟 = SYS_Freq/pow(2, CLKDIV+2)
|
||||
#define SPI_CTRL_CLKDIV_Msk (0x07 << SPI_CTRL_CLKDIV_Pos)
|
||||
#define SPI_CTRL_EN_Pos 3
|
||||
|
@ -1940,10 +1923,8 @@ typedef struct {
|
|||
#define SPI_IF_FTC_Pos 9 //Frame Transmit Complete,WTC置位时若TX FIFO是空的,则FTC置位
|
||||
#define SPI_IF_FTC_Msk (0x01 << SPI_IF_FTC_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CLKDIV; //[15:0] 须将内部工作频率分到SCL频率的5倍,即CLKDIV = SYS_Freq/5/SCL_Freq - 1
|
||||
|
||||
__IO uint32_t CTRL;
|
||||
|
@ -1961,7 +1942,6 @@ typedef struct {
|
|||
__IO uint32_t SLVRX;
|
||||
} I2C_TypeDef;
|
||||
|
||||
|
||||
#define I2C_CTRL_MSTIE_Pos 6
|
||||
#define I2C_CTRL_MSTIE_Msk (0x01 << I2C_CTRL_MSTIE_Pos)
|
||||
#define I2C_CTRL_EN_Pos 7
|
||||
|
@ -2024,10 +2004,8 @@ typedef struct {
|
|||
#define I2C_SLVIF_ACTIVE_Pos 6 //slave 有效
|
||||
#define I2C_SLVIF_ACTIVE_Msk (0x01 << I2C_SLVIF_ACTIVE_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CTRL;
|
||||
|
||||
__IO uint32_t START;
|
||||
|
@ -2036,7 +2014,8 @@ typedef struct {
|
|||
|
||||
__IO uint32_t IF;
|
||||
|
||||
struct {
|
||||
struct
|
||||
{
|
||||
__IO uint32_t STAT;
|
||||
|
||||
__IO uint32_t DATA;
|
||||
|
@ -2055,7 +2034,6 @@ typedef struct {
|
|||
__IO uint32_t CALIBEN;
|
||||
} ADC_TypeDef;
|
||||
|
||||
|
||||
#define ADC_CTRL_CH0_Pos 0 //通道选中
|
||||
#define ADC_CTRL_CH0_Msk (0x01 << ADC_CTRL_CH0_Pos)
|
||||
#define ADC_CTRL_CH1_Pos 1
|
||||
|
@ -2083,7 +2061,7 @@ typedef struct {
|
|||
#define ADC_CTRL_CLKSRC_Pos 15 //0 VCO 1 HRC
|
||||
#define ADC_CTRL_CLKSRC_Msk (0x01 << ADC_CTRL_CLKSRC_Pos)
|
||||
#define ADC_CTRL_FIFOCLR_Pos 24 //[24] CH0_FIFO_CLR [25] CH1_FIFO_CLR ... [31] CH7_FIFO_CLR
|
||||
#define ADC_CTRL_FIFOCLR_Msk (0xFFu<< ADC_CTRL_FIFOCLR_Pos)
|
||||
#define ADC_CTRL_FIFOCLR_Msk (0xFFu << ADC_CTRL_FIFOCLR_Pos)
|
||||
|
||||
#define ADC_START_GO_Pos 0 //软件触发模式下,写1启动ADC采样和转换,在单次模式下转换完成后硬件自动清零,在扫描模式下必须软件写0停止ADC转换
|
||||
#define ADC_START_GO_Msk (0x01 << ADC_START_GO_Pos)
|
||||
|
@ -2153,7 +2131,7 @@ typedef struct {
|
|||
#define ADC_IE_CH7HFULL_Pos 30
|
||||
#define ADC_IE_CH7HFULL_Msk (0x01 << ADC_IE_CH7HFULL_Pos)
|
||||
#define ADC_IE_CH7FULL_Pos 31
|
||||
#define ADC_IE_CH7FULL_Msk (0x01u<< ADC_IE_CH7FULL_Pos)
|
||||
#define ADC_IE_CH7FULL_Msk (0x01u << ADC_IE_CH7FULL_Pos)
|
||||
|
||||
#define ADC_IF_CH0EOC_Pos 0 //写1清零
|
||||
#define ADC_IF_CH0EOC_Msk (0x01 << ADC_IF_CH0EOC_Pos)
|
||||
|
@ -2247,22 +2225,20 @@ typedef struct {
|
|||
#define ADC_CTRL2_CLKDIV_Pos 24 //时钟分频,只在时钟源为HRC时有效
|
||||
#define ADC_CTRL2_CLKDIV_Msk (0x1F << ADC_CTRL2_CLKDIV_Pos)
|
||||
#define ADC_CTRL2_PGAVCM_Pos 29
|
||||
#define ADC_CTRL2_PGAVCM_Msk (0x07u<< ADC_CTRL2_PGAVCM_Pos)
|
||||
#define ADC_CTRL2_PGAVCM_Msk (0x07u << ADC_CTRL2_PGAVCM_Pos)
|
||||
|
||||
#define ADC_CALIBSET_OFFSET_Pos 0
|
||||
#define ADC_CALIBSET_OFFSET_Msk (0x1FF<< ADC_CALIBSET_OFFSET_Pos)
|
||||
#define ADC_CALIBSET_OFFSET_Msk (0x1FF << ADC_CALIBSET_OFFSET_Pos)
|
||||
#define ADC_CALIBSET_K_Pos 16
|
||||
#define ADC_CALIBSET_K_Msk (0x1FF<< ADC_CALIBSET_K_Pos)
|
||||
#define ADC_CALIBSET_K_Msk (0x1FF << ADC_CALIBSET_K_Pos)
|
||||
|
||||
#define ADC_CALIBEN_OFFSET_Pos 0
|
||||
#define ADC_CALIBEN_OFFSET_Msk (0x01 << ADC_CALIBEN_OFFSET_Pos)
|
||||
#define ADC_CALIBEN_K_Pos 1
|
||||
#define ADC_CALIBEN_K_Msk (0x01 << ADC_CALIBEN_K_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t MODE; //0 普通模式,A、B两路输出互相独立
|
||||
//1 互补模式,A、B两路输出都由PERA、HIGHA控制,B路输出与A路输出极性相反,且DZA、DZB控制A、B路输出上升沿推迟时间
|
||||
//2 单次模式,同普通模式,但一个周期后自动停止
|
||||
|
@ -2284,14 +2260,13 @@ typedef struct {
|
|||
__IO uint32_t INIOUT; //Init Output level,初始输出电平
|
||||
} PWM_TypeDef;
|
||||
|
||||
|
||||
#define PWM_INIOUT_PWMA_Pos 0
|
||||
#define PWM_INIOUT_PWMA_Msk (0x01 << PWM_INIOUT_PWMA_Pos)
|
||||
#define PWM_INIOUT_PWMB_Pos 1
|
||||
#define PWM_INIOUT_PWMB_Msk (0x01 << PWM_INIOUT_PWMB_Pos)
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t FORCEH;
|
||||
|
||||
__IO uint32_t ADTRG0A;
|
||||
|
@ -2327,7 +2302,6 @@ typedef struct {
|
|||
__IO uint32_t IRS; //Interrupt Raw Stat
|
||||
} PWMG_TypeDef;
|
||||
|
||||
|
||||
#define PWMG_FORCEH_PWM0_Pos 0
|
||||
#define PWMG_FORCEH_PWM0_Msk (0x01 << PWMG_FORCEH_PWM0_Pos)
|
||||
#define PWMG_FORCEH_PWM1_Pos 1
|
||||
|
@ -2396,7 +2370,6 @@ typedef struct {
|
|||
#define PWMG_CHEN_PWM5B_Pos 11
|
||||
#define PWMG_CHEN_PWM5B_Msk (0x01 << PWMG_CHEN_PWM5B_Pos)
|
||||
|
||||
|
||||
#define PWMG_IE_NEWP0A_Pos 0
|
||||
#define PWMG_IE_NEWP0A_Msk (0x01 << PWMG_IE_NEWP0A_Pos)
|
||||
#define PWMG_IE_NEWP0B_Pos 1
|
||||
|
@ -2601,10 +2574,8 @@ typedef struct {
|
|||
#define PWMG_IRS_HALT_Pos 24
|
||||
#define PWMG_IRS_HALT_Msk (0x01 << PWMG_IRS_HALT_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t EN; //[0] ENABLE
|
||||
|
||||
__IO uint32_t IE; //只有为1时,IF[CHx]在DMA传输结束时才能变为1,否则将一直保持在0
|
||||
|
@ -2615,7 +2586,8 @@ typedef struct {
|
|||
|
||||
uint32_t RESERVED[12];
|
||||
|
||||
struct {
|
||||
struct
|
||||
{
|
||||
__IO uint32_t CR;
|
||||
|
||||
__IO uint32_t AM; //Adress Mode
|
||||
|
@ -2644,7 +2616,6 @@ typedef struct {
|
|||
} CH[3];
|
||||
} DMA_TypeDef;
|
||||
|
||||
|
||||
#define DMA_IE_CH0_Pos 0
|
||||
#define DMA_IE_CH0_Msk (0x01 << DMA_IE_CH0_Pos)
|
||||
#define DMA_IE_CH1_Pos 1
|
||||
|
@ -2712,10 +2683,8 @@ typedef struct {
|
|||
#define DMA_AM_BURST_Pos 16
|
||||
#define DMA_AM_BURST_Msk (0x01 << DMA_AM_BURST_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CR; //Control Register
|
||||
|
||||
__O uint32_t CMD; //Command Register
|
||||
|
@ -2744,8 +2713,10 @@ typedef struct {
|
|||
|
||||
__IO uint32_t TXERR; //TX错误计数
|
||||
|
||||
union {
|
||||
struct { //在复位时可读写,正常工作模式下不可访问
|
||||
union
|
||||
{
|
||||
struct
|
||||
{ //在复位时可读写,正常工作模式下不可访问
|
||||
__IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器
|
||||
|
||||
__IO uint32_t AMR[4]; //Acceptance Mask Register, 验收屏蔽寄存器;对应位写0,ID必须和验收寄存器匹配
|
||||
|
@ -2753,14 +2724,17 @@ typedef struct {
|
|||
uint32_t RESERVED[5];
|
||||
} FILTER;
|
||||
|
||||
union { //在正常工作模式下可读写,复位时不可访问
|
||||
struct {
|
||||
union
|
||||
{ //在正常工作模式下可读写,复位时不可访问
|
||||
struct
|
||||
{
|
||||
__O uint32_t INFO;
|
||||
|
||||
__O uint32_t DATA[12];
|
||||
} TXFRAME;
|
||||
|
||||
struct {
|
||||
struct
|
||||
{
|
||||
__I uint32_t INFO;
|
||||
|
||||
__I uint32_t DATA[12];
|
||||
|
@ -2772,14 +2746,14 @@ typedef struct {
|
|||
|
||||
uint32_t RESERVED3[66];
|
||||
|
||||
struct { //TXFRAME的读接口
|
||||
struct
|
||||
{ //TXFRAME的读接口
|
||||
__I uint32_t INFO;
|
||||
|
||||
__I uint32_t DATA[12];
|
||||
} TXFRAME_R;
|
||||
} CAN_TypeDef;
|
||||
|
||||
|
||||
#define CAN_CR_RST_Pos 0
|
||||
#define CAN_CR_RST_Msk (0x01 << CAN_CR_RST_Pos)
|
||||
#define CAN_CR_LOM_Pos 1 //Listen Only Mode
|
||||
|
@ -2879,10 +2853,8 @@ typedef struct {
|
|||
#define CAN_INFO_FF_Pos 7 //Frame Format,0 标准帧格式 1 扩展帧格式
|
||||
#define CAN_INFO_FF_Msk (0x01 << CAN_INFO_FF_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t IE; //[0] 为0的时候,IF[0]维持为0
|
||||
|
||||
__IO uint32_t IF; //[0] 当完成指定长度的数据传输时置1,写1清零
|
||||
|
@ -2900,16 +2872,15 @@ typedef struct {
|
|||
__IO uint32_t PRECMDV; //在MPU接口中,发送数据前,RS拉低的那一拍,数据总线上的值
|
||||
} LCD_TypeDef;
|
||||
|
||||
|
||||
#define LCD_START_GO_Pos 1 //写1开始传输数据,数据传输结束后自动清零
|
||||
#define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos)
|
||||
#define LCD_START_BURST_Pos 2
|
||||
#define LCD_START_BURST_Msk (0x01 << LCD_START_BURST_Pos)
|
||||
|
||||
#define LCD_CR0_VPIX_Pos 0 //当portrait为0时,表示垂直方向的像素个数,0表示1个,最大为767
|
||||
#define LCD_CR0_VPIX_Pos 0 //当portrait为0时,表示垂直方向的像素个数,0表示1个,最大为767 \
|
||||
//当portrait为1时,表示水平方向的像素个数,0表示1个,最大为767
|
||||
#define LCD_CR0_VPIX_Msk (0x3FF << LCD_CR0_VPIX_Pos)
|
||||
#define LCD_CR0_HPIX_Pos 10 //当portrait为0时,表示水平方向的像素个数,0表示1个,最大为1023
|
||||
#define LCD_CR0_HPIX_Pos 10 //当portrait为0时,表示水平方向的像素个数,0表示1个,最大为1023 \
|
||||
//当portrait为1时,表示垂直方向的像素个数,0表示1个,最大为1023
|
||||
#define LCD_CR0_HPIX_Msk (0x3FF << LCD_CR0_HPIX_Pos)
|
||||
#define LCD_CR0_DCLK_Pos 20 //0 DOTCLK一直翻转 1 DOTCLK在空闲时停在1
|
||||
|
@ -2930,10 +2901,8 @@ typedef struct {
|
|||
#define LCD_CR1_DCLKINV_Pos 26 //1 输出DOTCLK反向,应用于用DOTCLK下降沿采样数据的屏
|
||||
#define LCD_CR1_DCLKINV_Msk (0x01 << LCD_CR1_DCLKINV_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t DMA_MEM_ADDR;
|
||||
|
||||
__IO uint32_t BLK; //Block Size and Count
|
||||
|
@ -2965,7 +2934,6 @@ typedef struct {
|
|||
__IO uint32_t MAXCURR;
|
||||
} SDIO_TypeDef;
|
||||
|
||||
|
||||
#define SDIO_BLK_SIZE_Pos 0 //0x200 512字节 0x400 1024字节 0x800 2048字节
|
||||
#define SDIO_BLK_SIZE_Msk (0xFFF << SDIO_BLK_SIZE_Pos)
|
||||
#define SDIO_BLK_COUNT_Pos 16 //0 Stop Transfer 1 1块 2 2块 ... ...
|
||||
|
@ -3149,10 +3117,8 @@ typedef struct {
|
|||
#define SDIO_IM_RESPERR_Pos 28
|
||||
#define SDIO_IM_RESPERR_Msk (0x01 << SDIO_IM_RESPERR_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t DATA;
|
||||
__IO uint32_t ADDR;
|
||||
__IO uint32_t ERASE;
|
||||
|
@ -3164,9 +3130,8 @@ typedef struct {
|
|||
__IO uint32_t STAT;
|
||||
} FLASH_Typedef;
|
||||
|
||||
|
||||
#define FLASH_ERASE_REQ_Pos 31
|
||||
#define FLASH_ERASE_REQ_Msk (0x01u<< FLASH_ERASE_REQ_Pos)
|
||||
#define FLASH_ERASE_REQ_Msk (0x01u << FLASH_ERASE_REQ_Pos)
|
||||
|
||||
#define FLASH_CACHE_PROG_Pos 2
|
||||
#define FLASH_CACHE_PROG_Msk (0x01 << FLASH_CACHE_PROG_Pos)
|
||||
|
@ -3182,14 +3147,11 @@ typedef struct {
|
|||
#define FALSH_STAT_FIFO_FULL_Pos 4
|
||||
#define FLASH_STAT_FIFO_FULL_Msk (0x01 << FALSH_STAT_FIFO_FULL_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CR;
|
||||
} SRAMC_TypeDef;
|
||||
|
||||
|
||||
#define SRAMC_CR_RWTIME_Pos 0 //读写操作持续多少个时钟周期。0表示1个时钟周期。最小设置为4
|
||||
#define SRAMC_CR_RWTIME_Msk (0x0F << SRAMC_CR_RWTIME_Pos)
|
||||
#define SRAMC_CR_BYTEIF_Pos 4 //外部SRAM数据宽度,0 16位 1 8位
|
||||
|
@ -3197,9 +3159,8 @@ typedef struct {
|
|||
#define SRAMC_CR_HBLBDIS_Pos 5 //1 ADDR[23:22]为地址线 0 ADDR[23]为高字节使能,ADDR[22]为低字节使能
|
||||
#define SRAMC_CR_HBLBDIS_Msk (0x01 << SRAMC_CR_HBLBDIS_Pos)
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CR0;
|
||||
|
||||
__IO uint32_t CR1;
|
||||
|
@ -3213,7 +3174,6 @@ typedef struct {
|
|||
__IO uint32_t REFDONE; //[0] Frefresh Done,上电初始化完成
|
||||
} SDRAMC_TypeDef;
|
||||
|
||||
|
||||
#define SDRAMC_CR0_BURSTLEN_Pos 0 //必须取2,表示Burst Length为4
|
||||
#define SDRAMC_CR0_BURSTLEN_Msk (0x07 << SDRAMC_CR0_BURSTLEN_Pos)
|
||||
#define SDRAMC_CR0_CASDELAY_Pos 4 //CAS Latency, 2 2 3 3
|
||||
|
@ -3254,10 +3214,8 @@ typedef struct {
|
|||
#define SDRAMC_LATCH_WAITST_Pos 2
|
||||
#define SDRAMC_LATCH_WAITST_Msk (0x01 << SDRAMC_LATCH_WAITST_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t IE;
|
||||
|
||||
__IO uint32_t IF; //写1清零
|
||||
|
@ -3271,7 +3229,6 @@ typedef struct {
|
|||
__IO uint32_t CMD;
|
||||
} NORFLC_TypeDef;
|
||||
|
||||
|
||||
#define NORFLC_IE_FINISH_Pos 0
|
||||
#define NORFLC_IE_FINISH_Msk (0x01 << NORFLC_IE_FINISH_Pos)
|
||||
#define NORFLC_IE_TIMEOUT_Pos 1
|
||||
|
@ -3299,10 +3256,8 @@ typedef struct {
|
|||
#define NORFLC_CMD_CMD_Pos 16 //需要执行的命令,0 READ 1 RESET 2 AUTOMATIC SELECT 3 PROGRAM 4 CHIP ERASE 5 SECTOR ERASE
|
||||
#define NORFLC_CMD_CMD_Msk (0x07 << NORFLC_CMD_CMD_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CR;
|
||||
|
||||
__O uint32_t DATAIN;
|
||||
|
@ -3312,7 +3267,6 @@ typedef struct {
|
|||
__I uint32_t RESULT;
|
||||
} CRC_TypeDef;
|
||||
|
||||
|
||||
#define CRC_CR_EN_Pos 0
|
||||
#define CRC_CR_EN_Msk (0x01 << CRC_CR_EN_Pos)
|
||||
#define CRC_CR_OREV_Pos 1 //输出结果是否翻转
|
||||
|
@ -3324,10 +3278,8 @@ typedef struct {
|
|||
#define CRC_CR_IBITS_Pos 4 //输入数据有效位数 0 32位 1 16位 2 8位
|
||||
#define CRC_CR_IBITS_Msk (0x03 << CRC_CR_IBITS_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t MINSEC; //分秒计数
|
||||
|
||||
__IO uint32_t DATHUR; //日时计数
|
||||
|
@ -3355,7 +3307,6 @@ typedef struct {
|
|||
__IO uint32_t TRIMM; //时钟微调整
|
||||
} RTC_TypeDef;
|
||||
|
||||
|
||||
#define RTC_LOAD_TIME_Pos 0
|
||||
#define RTC_LOAD_TIME_Msk (0x01 << RTC_LOAD_TIME_Pos)
|
||||
#define RTC_LOAD_ALARM_Pos 1
|
||||
|
@ -3425,16 +3376,14 @@ typedef struct {
|
|||
#define RTC_TRIM_DEC_Pos 8
|
||||
#define RTC_TRIM_DEC_Msk (0x01 << RTC_TRIM_DEC_Pos)
|
||||
|
||||
#define RTC_TRIMM_CYCLE_Pos 0 //用于计数周期微调,如果INC为1,则第n个计数周期调整为(32768±ADJ)+1,否则调整为(32768±ADJ)-1
|
||||
#define RTC_TRIMM_CYCLE_Pos 0 //用于计数周期微调,如果INC为1,则第n个计数周期调整为(32768±ADJ)+1,否则调整为(32768±ADJ)-1 \
|
||||
//cycles=0时,不进行微调整;cycles=1,则n为2;cycles=7,则n为8;以此类推
|
||||
#define RTC_TRIMM_CYCLE_Msk (0x07 << RTC_TRIMM_CYCLE_Pos)
|
||||
#define RTC_TRIMM_INC_Pos 3
|
||||
#define RTC_TRIMM_INC_Msk (0x01 << RTC_TRIMM_INC_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t LOAD; //喂狗使计数器装载LOAD值
|
||||
|
||||
__I uint32_t VALUE;
|
||||
|
@ -3446,13 +3395,11 @@ typedef struct {
|
|||
__IO uint32_t FEED; //写0x55喂狗
|
||||
} WDT_TypeDef;
|
||||
|
||||
|
||||
#define WDT_CR_EN_Pos 0
|
||||
#define WDT_CR_EN_Msk (0x01 << WDT_CR_EN_Pos)
|
||||
#define WDT_CR_RSTEN_Pos 1
|
||||
#define WDT_CR_RSTEN_Msk (0x01 << WDT_CR_RSTEN_Pos)
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* Peripheral memory map */
|
||||
/******************************************************************************/
|
||||
|
@ -3529,77 +3476,73 @@ typedef struct {
|
|||
|
||||
#define CAN_BASE (APB_BASE + 0x20000)
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* Peripheral declaration */
|
||||
/******************************************************************************/
|
||||
#define SYS ((SYS_TypeDef *) SYS_BASE)
|
||||
#define SYS ((SYS_TypeDef *)SYS_BASE)
|
||||
|
||||
#define PORT ((PORT_TypeDef *) PORT_BASE)
|
||||
#define PORT ((PORT_TypeDef *)PORT_BASE)
|
||||
|
||||
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
|
||||
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
|
||||
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
|
||||
#define GPIOM ((GPIO_TypeDef *) GPIOM_BASE)
|
||||
#define GPION ((GPIO_TypeDef *) GPION_BASE)
|
||||
#define GPIOP ((GPIO_TypeDef *) GPIOP_BASE)
|
||||
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
|
||||
#define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)
|
||||
#define GPIOC ((GPIO_TypeDef *)GPIOC_BASE)
|
||||
#define GPIOM ((GPIO_TypeDef *)GPIOM_BASE)
|
||||
#define GPION ((GPIO_TypeDef *)GPION_BASE)
|
||||
#define GPIOP ((GPIO_TypeDef *)GPIOP_BASE)
|
||||
|
||||
#define TIMR0 ((TIMR_TypeDef *) TIMR0_BASE)
|
||||
#define TIMR1 ((TIMR_TypeDef *) TIMR1_BASE)
|
||||
#define TIMR2 ((TIMR_TypeDef *) TIMR2_BASE)
|
||||
#define TIMR3 ((TIMR_TypeDef *) TIMR3_BASE)
|
||||
#define TIMR4 ((TIMR_TypeDef *) TIMR4_BASE)
|
||||
#define TIMR5 ((TIMR_TypeDef *) TIMR5_BASE)
|
||||
#define TIMRG ((TIMRG_TypeDef*) TIMRG_BASE)
|
||||
#define TIMR0 ((TIMR_TypeDef *)TIMR0_BASE)
|
||||
#define TIMR1 ((TIMR_TypeDef *)TIMR1_BASE)
|
||||
#define TIMR2 ((TIMR_TypeDef *)TIMR2_BASE)
|
||||
#define TIMR3 ((TIMR_TypeDef *)TIMR3_BASE)
|
||||
#define TIMR4 ((TIMR_TypeDef *)TIMR4_BASE)
|
||||
#define TIMR5 ((TIMR_TypeDef *)TIMR5_BASE)
|
||||
#define TIMRG ((TIMRG_TypeDef *)TIMRG_BASE)
|
||||
|
||||
#define UART0 ((UART_TypeDef *) UART0_BASE)
|
||||
#define UART1 ((UART_TypeDef *) UART1_BASE)
|
||||
#define UART2 ((UART_TypeDef *) UART2_BASE)
|
||||
#define UART3 ((UART_TypeDef *) UART3_BASE)
|
||||
#define UART0 ((UART_TypeDef *)UART0_BASE)
|
||||
#define UART1 ((UART_TypeDef *)UART1_BASE)
|
||||
#define UART2 ((UART_TypeDef *)UART2_BASE)
|
||||
#define UART3 ((UART_TypeDef *)UART3_BASE)
|
||||
|
||||
#define SPI0 ((SPI_TypeDef *) SPI0_BASE)
|
||||
#define SPI1 ((SPI_TypeDef *) SPI1_BASE)
|
||||
#define SPI0 ((SPI_TypeDef *)SPI0_BASE)
|
||||
#define SPI1 ((SPI_TypeDef *)SPI1_BASE)
|
||||
|
||||
#define I2C0 ((I2C_TypeDef *) I2C0_BASE)
|
||||
#define I2C1 ((I2C_TypeDef *) I2C1_BASE)
|
||||
#define I2C0 ((I2C_TypeDef *)I2C0_BASE)
|
||||
#define I2C1 ((I2C_TypeDef *)I2C1_BASE)
|
||||
|
||||
#define ADC0 ((ADC_TypeDef *) ADC0_BASE)
|
||||
#define ADC1 ((ADC_TypeDef *) ADC1_BASE)
|
||||
#define ADC0 ((ADC_TypeDef *)ADC0_BASE)
|
||||
#define ADC1 ((ADC_TypeDef *)ADC1_BASE)
|
||||
|
||||
#define PWM0 ((PWM_TypeDef *) PWM0_BASE)
|
||||
#define PWM1 ((PWM_TypeDef *) PWM1_BASE)
|
||||
#define PWM2 ((PWM_TypeDef *) PWM2_BASE)
|
||||
#define PWM3 ((PWM_TypeDef *) PWM3_BASE)
|
||||
#define PWM4 ((PWM_TypeDef *) PWM4_BASE)
|
||||
#define PWM5 ((PWM_TypeDef *) PWM5_BASE)
|
||||
#define PWMG ((PWMG_TypeDef *) PWMG_BASE)
|
||||
#define PWM0 ((PWM_TypeDef *)PWM0_BASE)
|
||||
#define PWM1 ((PWM_TypeDef *)PWM1_BASE)
|
||||
#define PWM2 ((PWM_TypeDef *)PWM2_BASE)
|
||||
#define PWM3 ((PWM_TypeDef *)PWM3_BASE)
|
||||
#define PWM4 ((PWM_TypeDef *)PWM4_BASE)
|
||||
#define PWM5 ((PWM_TypeDef *)PWM5_BASE)
|
||||
#define PWMG ((PWMG_TypeDef *)PWMG_BASE)
|
||||
|
||||
#define SDIO ((SDIO_TypeDef *) SDIO_BASE)
|
||||
#define SDIO ((SDIO_TypeDef *)SDIO_BASE)
|
||||
|
||||
#define DMA ((DMA_TypeDef *) DMA_BASE)
|
||||
#define DMA ((DMA_TypeDef *)DMA_BASE)
|
||||
|
||||
#define CAN ((CAN_TypeDef *) CAN_BASE)
|
||||
#define CAN ((CAN_TypeDef *)CAN_BASE)
|
||||
|
||||
#define LCD ((LCD_TypeDef *) LCD_BASE)
|
||||
#define LCD ((LCD_TypeDef *)LCD_BASE)
|
||||
|
||||
#define CRC ((CRC_TypeDef *) CRC_BASE)
|
||||
#define CRC ((CRC_TypeDef *)CRC_BASE)
|
||||
|
||||
#define RTC ((RTC_TypeDef *) RTC_BASE)
|
||||
#define RTC ((RTC_TypeDef *)RTC_BASE)
|
||||
|
||||
#define WDT ((WDT_TypeDef *) WDT_BASE)
|
||||
#define WDT ((WDT_TypeDef *)WDT_BASE)
|
||||
|
||||
#define FLASH ((FLASH_Typedef*) FLASH_BASE)
|
||||
#define FLASH ((FLASH_Typedef *)FLASH_BASE)
|
||||
|
||||
#define SRAMC ((SRAMC_TypeDef*) SRAMC_BASE)
|
||||
#define SRAMC ((SRAMC_TypeDef *)SRAMC_BASE)
|
||||
|
||||
#define NORFLC ((NORFLC_TypeDef*) NORFLC_BASE)
|
||||
#define NORFLC ((NORFLC_TypeDef *)NORFLC_BASE)
|
||||
|
||||
#define SDRAMC ((SDRAMC_TypeDef*) SDRAMC_BASE)
|
||||
|
||||
|
||||
|
||||
typedef void (* Func_void_void) (void);
|
||||
#define SDRAMC ((SDRAMC_TypeDef *)SDRAMC_BASE)
|
||||
|
||||
typedef void (*Func_void_void)(void);
|
||||
|
||||
#include "SWM320_port.h"
|
||||
#include "SWM320_gpio.h"
|
||||
|
@ -3622,5 +3565,4 @@ typedef void (* Func_void_void) (void);
|
|||
#include "SWM320_rtc.h"
|
||||
#include "SWM320_wdt.h"
|
||||
|
||||
|
||||
#endif //__SWM320_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <stdint.h>
|
||||
#include "SWM320.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 系统时钟设定
|
||||
*****************************************************************************************************************************************/
|
||||
|
@ -33,18 +32,15 @@
|
|||
|
||||
#define SYS_CLK SYS_CLK_PLL
|
||||
|
||||
|
||||
#define SYS_CLK_DIV_1 0
|
||||
#define SYS_CLK_DIV_2 1
|
||||
|
||||
#define SYS_CLK_DIV SYS_CLK_DIV_1
|
||||
|
||||
|
||||
#define __HSI (20000000UL) //高速内部时钟
|
||||
#define __LSI ( 32000UL) //低速内部时钟
|
||||
#define __LSI (32000UL) //低速内部时钟
|
||||
#define __HSE (20000000UL) //高速外部时钟
|
||||
|
||||
|
||||
/********************************** PLL 设定 **********************************************
|
||||
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
|
||||
* PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
|
||||
|
@ -55,19 +51,15 @@
|
|||
|
||||
#define PLL_FB_DIV 60
|
||||
|
||||
|
||||
#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
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称:
|
||||
* 功能说明: This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
|
||||
|
@ -77,17 +69,17 @@ uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
|
|||
******************************************************************************************************************************************/
|
||||
void SystemCoreClockUpdate(void)
|
||||
{
|
||||
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK
|
||||
if (SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //SYS_CLK <= HFCK
|
||||
{
|
||||
if(SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL
|
||||
if (SYS->CLKSEL & SYS_CLKSEL_HFCK_Msk) //HFCK <= XTAL
|
||||
{
|
||||
SystemCoreClock = __HSE;
|
||||
}
|
||||
else //HFCK <= HRC
|
||||
{
|
||||
if(SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz
|
||||
if (SYS->HRCCR & SYS_HRCCR_DBL_Msk) //HRC = 40MHz
|
||||
{
|
||||
SystemCoreClock = __HSI*2;
|
||||
SystemCoreClock = __HSI * 2;
|
||||
}
|
||||
else //HRC = 20MHz
|
||||
{
|
||||
|
@ -97,9 +89,9 @@ void SystemCoreClockUpdate(void)
|
|||
}
|
||||
else //SYS_CLK <= LFCK
|
||||
{
|
||||
if(SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL
|
||||
if (SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) //LFCK <= PLL
|
||||
{
|
||||
if(SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC
|
||||
if (SYS->PLLCR & SYS_PLLCR_INSEL_Msk) //PLL_SRC <= HRC
|
||||
{
|
||||
SystemCoreClock = __HSI;
|
||||
}
|
||||
|
@ -116,7 +108,8 @@ void SystemCoreClockUpdate(void)
|
|||
}
|
||||
}
|
||||
|
||||
if(SYS->CLKDIV & SYS_CLKDIV_SYS_Msk) SystemCoreClock /= 2;
|
||||
if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
|
||||
SystemCoreClock /= 2;
|
||||
|
||||
CyclesPerUs = SystemCoreClock / 1000000;
|
||||
}
|
||||
|
@ -134,7 +127,7 @@ void SystemInit(void)
|
|||
|
||||
Flash_Param_at_xMHz(120);
|
||||
|
||||
switch(SYS_CLK)
|
||||
switch (SYS_CLK)
|
||||
{
|
||||
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
|
||||
switchCLK_20MHz();
|
||||
|
@ -162,15 +155,15 @@ void SystemInit(void)
|
|||
|
||||
SystemCoreClockUpdate();
|
||||
|
||||
if(SystemCoreClock > 80000000)
|
||||
if (SystemCoreClock > 80000000)
|
||||
{
|
||||
Flash_Param_at_xMHz(120);
|
||||
}
|
||||
else if(SystemCoreClock > 40000000)
|
||||
else if (SystemCoreClock > 40000000)
|
||||
{
|
||||
Flash_Param_at_xMHz(80);
|
||||
}
|
||||
else if(SystemCoreClock > 30000000)
|
||||
else if (SystemCoreClock > 30000000)
|
||||
{
|
||||
Flash_Param_at_xMHz(40);
|
||||
}
|
||||
|
@ -187,7 +180,8 @@ void switchCLK_20MHz(void)
|
|||
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
|
||||
(0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
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
|
||||
|
@ -200,7 +194,8 @@ void switchCLK_40MHz(void)
|
|||
SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
|
||||
(1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
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
|
||||
|
@ -214,7 +209,8 @@ void switchCLK_32KHz(void)
|
|||
|
||||
SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
|
||||
|
||||
for(i = 0; i < 100; i++) __NOP();
|
||||
for (i = 0; i < 100; i++)
|
||||
__NOP();
|
||||
|
||||
SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK <= LRC
|
||||
SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk; //SYS_CLK <= LFCK
|
||||
|
@ -226,7 +222,8 @@ void switchCLK_XTAL(void)
|
|||
|
||||
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
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
|
||||
|
@ -239,7 +236,8 @@ void switchCLK_PLL(void)
|
|||
PLLInit();
|
||||
SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
|
||||
|
||||
for(i = 0; i < 10000; i++) __NOP();
|
||||
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
|
||||
|
@ -249,20 +247,22 @@ void PLLInit(void)
|
|||
{
|
||||
uint32_t i;
|
||||
|
||||
if(SYS_PLL_SRC == SYS_CLK_20MHz)
|
||||
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();
|
||||
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)
|
||||
else if (SYS_PLL_SRC == SYS_CLK_XTAL)
|
||||
{
|
||||
SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
|
||||
|
||||
for(i = 0; i < 20000; i++);
|
||||
for (i = 0; i < 20000; i++)
|
||||
;
|
||||
|
||||
SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
|
||||
}
|
||||
|
@ -272,9 +272,10 @@ void PLLInit(void)
|
|||
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);
|
||||
(PLL_OUT_DIV << SYS_PLLDIV_OUTDIV_Pos);
|
||||
|
||||
SYS->PLLCR &= ~(1 << SYS_PLLCR_OFF_Pos);
|
||||
|
||||
while(SYS->PLLLOCK == 0); //等待PLL锁定
|
||||
while (SYS->PLLLOCK == 0)
|
||||
; //等待PLL锁定
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_adc.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: ADC_Init()
|
||||
* 功能说明: ADC模数转换器初始化
|
||||
|
@ -28,9 +27,9 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
||||
void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)ADCx)
|
||||
switch ((uint32_t)ADCx)
|
||||
{
|
||||
case ((uint32_t)ADC0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos);
|
||||
|
@ -43,7 +42,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
|
||||
ADC_Close(ADCx); //一些关键寄存器只能在ADC关闭时设置
|
||||
|
||||
if(initStruct->clk_src == ADC_CLKSRC_HRC)
|
||||
if (initStruct->clk_src == ADC_CLKSRC_HRC)
|
||||
{
|
||||
ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos);
|
||||
|
||||
|
@ -52,7 +51,8 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(SYS->PLLCR & SYS_PLLCR_OFF_Msk) PLLInit();
|
||||
if (SYS->PLLCR & SYS_PLLCR_OFF_Msk)
|
||||
PLLInit();
|
||||
|
||||
ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
|
||||
|
||||
|
@ -72,7 +72,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
(6 << ADC_CTRL2_PGAGAIN_Pos) |
|
||||
((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
|
||||
|
||||
ADCx->CTRL &= ~( 0xFF << ADC_CTRL_CH0_Pos);
|
||||
ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
|
||||
ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
|
||||
|
||||
ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
|
||||
|
@ -126,10 +126,10 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
(((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
|
||||
(((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
|
||||
|
||||
switch((uint32_t)ADCx)
|
||||
switch ((uint32_t)ADCx)
|
||||
{
|
||||
case ((uint32_t)ADC0):
|
||||
if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
|
||||
if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
|
||||
{
|
||||
NVIC_EnableIRQ(ADC0_IRQn);
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)ADC1):
|
||||
if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
|
||||
if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
|
||||
{
|
||||
NVIC_EnableIRQ(ADC1_IRQn);
|
||||
}
|
||||
|
@ -159,7 +159,7 @@ void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_Open(ADC_TypeDef * ADCx)
|
||||
void ADC_Open(ADC_TypeDef *ADCx)
|
||||
{
|
||||
ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ void ADC_Open(ADC_TypeDef * ADCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_Close(ADC_TypeDef * ADCx)
|
||||
void ADC_Close(ADC_TypeDef *ADCx)
|
||||
{
|
||||
ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
|
||||
}
|
||||
|
@ -183,7 +183,7 @@ void ADC_Close(ADC_TypeDef * ADCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_Start(ADC_TypeDef * ADCx)
|
||||
void ADC_Start(ADC_TypeDef *ADCx)
|
||||
{
|
||||
ADCx->START |= (0x01 << ADC_START_GO_Pos);
|
||||
}
|
||||
|
@ -195,7 +195,7 @@ void ADC_Start(ADC_TypeDef * ADCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_Stop(ADC_TypeDef * ADCx)
|
||||
void ADC_Stop(ADC_TypeDef *ADCx)
|
||||
{
|
||||
ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
|
||||
}
|
||||
|
@ -204,16 +204,32 @@ static uint32_t chn2idx(uint32_t chn)
|
|||
{
|
||||
uint32_t idx = 0;
|
||||
|
||||
switch(chn)
|
||||
switch (chn)
|
||||
{
|
||||
case 0x01: idx = 0; break;
|
||||
case 0x02: idx = 1; break;
|
||||
case 0x04: idx = 2; break;
|
||||
case 0x08: idx = 3; break;
|
||||
case 0x10: idx = 4; break;
|
||||
case 0x20: idx = 5; break;
|
||||
case 0x40: idx = 6; break;
|
||||
case 0x80: idx = 7; break;
|
||||
case 0x01:
|
||||
idx = 0;
|
||||
break;
|
||||
case 0x02:
|
||||
idx = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
idx = 2;
|
||||
break;
|
||||
case 0x08:
|
||||
idx = 3;
|
||||
break;
|
||||
case 0x10:
|
||||
idx = 4;
|
||||
break;
|
||||
case 0x20:
|
||||
idx = 5;
|
||||
break;
|
||||
case 0x40:
|
||||
idx = 6;
|
||||
break;
|
||||
case 0x80:
|
||||
idx = 7;
|
||||
break;
|
||||
}
|
||||
|
||||
return idx;
|
||||
|
@ -227,7 +243,7 @@ static uint32_t chn2idx(uint32_t chn)
|
|||
* 输 出: uint32_t 读取到的转换结果
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t dat = 0;
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
@ -247,7 +263,7 @@ uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
|
@ -262,13 +278,12 @@ uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
|
||||
void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
|
||||
{
|
||||
ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
|
||||
ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: ADC_IntEOCEn()
|
||||
* 功能说明: 转换完成中断使能
|
||||
|
@ -277,11 +292,11 @@ void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE |= (0x01 << (idx*4));
|
||||
ADCx->IE |= (0x01 << (idx * 4));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -292,11 +307,11 @@ void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE &= ~(0x01 << (idx*4));
|
||||
ADCx->IE &= ~(0x01 << (idx * 4));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -307,11 +322,11 @@ void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IF = (0x01 << (idx*4));
|
||||
ADCx->IF = (0x01 << (idx * 4));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -322,11 +337,11 @@ void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
return (ADCx->IF & (0x01 << (idx*4))) ? 1 : 0;
|
||||
return (ADCx->IF & (0x01 << (idx * 4))) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -337,11 +352,11 @@ uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE |= (0x01 << (idx*4+1));
|
||||
ADCx->IE |= (0x01 << (idx * 4 + 1));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -352,11 +367,11 @@ void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE &= ~(0x01 << (idx*4+1));
|
||||
ADCx->IE &= ~(0x01 << (idx * 4 + 1));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -367,11 +382,11 @@ void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IF = (0x01 << (idx*4+1));
|
||||
ADCx->IF = (0x01 << (idx * 4 + 1));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -382,11 +397,11 @@ void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
return (ADCx->IF & (0x01 << (idx*4+1))) ? 1 : 0;
|
||||
return (ADCx->IF & (0x01 << (idx * 4 + 1))) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -397,11 +412,11 @@ uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE |= (0x01 << (idx*4+2));
|
||||
ADCx->IE |= (0x01 << (idx * 4 + 2));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -412,11 +427,11 @@ void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE &= ~(0x01 << (idx*4+2));
|
||||
ADCx->IE &= ~(0x01 << (idx * 4 + 2));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -427,11 +442,11 @@ void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IF = (0x01 << (idx*4+2));
|
||||
ADCx->IF = (0x01 << (idx * 4 + 2));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -442,11 +457,11 @@ void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
return (ADCx->IF & (0x01 << (idx*4+2))) ? 1 : 0;
|
||||
return (ADCx->IF & (0x01 << (idx * 4 + 2))) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -457,11 +472,11 @@ uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE |= (0x01 << (idx*4+3));
|
||||
ADCx->IE |= (0x01 << (idx * 4 + 3));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -472,11 +487,11 @@ void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IE &= ~(0x01 << (idx*4+3));
|
||||
ADCx->IE &= ~(0x01 << (idx * 4 + 3));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -487,11 +502,11 @@ void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
ADCx->IF = (0x01 << (idx*4+3));
|
||||
ADCx->IF = (0x01 << (idx * 4 + 3));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -502,9 +517,9 @@ void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
|
||||
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
|
||||
{
|
||||
uint32_t idx = chn2idx(chn);
|
||||
|
||||
return (ADCx->IF & (0x01 << (idx*4+3))) ? 1 : 0;
|
||||
return (ADCx->IF & (0x01 << (idx * 4 + 3))) ? 1 : 0;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_ADC_H__
|
||||
#define __SWM320_ADC_H__
|
||||
|
||||
typedef struct {
|
||||
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
|
||||
|
@ -42,38 +43,35 @@ typedef struct {
|
|||
#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
|
||||
#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
|
||||
|
||||
void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
|
||||
void ADC_Open(ADC_TypeDef *ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
|
||||
void ADC_Close(ADC_TypeDef *ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
|
||||
void ADC_Start(ADC_TypeDef *ADCx); //启动指定ADC,开始模数转换
|
||||
void ADC_Stop(ADC_TypeDef *ADCx); //关闭指定ADC,停止模数转换
|
||||
|
||||
void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct); //ADC模数转换器初始化
|
||||
void ADC_Open(ADC_TypeDef * ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
|
||||
void ADC_Close(ADC_TypeDef * ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
|
||||
void ADC_Start(ADC_TypeDef * ADCx); //启动指定ADC,开始模数转换
|
||||
void ADC_Stop(ADC_TypeDef * ADCx); //关闭指定ADC,停止模数转换
|
||||
uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn); //从指定通道读取转换结果
|
||||
uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn); //指定通道是否End Of Conversion
|
||||
|
||||
uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn); //从指定通道读取转换结果
|
||||
uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //指定通道是否End Of Conversion
|
||||
void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns);
|
||||
|
||||
void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns);
|
||||
void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断使能
|
||||
void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断禁止
|
||||
void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断标志清除
|
||||
uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断状态
|
||||
|
||||
void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断使能
|
||||
void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断禁止
|
||||
void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断标志清除
|
||||
uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断状态
|
||||
|
||||
void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断使能
|
||||
void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断禁止
|
||||
void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断标志清除
|
||||
uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn); //转换完成中断状态
|
||||
|
||||
void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断使能
|
||||
void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断禁止
|
||||
void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断标志清除
|
||||
uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn); //数据溢出中断状态
|
||||
|
||||
void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断使能
|
||||
void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断禁止
|
||||
void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO半满中断标志清除
|
||||
uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn);//FIFO半满中断状态
|
||||
|
||||
void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断使能
|
||||
void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断禁止
|
||||
void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断标志清除
|
||||
uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn); //FIFO满中断状态
|
||||
void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断使能
|
||||
void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断禁止
|
||||
void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断标志清除
|
||||
uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断状态
|
||||
|
||||
void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断使能
|
||||
void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断禁止
|
||||
void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断标志清除
|
||||
uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
|
||||
|
||||
#endif //__SWM320_ADC_H__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_can.c
|
||||
* 功能说明: SWM320单片机的CAN模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_can.c
|
||||
* 功能说明: SWM320单片机的CAN模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -21,25 +21,24 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_can.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_Init()
|
||||
* 功能说明: CAN接口初始化
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* CAN_InitStructure * initStruct 包含CAN接口相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_Init()
|
||||
* 功能说明: CAN接口初始化
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* CAN_InitStructure * initStruct 包含CAN接口相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
||||
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)CANx)
|
||||
switch ((uint32_t)CANx)
|
||||
{
|
||||
case ((uint32_t)CAN):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_CAN_Pos);
|
||||
break;
|
||||
}
|
||||
|
||||
CAN_Close(CANx); //一些关键寄存器只能在CAN关闭时设置
|
||||
CAN_Close(CANx); //一些关键寄存器只能在CAN关闭时设置
|
||||
|
||||
CANx->CR &= ~(CAN_CR_LOM_Msk | CAN_CR_STM_Msk | CAN_CR_AFM_Msk);
|
||||
CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) |
|
||||
|
@ -60,9 +59,9 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
|||
(initStruct->CAN_BS2 << CAN_BT1_TSEG2_Pos);
|
||||
|
||||
CANx->BT0 = (initStruct->CAN_SJW << CAN_BT0_SJW_Pos) |
|
||||
((SystemCoreClock/2/initStruct->Baudrate/(1 + (initStruct->CAN_BS1 + 1) + (initStruct->CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
|
||||
((SystemCoreClock / 2 / initStruct->Baudrate / (1 + (initStruct->CAN_BS1 + 1) + (initStruct->CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
|
||||
|
||||
CANx->RXERR = 0; //只能在复位模式下清除
|
||||
CANx->RXERR = 0; //只能在复位模式下清除
|
||||
CANx->TXERR = 0;
|
||||
|
||||
CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) |
|
||||
|
@ -70,10 +69,10 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
|||
(initStruct->ArbitrLostIEn << CAN_IE_ARBLOST_Pos) |
|
||||
(initStruct->ErrPassiveIEn << CAN_IE_ERRPASS_Pos);
|
||||
|
||||
switch((uint32_t)CANx)
|
||||
switch ((uint32_t)CANx)
|
||||
{
|
||||
case ((uint32_t)CAN):
|
||||
if(initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn)
|
||||
if (initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(CAN_IRQn);
|
||||
}
|
||||
|
@ -86,46 +85,46 @@ void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_Open()
|
||||
* 功能说明: CAN接口打开
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_Open()
|
||||
* 功能说明: CAN接口打开
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_Open(CAN_TypeDef * CANx)
|
||||
void CAN_Open(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
|
||||
CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_Close()
|
||||
* 功能说明: CAN接口关闭
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_Close()
|
||||
* 功能说明: CAN接口关闭
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_Close(CAN_TypeDef * CANx)
|
||||
void CAN_Close(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
|
||||
CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_Transmit()
|
||||
* 功能说明: CAN发送数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
|
||||
* uint32_t id 消息ID
|
||||
* uint8_t data[] 要发送的数据
|
||||
* uint32_t size 要发送的数据的个数
|
||||
* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_Transmit()
|
||||
* 功能说明: CAN发送数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
|
||||
* uint32_t id 消息ID
|
||||
* uint8_t data[] 要发送的数据
|
||||
* uint32_t size 要发送的数据的个数
|
||||
* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
|
||||
void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
if(format == CAN_FRAME_STD)
|
||||
if (format == CAN_FRAME_STD)
|
||||
{
|
||||
CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
|
||||
(0 << CAN_INFO_RTR_Pos) |
|
||||
|
@ -134,9 +133,9 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
|
|||
CANx->TXFRAME.DATA[0] = id >> 3;
|
||||
CANx->TXFRAME.DATA[1] = id << 5;
|
||||
|
||||
for(i = 0; i < size; i++)
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
CANx->TXFRAME.DATA[i+2] = data[i];
|
||||
CANx->TXFRAME.DATA[i + 2] = data[i];
|
||||
}
|
||||
}
|
||||
else //if(format == CAN_FRAME_EXT)
|
||||
|
@ -150,19 +149,19 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
|
|||
CANx->TXFRAME.DATA[2] = id >> 5;
|
||||
CANx->TXFRAME.DATA[3] = id << 3;
|
||||
|
||||
for(i = 0; i < size; i++)
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
CANx->TXFRAME.DATA[i+4] = data[i];
|
||||
CANx->TXFRAME.DATA[i + 4] = data[i];
|
||||
}
|
||||
}
|
||||
|
||||
if(CANx->CR & CAN_CR_STM_Msk)
|
||||
if (CANx->CR & CAN_CR_STM_Msk)
|
||||
{
|
||||
CANx->CMD = (1 << CAN_CMD_SRR_Pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(once == 0)
|
||||
if (once == 0)
|
||||
{
|
||||
CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
|
||||
}
|
||||
|
@ -174,18 +173,18 @@ void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_TransmitRequest()
|
||||
* 功能说明: CAN发送远程请求,请求远程节点发送数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
|
||||
* uint32_t id 消息ID
|
||||
* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_TransmitRequest()
|
||||
* 功能说明: CAN发送远程请求,请求远程节点发送数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
|
||||
* uint32_t id 消息ID
|
||||
* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once)
|
||||
void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once)
|
||||
{
|
||||
if(format == CAN_FRAME_STD)
|
||||
if (format == CAN_FRAME_STD)
|
||||
{
|
||||
CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
|
||||
(1 << CAN_INFO_RTR_Pos) |
|
||||
|
@ -206,7 +205,7 @@ void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint3
|
|||
CANx->TXFRAME.DATA[3] = id << 3;
|
||||
}
|
||||
|
||||
if(once == 0)
|
||||
if (once == 0)
|
||||
{
|
||||
CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
|
||||
}
|
||||
|
@ -217,14 +216,14 @@ void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint3
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_Receive()
|
||||
* 功能说明: CAN接收数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* CAN_RXMessage *msg 接收到的消息存储在此结构体变量中
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_Receive()
|
||||
* 功能说明: CAN接收数据
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* CAN_RXMessage *msg 接收到的消息存储在此结构体变量中
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
|
||||
void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
|
||||
{
|
||||
uint32_t i;
|
||||
msg->format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
|
||||
|
@ -232,22 +231,22 @@ void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
|
|||
msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
|
||||
msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
|
||||
|
||||
if(msg->format == CAN_FRAME_STD)
|
||||
if (msg->format == CAN_FRAME_STD)
|
||||
{
|
||||
msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5);
|
||||
|
||||
for(i = 0; i < msg->size; i++)
|
||||
for (i = 0; i < msg->size; i++)
|
||||
{
|
||||
msg->data[i] = CANx->RXFRAME.DATA[i+2];
|
||||
msg->data[i] = CANx->RXFRAME.DATA[i + 2];
|
||||
}
|
||||
}
|
||||
else //if(msg->format == CAN_FRAME_EXT)
|
||||
{
|
||||
msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3);
|
||||
|
||||
for(i = 0; i < msg->size; i++)
|
||||
for (i = 0; i < msg->size; i++)
|
||||
{
|
||||
msg->data[i] = CANx->RXFRAME.DATA[i+4];
|
||||
msg->data[i] = CANx->RXFRAME.DATA[i + 4];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -255,96 +254,96 @@ void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_TXComplete()
|
||||
* 功能说明: 发送是否完成
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 已经完成 0 还未完成
|
||||
* 注意事项: 发送被Abort也会触发发送完成,但不会触发发送成功
|
||||
* 函数名称: CAN_TXComplete()
|
||||
* 功能说明: 发送是否完成
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 已经完成 0 还未完成
|
||||
* 注意事项: 发送被Abort也会触发发送完成,但不会触发发送成功
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef * CANx)
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
|
||||
{
|
||||
return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_TXSuccess()
|
||||
* 功能说明: 发送是否成功
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 发送成功 0 发送失败
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_TXSuccess()
|
||||
* 功能说明: 发送是否成功
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 发送成功 0 发送失败
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef * CANx)
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
|
||||
{
|
||||
return (CANx->SR & CAN_SR_TXOK_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_AbortTransmit()
|
||||
* 功能说明: 终止发送
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 正在进行的发送无法终止,但执行此命令后若发送失败不会再重发
|
||||
* 函数名称: CAN_AbortTransmit()
|
||||
* 功能说明: 终止发送
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 正在进行的发送无法终止,但执行此命令后若发送失败不会再重发
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_AbortTransmit(CAN_TypeDef * CANx)
|
||||
void CAN_AbortTransmit(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->CMD = (1 << CAN_CMD_ABTTX_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_TXBufferReady()
|
||||
* 功能说明: TX Buffer是否准备好可以写入消息
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 已准备好 0 未准备好
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_TXBufferReady()
|
||||
* 功能说明: TX Buffer是否准备好可以写入消息
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 已准备好 0 未准备好
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx)
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
|
||||
{
|
||||
return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_RXDataAvailable()
|
||||
* 功能说明: RX FIFO中是否有数据可读出
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 有数据可读出 0 没有数据
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_RXDataAvailable()
|
||||
* 功能说明: RX FIFO中是否有数据可读出
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 1 有数据可读出 0 没有数据
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx)
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
|
||||
{
|
||||
return (CANx->SR & CAN_SR_RXDA_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_SetBaudrate()
|
||||
* 功能说明: 设置波特率
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t baudrate 波特率,即位传输速率
|
||||
* uint32_t CAN_BS1 CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
|
||||
* uint32_t CAN_BS2 CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
|
||||
* uint32_t CAN_SJW CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
* 函数名称: CAN_SetBaudrate()
|
||||
* 功能说明: 设置波特率
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t baudrate 波特率,即位传输速率
|
||||
* uint32_t CAN_BS1 CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
|
||||
* uint32_t CAN_BS2 CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
|
||||
* uint32_t CAN_SJW CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
******************************************************************************************************************************************/
|
||||
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)
|
||||
{
|
||||
CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
|
||||
(CAN_BS1 << CAN_BT1_TSEG1_Pos) |
|
||||
(CAN_BS2 << CAN_BT1_TSEG2_Pos);
|
||||
|
||||
CANx->BT0 = (CAN_SJW << CAN_BT0_SJW_Pos) |
|
||||
((SystemCoreClock/2/baudrate/(1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
|
||||
((SystemCoreClock / 2 / baudrate / (1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_SetFilter32b()
|
||||
* 功能说明: 设置接收滤波器,1个32位滤波器
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t check 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
|
||||
* 函数名称: CAN_SetFilter32b()
|
||||
* 功能说明: 设置接收滤波器,1个32位滤波器
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint32_t check 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
|
||||
* uint32_t mask
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
|
||||
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask)
|
||||
{
|
||||
CANx->CR &= ~CAN_CR_AFM_Msk;
|
||||
CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
|
||||
|
@ -361,17 +360,17 @@ void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_SetFilter16b()
|
||||
* 功能说明: 设置接收滤波器,2个16位滤波器
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint16_t check1 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
|
||||
* 函数名称: CAN_SetFilter16b()
|
||||
* 功能说明: 设置接收滤波器,2个16位滤波器
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* uint16_t check1 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
|
||||
* uint16_t mask1
|
||||
* uint16_t check2
|
||||
* uint16_t mask2
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
* 输 出: 无
|
||||
* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
|
||||
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
|
||||
{
|
||||
CANx->CR &= ~CAN_CR_AFM_Msk;
|
||||
CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
|
||||
|
@ -388,217 +387,217 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint1
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTRXNotEmptyEn()
|
||||
* 功能说明: 当RX FIFO中有数据时(非空)触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTRXNotEmptyEn()
|
||||
* 功能说明: 当RX FIFO中有数据时(非空)触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_RXDA_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTRXNotEmptyDis()
|
||||
* 功能说明: 当RX FIFO中有数据时(非空)触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTRXNotEmptyDis()
|
||||
* 功能说明: 当RX FIFO中有数据时(非空)触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTTXBufEmptyEn()
|
||||
* 功能说明: 当TX Buffer空时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTTXBufEmptyEn()
|
||||
* 功能说明: 当TX Buffer空时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_TXBR_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTTXBufEmptyDis()
|
||||
* 功能说明: 当TX Buffer空时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTTXBufEmptyDis()
|
||||
* 功能说明: 当TX Buffer空时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTErrWarningEn()
|
||||
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTErrWarningEn()
|
||||
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTErrWarningEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTErrWarningEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_ERRWARN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTErrWarningDis()
|
||||
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTErrWarningDis()
|
||||
* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTErrWarningDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTErrWarningDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTRXOverflowEn()
|
||||
* 功能说明: RX FIFO 溢出时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTRXOverflowEn()
|
||||
* 功能说明: RX FIFO 溢出时触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTRXOverflowEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_RXOV_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTRXOverflowDis()
|
||||
* 功能说明: RX FIFO 溢出时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTRXOverflowDis()
|
||||
* 功能说明: RX FIFO 溢出时触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTRXOverflowDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTRXOverflowClear()
|
||||
* 功能说明: RX FIFO 溢出中断清除
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTRXOverflowClear()
|
||||
* 功能说明: RX FIFO 溢出中断清除
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx)
|
||||
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->CMD = (1 << CAN_CMD_CLROV_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTWakeupEn()
|
||||
* 功能说明: 唤醒事件触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTWakeupEn()
|
||||
* 功能说明: 唤醒事件触发中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTWakeupEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTWakeupEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_WKUP_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTWakeupDis()
|
||||
* 功能说明: 唤醒事件触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTWakeupDis()
|
||||
* 功能说明: 唤醒事件触发中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTWakeupDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTWakeupDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTErrPassiveEn()
|
||||
* 功能说明: TXERR/RXERR计数值达到127时中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTErrPassiveEn()
|
||||
* 功能说明: TXERR/RXERR计数值达到127时中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTErrPassiveEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_ERRPASS_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTErrPassiveDis()
|
||||
* 功能说明: TXERR/RXERR计数值达到127时中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTErrPassiveDis()
|
||||
* 功能说明: TXERR/RXERR计数值达到127时中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTArbitrLostEn()
|
||||
* 功能说明: 仲裁失败中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTArbitrLostEn()
|
||||
* 功能说明: 仲裁失败中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTArbitrLostEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTArbitrLostEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_ARBLOST_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTArbitrLostDis()
|
||||
* 功能说明: 仲裁失败中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTArbitrLostDis()
|
||||
* 功能说明: 仲裁失败中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTArbitrLostDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTBusErrorEn()
|
||||
* 功能说明: 总线错误中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTBusErrorEn()
|
||||
* 功能说明: 总线错误中断使能
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTBusErrorEn(CAN_TypeDef * CANx)
|
||||
void CAN_INTBusErrorEn(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE |= (1 << CAN_IE_BUSERR_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTBusErrorDis()
|
||||
* 功能说明: 总线错误中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CAN_INTBusErrorDis()
|
||||
* 功能说明: 总线错误中断禁止
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CAN_INTBusErrorDis(CAN_TypeDef * CANx)
|
||||
void CAN_INTBusErrorDis(CAN_TypeDef *CANx)
|
||||
{
|
||||
CANx->IE &= ~(1 << CAN_IE_BUSERR_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CAN_INTStat()
|
||||
* 功能说明: 查询中断状态
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 当前中断状态
|
||||
* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
|
||||
* 函数名称: CAN_INTStat()
|
||||
* 功能说明: 查询中断状态
|
||||
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
|
||||
* 输 出: uint32_t 当前中断状态
|
||||
* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t CAN_INTStat(CAN_TypeDef * CANx)
|
||||
uint32_t CAN_INTStat(CAN_TypeDef *CANx)
|
||||
{
|
||||
return CANx->IF;
|
||||
}
|
||||
|
|
|
@ -4,23 +4,28 @@
|
|||
#define CAN_FRAME_STD 0
|
||||
#define CAN_FRAME_EXT 1
|
||||
|
||||
typedef struct {
|
||||
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 {
|
||||
union
|
||||
{
|
||||
uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
|
||||
struct { // 0 must match 1 don't care
|
||||
struct
|
||||
{ // 0 must match 1 don't care
|
||||
uint16_t FilterMask16b1;
|
||||
uint16_t FilterMask16b2;
|
||||
};
|
||||
};
|
||||
union {
|
||||
union
|
||||
{
|
||||
uint32_t FilterCheck32b;
|
||||
struct {
|
||||
struct
|
||||
{
|
||||
uint16_t FilterCheck16b1;
|
||||
uint16_t FilterCheck16b2;
|
||||
};
|
||||
|
@ -69,7 +74,8 @@ typedef struct {
|
|||
#define CAN_FILTER_16b 0 //两个16位过滤器
|
||||
#define CAN_FILTER_32b 1 //一个32位过滤器
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint32_t id; //消息ID
|
||||
uint8_t format; //帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
|
||||
uint8_t remote; //消息是否为远程帧
|
||||
|
@ -77,54 +83,52 @@ typedef struct {
|
|||
uint8_t data[8]; //接收到的数据
|
||||
} CAN_RXMessage;
|
||||
|
||||
void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
|
||||
void CAN_Open(CAN_TypeDef *CANx);
|
||||
void CAN_Close(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct);
|
||||
void CAN_Open(CAN_TypeDef * CANx);
|
||||
void CAN_Close(CAN_TypeDef * CANx);
|
||||
void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
|
||||
void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once);
|
||||
void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg);
|
||||
|
||||
void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
|
||||
void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once);
|
||||
void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg);
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef *CANx);
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef *CANx);
|
||||
|
||||
uint32_t CAN_TXComplete(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_TXSuccess(CAN_TypeDef * CANx);
|
||||
void CAN_AbortTransmit(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_AbortTransmit(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx);
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx);
|
||||
|
||||
uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx);
|
||||
uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx);
|
||||
void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
|
||||
|
||||
void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
|
||||
void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
|
||||
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
|
||||
|
||||
void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask);
|
||||
void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTErrWarningDis(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_INTErrWarningEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrWarningDis(CAN_TypeDef * CANx);
|
||||
void CAN_INTWakeupEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTWakeupDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx);
|
||||
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTWakeupEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTWakeupDis(CAN_TypeDef * CANx);
|
||||
void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTErrPassiveDis(CAN_TypeDef * CANx);
|
||||
void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
|
||||
void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
|
||||
|
||||
void CAN_INTArbitrLostEn(CAN_TypeDef * CANx);
|
||||
void CAN_INTArbitrLostDis(CAN_TypeDef * CANx);
|
||||
|
||||
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__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_crc.c
|
||||
* 功能说明: SWM320单片机的CRC模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_crc.c
|
||||
* 功能说明: SWM320单片机的CRC模块驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -21,21 +21,20 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_crc.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: CRC_Init()
|
||||
* 功能说明: CRC 初始化
|
||||
* 输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括CRC
|
||||
* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
|
||||
* uint32_t out_not 输出结果是否取反
|
||||
* uint32_t out_rev 输出结果是否翻转
|
||||
* uint32_t ini_val CRC初始值
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: CRC_Init()
|
||||
* 功能说明: CRC 初始化
|
||||
* 输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括CRC
|
||||
* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
|
||||
* uint32_t out_not 输出结果是否取反
|
||||
* uint32_t out_rev 输出结果是否翻转
|
||||
* uint32_t ini_val CRC初始值
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
|
||||
void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
|
||||
{
|
||||
switch((uint32_t)CRCx)
|
||||
switch ((uint32_t)CRCx)
|
||||
{
|
||||
case ((uint32_t)CRC):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);
|
||||
|
|
|
@ -1,16 +1,13 @@
|
|||
#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位
|
||||
|
||||
|
||||
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()
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_dma.c
|
||||
* 功能说明: SWM320单片机的DMA功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_dma.c
|
||||
* 功能说明: SWM320单片机的DMA功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -22,55 +22,57 @@
|
|||
#include "SWM320_dma.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CHM_Config()
|
||||
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t dst_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t num_word 要搬运的数据字数,最大1024
|
||||
* uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 搬运数据量以字为单元,不是字节
|
||||
* 函数名称: DMA_CHM_Config()
|
||||
* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t src_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
|
||||
* uint32_t dst_addr_incr 0 固定地址 1 地址递增
|
||||
* uint32_t num_word 要搬运的数据字数,最大1024
|
||||
* uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
|
||||
* 输 出: 无
|
||||
* 注意事项: 搬运数据量以字为单元,不是字节
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
|
||||
{
|
||||
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
|
||||
DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
|
||||
|
||||
DMA_CH_Close(chn); //配置前先关闭该通道
|
||||
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) |
|
||||
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->IF = (1 << chn); //清除中断标志
|
||||
DMA->IE |= (1 << chn);
|
||||
if(int_en) DMA->IM &= ~(1 << chn);
|
||||
else DMA->IM |= (1 << chn);
|
||||
if (int_en)
|
||||
DMA->IM &= ~(1 << chn);
|
||||
else
|
||||
DMA->IM |= (1 << chn);
|
||||
|
||||
if(int_en)
|
||||
if (int_en)
|
||||
{
|
||||
NVIC_EnableIRQ(DMA_IRQn);
|
||||
}
|
||||
else
|
||||
{
|
||||
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
||||
//不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_Open()
|
||||
* 功能说明: DMA通道打开
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_Open()
|
||||
* 功能说明: DMA通道打开
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_Open(uint32_t chn)
|
||||
{
|
||||
|
@ -78,11 +80,11 @@ void DMA_CH_Open(uint32_t chn)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_Close()
|
||||
* 功能说明: DMA通道关闭
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_Close()
|
||||
* 功能说明: DMA通道关闭
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_Close(uint32_t chn)
|
||||
{
|
||||
|
@ -90,11 +92,11 @@ void DMA_CH_Close(uint32_t chn)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTEn()
|
||||
* 功能说明: DMA中断使能,数据搬运完成后触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTEn()
|
||||
* 功能说明: DMA中断使能,数据搬运完成后触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTEn(uint32_t chn)
|
||||
{
|
||||
|
@ -102,11 +104,11 @@ void DMA_CH_INTEn(uint32_t chn)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTDis()
|
||||
* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTDis()
|
||||
* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTDis(uint32_t chn)
|
||||
{
|
||||
|
@ -114,11 +116,11 @@ void DMA_CH_INTDis(uint32_t chn)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTClr()
|
||||
* 功能说明: DMA中断标志清除
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTClr()
|
||||
* 功能说明: DMA中断标志清除
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void DMA_CH_INTClr(uint32_t chn)
|
||||
{
|
||||
|
@ -126,11 +128,11 @@ void DMA_CH_INTClr(uint32_t chn)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: DMA_CH_INTStat()
|
||||
* 功能说明: DMA中断状态查询
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
|
||||
* 注意事项: 无
|
||||
* 函数名称: DMA_CH_INTStat()
|
||||
* 功能说明: DMA中断状态查询
|
||||
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
|
||||
* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t DMA_CH_INTStat(uint32_t chn)
|
||||
{
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
#ifndef __SWM320_DMA_H__
|
||||
#define __SWM320_DMA_H__
|
||||
|
||||
|
||||
#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通道关闭
|
||||
|
@ -16,5 +14,4 @@ void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后
|
|||
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
|
||||
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
|
||||
|
||||
|
||||
#endif //__SWM320_DMA_H__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_exti.c
|
||||
* 功能说明: SWM320单片机的外部中断功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
* @attention
|
||||
|
@ -21,111 +21,111 @@
|
|||
#include "SWM320_exti.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Init()
|
||||
* 功能说明: 指定引脚外部中断初始化
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
||||
* 输 出: 无
|
||||
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
|
||||
* 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
|
||||
* 函数名称: EXTI_Init()
|
||||
* 功能说明: 指定引脚外部中断初始化
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
|
||||
* 输 出: 无
|
||||
* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
|
||||
* 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
|
||||
void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
|
||||
{
|
||||
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
|
||||
EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
|
||||
|
||||
if(mode & 0x10)
|
||||
if (mode & 0x10)
|
||||
{
|
||||
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
|
||||
GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
|
||||
|
||||
if(mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
|
||||
if (mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
|
||||
GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
|
||||
|
||||
if(mode & 0x02)
|
||||
if (mode & 0x02)
|
||||
{
|
||||
GPIOx->INTBE |= (0x01 << n); //双边沿触发
|
||||
GPIOx->INTBE |= (0x01 << n); //双边沿触发
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
|
||||
GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
|
||||
|
||||
if(mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
|
||||
if (mode & 0x01)
|
||||
GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
|
||||
else
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
|
||||
GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
|
||||
}
|
||||
}
|
||||
|
||||
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
|
||||
GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Open()
|
||||
* 功能说明: 指定引脚外部中断打开(即使能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_Open()
|
||||
* 功能说明: 指定引脚外部中断打开(即使能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTEN |= (0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Close()
|
||||
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_Close()
|
||||
* 功能说明: 指定引脚外部中断关闭(即禁能)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTEN &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_State()
|
||||
* 功能说明: 指定引脚是否触发了中断
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_State()
|
||||
* 功能说明: 指定引脚是否触发了中断
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
return (GPIOx->INTSTAT >> n) & 0x01;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_RawState()
|
||||
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
|
||||
* 注意事项: 无
|
||||
* 函数名称: EXTI_RawState()
|
||||
* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
return (GPIOx->INTRAWSTAT >> n) & 0x01;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: EXTI_Clear()
|
||||
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
||||
* 函数名称: EXTI_Clear()
|
||||
* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
|
||||
******************************************************************************************************************************************/
|
||||
void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->INTCLR = (0x01 << n);
|
||||
}
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#ifndef __SWM320_EXTI_H__
|
||||
#define __SWM320_EXTI_H__
|
||||
|
||||
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
|
||||
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
|
||||
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
|
||||
|
||||
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); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
|
||||
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 //上升沿触发中断
|
||||
|
@ -16,5 +15,4 @@ void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n); //指定引脚外部中
|
|||
#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
|
||||
#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
|
||||
|
||||
|
||||
#endif //__SWM320_EXTI_H__
|
||||
|
|
|
@ -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擦除
|
||||
|
@ -57,7 +55,7 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
|
|||
{
|
||||
__disable_irq();
|
||||
|
||||
IAP_Flash_Write(addr, (uint32_t)buff, count/4);
|
||||
IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
|
||||
|
||||
IAP_Cache_Reset();
|
||||
|
||||
|
@ -74,7 +72,7 @@ void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
|
|||
void Flash_Param_at_xMHz(uint32_t x)
|
||||
{
|
||||
__disable_irq();
|
||||
switch(x)
|
||||
switch (x)
|
||||
{
|
||||
case 30:
|
||||
IAP_Flash_Param(0x489, 0xabf41f25);
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
#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__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_gpio.c
|
||||
* 功能说明: SWM320单片机的通用输入输出功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_gpio.c
|
||||
* 功能说明: SWM320单片机的通用输入输出功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -21,27 +21,26 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_gpio.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_Init()
|
||||
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t dir 引脚方向,0 输入 1 输出
|
||||
* uint32_t pull_up 上拉电阻,0 关闭上拉 1 开启上拉
|
||||
* uint32_t pull_down 下拉电阻,0 关闭下拉 1 开启下拉
|
||||
* 输 出: 无
|
||||
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
|
||||
* 函数名称: GPIO_Init()
|
||||
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t dir 引脚方向,0 输入 1 输出
|
||||
* uint32_t pull_up 上拉电阻,0 关闭上拉 1 开启上拉
|
||||
* uint32_t pull_down 下拉电阻,0 关闭下拉 1 开启下拉
|
||||
* 输 出: 无
|
||||
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
|
||||
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
|
||||
{
|
||||
switch((uint32_t)GPIOx)
|
||||
switch ((uint32_t)GPIOx)
|
||||
{
|
||||
case ((uint32_t)GPIOA):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
|
||||
|
||||
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPIOA->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -50,7 +49,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPIOA->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_up == 1)
|
||||
if (pull_up == 1)
|
||||
PORT->PORTA_PULLU |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTA_PULLU &= ~(0x01 << n);
|
||||
|
@ -59,8 +58,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
case ((uint32_t)GPIOB):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
|
||||
|
||||
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPIOB->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -69,7 +68,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPIOB->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_down == 1)
|
||||
if (pull_down == 1)
|
||||
PORT->PORTB_PULLD |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTB_PULLD &= ~(0x01 << n);
|
||||
|
@ -78,8 +77,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
case ((uint32_t)GPIOC):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
|
||||
|
||||
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPIOC->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -88,7 +87,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPIOC->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_up == 1)
|
||||
if (pull_up == 1)
|
||||
PORT->PORTC_PULLU |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTC_PULLU &= ~(0x01 << n);
|
||||
|
@ -97,8 +96,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
case ((uint32_t)GPIOM):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
|
||||
|
||||
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPIOM->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -107,7 +106,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPIOM->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_up == 1)
|
||||
if (pull_up == 1)
|
||||
PORT->PORTM_PULLU |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTM_PULLU &= ~(0x01 << n);
|
||||
|
@ -116,8 +115,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
case ((uint32_t)GPION):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
|
||||
|
||||
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPION->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -126,7 +125,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPION->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_down == 1)
|
||||
if (pull_down == 1)
|
||||
PORT->PORTN_PULLD |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTN_PULLD &= ~(0x01 << n);
|
||||
|
@ -135,8 +134,8 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
case ((uint32_t)GPIOP):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
|
||||
|
||||
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if(dir == 1)
|
||||
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能,数字输入开启
|
||||
if (dir == 1)
|
||||
{
|
||||
GPIOP->DIR |= (0x01 << n);
|
||||
}
|
||||
|
@ -145,7 +144,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
GPIOP->DIR &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
if(pull_up == 1)
|
||||
if (pull_up == 1)
|
||||
PORT->PORTP_PULLU |= (0x01 << n);
|
||||
else
|
||||
PORT->PORTP_PULLU &= ~(0x01 << n);
|
||||
|
@ -154,67 +153,67 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_SetBit()
|
||||
* 功能说明: 将参数指定的引脚电平置高
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_SetBit()
|
||||
* 功能说明: 将参数指定的引脚电平置高
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->DATA |= (0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_ClrBit()
|
||||
* 功能说明: 将参数指定的引脚电平置低
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_ClrBit()
|
||||
* 功能说明: 将参数指定的引脚电平置低
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->DATA &= ~(0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_InvBit()
|
||||
* 功能说明: 将参数指定的引脚电平反转
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_InvBit()
|
||||
* 功能说明: 将参数指定的引脚电平反转
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
GPIOx->DATA ^= (0x01 << n);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_GetBit()
|
||||
* 功能说明: 读取参数指定的引脚的电平状态
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_GetBit()
|
||||
* 功能说明: 读取参数指定的引脚的电平状态
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
return ((GPIOx->DATA >> n) & 0x01);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_SetBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_SetBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -224,15 +223,15 @@ void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_ClrBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_ClrBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -242,15 +241,15 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_InvBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_InvBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -260,16 +259,16 @@ void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_GetBits()
|
||||
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
|
||||
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
|
||||
* 注意事项: 无
|
||||
* 函数名称: GPIO_GetBits()
|
||||
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
|
||||
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -279,54 +278,54 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicSetBit()
|
||||
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicSetBit()
|
||||
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1;
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicClrBit()
|
||||
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicClrBit()
|
||||
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0;
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 0;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicInvBit()
|
||||
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicInvBit()
|
||||
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
|
||||
{
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4));
|
||||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4));
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicSetBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicSetBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -338,15 +337,15 @@ void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicClrBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicClrBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
@ -358,15 +357,15 @@ void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: GPIO_AtomicInvBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
* 函数名称: GPIO_AtomicInvBits()
|
||||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||||
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
||||
* 输 出: 无
|
||||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||||
******************************************************************************************************************************************/
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
|
|
|
@ -1,24 +1,22 @@
|
|||
#ifndef __SWM320_GPIO_H__
|
||||
#define __SWM320_GPIO_H__
|
||||
|
||||
void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
|
||||
|
||||
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
|
||||
|
||||
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置高
|
||||
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平置低
|
||||
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n); //将参数指定的引脚电平反转
|
||||
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
|
||||
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
|
||||
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
|
||||
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
|
||||
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
|
||||
|
||||
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n);
|
||||
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n);
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n);
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
|
||||
void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置低
|
||||
void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平反转
|
||||
uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
|
||||
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
|
||||
void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
|
||||
void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
|
||||
uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
|
||||
|
||||
void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n);
|
||||
void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n);
|
||||
void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n);
|
||||
void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
|
||||
|
||||
#endif //__SWM320_GPIO_H__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_i2c.c
|
||||
* 功能说明: SWM320单片机的I2C串行接口功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_i2c.c
|
||||
* 功能说明: SWM320单片机的I2C串行接口功能驱动库
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -22,16 +22,16 @@
|
|||
#include "SWM320_i2c.h"
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Init()
|
||||
* 功能说明: I2C初始化
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 模块只能工作于主机模式
|
||||
* 函数名称: I2C_Init()
|
||||
* 功能说明: I2C初始化
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 模块只能工作于主机模式
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
||||
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)I2Cx)
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
|
||||
|
@ -42,20 +42,20 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
break;
|
||||
}
|
||||
|
||||
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
|
||||
I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
|
||||
|
||||
if(initStruct->Master == 1)
|
||||
if (initStruct->Master == 1)
|
||||
{
|
||||
I2Cx->CLKDIV = SystemCoreClock/5/initStruct->MstClk;
|
||||
I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
|
||||
|
||||
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
|
||||
I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
|
||||
I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
|
||||
I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
|
||||
|
||||
switch((uint32_t)I2Cx)
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if(initStruct->MstIEn)
|
||||
if (initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if(initStruct->MstIEn)
|
||||
if (initStruct->MstIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
(initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
|
||||
(initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
|
||||
|
||||
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
|
||||
I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
|
||||
I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
|
||||
I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
|
||||
I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
|
||||
|
@ -96,10 +96,10 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
|
||||
((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
|
||||
|
||||
switch((uint32_t)I2Cx)
|
||||
switch ((uint32_t)I2Cx)
|
||||
{
|
||||
case ((uint32_t)I2C0):
|
||||
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
|
@ -111,7 +111,7 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)I2C1):
|
||||
if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
|
||||
initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(I2C1_IRQn);
|
||||
|
@ -126,90 +126,94 @@ void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: I2C_Open()
|
||||
* 功能说明: I2C打开,允许收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: I2C_Open()
|
||||
* 功能说明: I2C打开,允许收发
|
||||
* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void I2C_Open(I2C_TypeDef * I2Cx)
|
||||
void I2C_Open(I2C_TypeDef *I2Cx)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: 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(); //等待发送完成
|
||||
(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(); //等待发送完成
|
||||
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)
|
||||
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(); //等待发送完成
|
||||
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(); //等待接收完成
|
||||
while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
|
||||
__NOP(); //等待接收完成
|
||||
|
||||
return I2Cx->MSTDAT;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_I2C_H__
|
||||
#define __SWM320_I2C_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Master; //1 主机模式
|
||||
uint8_t Addr7b; //1 7位地址 0 10位地址
|
||||
|
||||
|
@ -17,15 +18,14 @@ typedef struct {
|
|||
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__
|
||||
|
|
|
@ -31,9 +31,9 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
|
||||
void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)LCDx)
|
||||
switch ((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
|
||||
|
@ -54,13 +54,15 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
|
|||
|
||||
LCDx->IE = 1;
|
||||
LCDx->IF = 1; //清除标志
|
||||
if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
|
||||
else LCD_INTDis(LCDx);
|
||||
if (initStruct->IntEOTEn)
|
||||
LCD_INTEn(LCDx);
|
||||
else
|
||||
LCD_INTDis(LCDx);
|
||||
|
||||
switch((uint32_t)LCDx)
|
||||
switch ((uint32_t)LCDx)
|
||||
{
|
||||
case ((uint32_t)LCD):
|
||||
if(initStruct->IntEOTEn)
|
||||
if (initStruct->IntEOTEn)
|
||||
{
|
||||
NVIC_EnableIRQ(LCD_IRQn);
|
||||
}
|
||||
|
@ -79,7 +81,7 @@ 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);
|
||||
}
|
||||
|
@ -91,7 +93,7 @@ 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;
|
||||
}
|
||||
|
@ -103,7 +105,7 @@ uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTEn(LCD_TypeDef * LCDx)
|
||||
void LCD_INTEn(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->IM = 0;
|
||||
}
|
||||
|
@ -115,7 +117,7 @@ void LCD_INTEn(LCD_TypeDef * LCDx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTDis(LCD_TypeDef * LCDx)
|
||||
void LCD_INTDis(LCD_TypeDef *LCDx)
|
||||
{
|
||||
LCDx->IM = 1;
|
||||
}
|
||||
|
@ -127,7 +129,7 @@ void LCD_INTDis(LCD_TypeDef * LCDx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void LCD_INTClr(LCD_TypeDef * LCDx)
|
||||
void LCD_INTClr(LCD_TypeDef *LCDx)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -1,27 +1,26 @@
|
|||
#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_1DOTCLK 0 //1个DOTCLK
|
||||
#define LCD_HSYNC_2DOTCLK 1
|
||||
#define LCD_HSYNC_3DOTCLK 2
|
||||
#define LCD_HSYNC_4DOTCLK 3
|
||||
|
@ -59,15 +58,13 @@ typedef struct {
|
|||
#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_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_INTEn(LCD_TypeDef *LCDx);
|
||||
void LCD_INTDis(LCD_TypeDef *LCDx);
|
||||
void LCD_INTClr(LCD_TypeDef *LCDx);
|
||||
uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
|
||||
|
||||
#endif //__SWM320_LCD_H__
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/******************************************************************************************************************************************
|
||||
* 文件名称: SWM320_norflash.c
|
||||
* 功能说明: SWM320单片机的NOR Flash驱动程序
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
* 文件名称: SWM320_norflash.c
|
||||
* 功能说明: SWM320单片机的NOR Flash驱动程序
|
||||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||||
* 注意事项:
|
||||
* 版本日期: V1.1.0 2017年10月25日
|
||||
* 升级记录:
|
||||
*
|
||||
*
|
||||
*******************************************************************************************************************************************
|
||||
|
@ -21,28 +21,30 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_norflash.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Init()
|
||||
* 功能说明: NOR Flash控制器初始化
|
||||
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_Init()
|
||||
* 功能说明: NOR Flash控制器初始化
|
||||
* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
|
||||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void NORFL_Init(NORFL_InitStructure * initStruct)
|
||||
void NORFL_Init(NORFL_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do {
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do
|
||||
{
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
for (i = 0; i < 1000; i++)
|
||||
__NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while(0);
|
||||
} while (0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
|
||||
|
||||
|
@ -51,19 +53,23 @@ void NORFL_Init(NORFL_InitStructure * initStruct)
|
|||
(initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
|
||||
|
||||
NORFLC->IE = 3;
|
||||
NORFLC->IF = 3; // 清除中断标志
|
||||
if(initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
|
||||
else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
|
||||
if(initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
NORFLC->IF = 3; // 清除中断标志
|
||||
if (initStruct->OperFinishIEn)
|
||||
NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
|
||||
else
|
||||
NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
|
||||
if (initStruct->OperTimeoutIEn)
|
||||
NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
else
|
||||
NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_ChipErase()
|
||||
* 功能说明: NOR Flash整片擦除
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_ChipErase()
|
||||
* 功能说明: NOR Flash整片擦除
|
||||
* 输 入: 无
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_ChipErase(void)
|
||||
{
|
||||
|
@ -71,11 +77,14 @@ uint32_t NORFL_ChipErase(void)
|
|||
|
||||
NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
|
@ -83,11 +92,11 @@ uint32_t NORFL_ChipErase(void)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_SectorErase()
|
||||
* 功能说明: NOR Flash扇区擦除
|
||||
* 输 入: uint32_t addr 要擦除扇区的起始地址
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
||||
* 函数名称: NORFL_SectorErase()
|
||||
* 功能说明: NOR Flash扇区擦除
|
||||
* 输 入: uint32_t addr 要擦除扇区的起始地址
|
||||
* 输 出: uint32_t 0 擦除成功 1 擦除超时
|
||||
* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_SectorErase(uint32_t addr)
|
||||
{
|
||||
|
@ -96,11 +105,14 @@ uint32_t NORFL_SectorErase(uint32_t addr)
|
|||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
|
@ -108,12 +120,12 @@ uint32_t NORFL_SectorErase(uint32_t addr)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Write()
|
||||
* 功能说明: NOR Flash写
|
||||
* 输 入: uint32_t addr 数据要写入的地址
|
||||
* uint32_t data 要写入的数据
|
||||
* 输 出: uint32_t 0 写入成功 1 写入超时
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入
|
||||
* 函数名称: NORFL_Write()
|
||||
* 功能说明: NOR Flash写
|
||||
* 输 入: uint32_t addr 数据要写入的地址
|
||||
* uint32_t data 要写入的数据
|
||||
* 输 出: uint32_t 0 写入成功 1 写入超时
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_Write(uint32_t addr, uint32_t data)
|
||||
{
|
||||
|
@ -122,11 +134,14 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
|
|||
NORFLC->ADDR = addr;
|
||||
NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
|
||||
|
||||
while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
|
||||
while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
|
||||
((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
|
||||
__NOP();
|
||||
|
||||
if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
|
||||
else res = 1;
|
||||
if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
|
||||
res = 0;
|
||||
else
|
||||
res = 1;
|
||||
|
||||
NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
|
||||
|
||||
|
@ -134,11 +149,11 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_Read()
|
||||
* 功能说明: NOR Flash读
|
||||
* 输 入: uint32_t addr 数据要读出的地址
|
||||
* 输 出: uint32_t 读出的数据
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出
|
||||
* 函数名称: NORFL_Read()
|
||||
* 功能说明: NOR Flash读
|
||||
* 输 入: uint32_t addr 数据要读出的地址
|
||||
* 输 出: uint32_t 读出的数据
|
||||
* 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t NORFL_Read(uint32_t addr)
|
||||
{
|
||||
|
@ -149,11 +164,11 @@ uint32_t NORFL_Read(uint32_t addr)
|
|||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: NORFL_ReadID()
|
||||
* 功能说明: NOR Flash读ID
|
||||
* 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同
|
||||
* 输 出: uint16_t 读取到的ID
|
||||
* 注意事项: 无
|
||||
* 函数名称: NORFL_ReadID()
|
||||
* 功能说明: NOR Flash读ID
|
||||
* 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同
|
||||
* 输 出: uint16_t 读取到的ID
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint16_t NORFL_ReadID(uint32_t id_addr)
|
||||
{
|
||||
|
@ -166,7 +181,7 @@ uint16_t NORFL_ReadID(uint32_t id_addr)
|
|||
|
||||
id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
|
||||
|
||||
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
|
||||
NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
|
||||
|
||||
return id;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_NORFLASH_H__
|
||||
#define __SWM320_NORFLASH_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t DataWidth; // 8、16
|
||||
|
||||
uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
|
||||
|
@ -11,23 +12,18 @@ typedef struct {
|
|||
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
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_port.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: PORT_Init()
|
||||
* 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
|
||||
|
@ -35,108 +34,108 @@
|
|||
******************************************************************************************************************************************/
|
||||
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
|
||||
{
|
||||
switch((uint32_t)PORTx)
|
||||
switch ((uint32_t)PORTx)
|
||||
{
|
||||
case ((uint32_t)PORTA):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTA_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTA_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTA_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTA_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTA_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTA_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTA_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTA_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTA_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTA_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTA_INEN &= ~(0x01 << n);
|
||||
PORT->PORTA_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTB):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTB_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTB_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTB_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTB_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTB_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTB_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTB_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTB_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTB_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTB_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTB_INEN &= ~(0x01 << n);
|
||||
PORT->PORTB_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTC):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTC_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTC_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTC_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTC_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTC_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTC_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTC_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTC_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
PORT->PORTC_SEL &= ~(0x03 << (n*2));
|
||||
PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTC_SEL &= ~(0x03 << (n * 2));
|
||||
PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n * 2);
|
||||
|
||||
PORT->PORTC_INEN &= ~(0x01 << n);
|
||||
PORT->PORTC_INEN |= (digit_in_en << n);
|
||||
break;
|
||||
|
||||
case ((uint32_t)PORTM):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTM_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTM_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTM_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTM_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTM_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTM_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTM_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTM_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTM_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTM_MUX2 |= (func-100) << ((n-12)*5);
|
||||
PORT->PORTM_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTM_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
else if(n < PIN24)
|
||||
else if (n < PIN24)
|
||||
{
|
||||
PORT->PORTM_MUX3 &= ~(0x1F << ((n-18)*5));
|
||||
PORT->PORTM_MUX3 |= (func-100) << ((n-18)*5);
|
||||
PORT->PORTM_MUX3 &= ~(0x1F << ((n - 18) * 5));
|
||||
PORT->PORTM_MUX3 |= (func - 100) << ((n - 18) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTM_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTM_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTM_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
PORT->PORTM_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTM_INEN &= ~(0x01 << n);
|
||||
|
@ -144,34 +143,34 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
|
|||
break;
|
||||
|
||||
case ((uint32_t)PORTN):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTN_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTN_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTN_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTN_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTN_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTN_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTN_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTN_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTN_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTN_MUX2 |= (func-100) << ((n-12)*5);
|
||||
PORT->PORTN_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTN_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTN_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTN_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTN_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
PORT->PORTN_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTN_INEN &= ~(0x01 << n);
|
||||
|
@ -179,39 +178,39 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
|
|||
break;
|
||||
|
||||
case ((uint32_t)PORTP):
|
||||
if(func > 99)
|
||||
if (func > 99)
|
||||
{
|
||||
if(n < PIN6)
|
||||
if (n < PIN6)
|
||||
{
|
||||
PORT->PORTP_MUX0 &= ~(0x1F << (n*5));
|
||||
PORT->PORTP_MUX0 |= (func-100) << (n*5);
|
||||
PORT->PORTP_MUX0 &= ~(0x1F << (n * 5));
|
||||
PORT->PORTP_MUX0 |= (func - 100) << (n * 5);
|
||||
}
|
||||
else if(n < PIN12)
|
||||
else if (n < PIN12)
|
||||
{
|
||||
PORT->PORTP_MUX1 &= ~(0x1F << ((n-6)*5));
|
||||
PORT->PORTP_MUX1 |= (func-100) << ((n-6)*5);
|
||||
PORT->PORTP_MUX1 &= ~(0x1F << ((n - 6) * 5));
|
||||
PORT->PORTP_MUX1 |= (func - 100) << ((n - 6) * 5);
|
||||
}
|
||||
else if(n < PIN18)
|
||||
else if (n < PIN18)
|
||||
{
|
||||
PORT->PORTP_MUX2 &= ~(0x1F << ((n-12)*5));
|
||||
PORT->PORTP_MUX2 |= (func-100) << ((n-12)*5);
|
||||
PORT->PORTP_MUX2 &= ~(0x1F << ((n - 12) * 5));
|
||||
PORT->PORTP_MUX2 |= (func - 100) << ((n - 12) * 5);
|
||||
}
|
||||
else if(n < PIN24)
|
||||
else if (n < PIN24)
|
||||
{
|
||||
PORT->PORTP_MUX3 &= ~(0x1F << ((n-18)*5));
|
||||
PORT->PORTP_MUX3 |= (func-100) << ((n-18)*5);
|
||||
PORT->PORTP_MUX3 &= ~(0x1F << ((n - 18) * 5));
|
||||
PORT->PORTP_MUX3 |= (func - 100) << ((n - 18) * 5);
|
||||
}
|
||||
}
|
||||
|
||||
if(n < 16)
|
||||
if (n < 16)
|
||||
{
|
||||
PORT->PORTP_SEL0 &= ~(0x03 << (n*2));
|
||||
PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n*2);
|
||||
PORT->PORTP_SEL0 &= ~(0x03 << (n * 2));
|
||||
PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT->PORTP_SEL1 &= ~(0x03 << ((n-16)*2));
|
||||
PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
|
||||
PORT->PORTP_SEL1 &= ~(0x03 << ((n - 16) * 2));
|
||||
PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
|
||||
}
|
||||
|
||||
PORT->PORTP_INEN &= ~(0x01 << n);
|
||||
|
|
|
@ -54,7 +54,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define PORTA_PIN12_GPIO 0
|
||||
#define PORTA_PIN12_ADC0_IN4 3
|
||||
|
||||
|
||||
#define PORTB_PIN0_GPIO 0
|
||||
#define PORTB_PIN0_FUNMUX 1
|
||||
#define PORTB_PIN0_SD_DETECT 2
|
||||
|
@ -104,7 +103,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
|
||||
#define PORTB_PIN12_GPIO 0
|
||||
|
||||
|
||||
#define PORTC_PIN0_GPIO 0
|
||||
#define PORTC_PIN0_FUNMUX 1
|
||||
|
||||
|
@ -133,7 +131,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define PORTC_PIN7_FUNMUX 1
|
||||
#define PORTC_PIN7_ADC1_IN0 3
|
||||
|
||||
|
||||
#define PORTM_PIN0_GPIO 0
|
||||
#define PORTM_PIN0_FUNMUX 1
|
||||
#define PORTM_PIN0_NORFL_D15 2
|
||||
|
@ -222,7 +219,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define PORTM_PIN21_FUNMUX 1
|
||||
#define PORTM_PIN21_SDRAM_CKE 2
|
||||
|
||||
|
||||
#define PORTN_PIN0_GPIO 0
|
||||
#define PORTN_PIN0_FUNMUX 1
|
||||
#define PORTN_PIN0_LCD_D0 2
|
||||
|
@ -308,7 +304,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define PORTN_PIN19_LCD_WR 2
|
||||
#define PORTN_PIN19_LCD_HSYNC 2
|
||||
|
||||
|
||||
#define PORTP_PIN0_GPIO 0
|
||||
#define PORTP_PIN0_FUNMUX 1
|
||||
#define PORTP_PIN0_NORFL_A0 2
|
||||
|
@ -423,8 +418,6 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define PORTP_PIN23_FUNMUX 1
|
||||
#define PORTP_PIN23_NORFL_A23 2
|
||||
|
||||
|
||||
|
||||
/* 下面宏定义的取值全部在正确值的基础上“加100”,以区分上面宏定义的值,从而方便库函数的编写*/
|
||||
/* 下面这些值是偶数编号引脚的功能取值,如PIN0、PIN2、... */
|
||||
#define FUNMUX0_UART0_RXD 100
|
||||
|
@ -478,5 +471,4 @@ void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);
|
|||
#define FUNMUX1_UART2_RTS 123
|
||||
#define FUNMUX1_UART3_RTS 124
|
||||
|
||||
|
||||
#endif //__SWM320_PORT_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_pwm.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: PWM_Init()
|
||||
* 功能说明: PWM初始化
|
||||
|
@ -30,7 +29,7 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
|
||||
void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t bit_offset = 0;
|
||||
|
||||
|
@ -57,43 +56,43 @@ void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
|
|||
|
||||
PWMG->IM = 0x00000000;
|
||||
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
case ((uint32_t)PWM0):
|
||||
bit_offset = 0;
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
case ((uint32_t)PWM1):
|
||||
bit_offset = 2;
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
case ((uint32_t)PWM2):
|
||||
bit_offset = 4;
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
case ((uint32_t)PWM3):
|
||||
bit_offset = 6;
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
case ((uint32_t)PWM4):
|
||||
bit_offset = 8;
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
case ((uint32_t)PWM5):
|
||||
bit_offset = 10;
|
||||
break;
|
||||
}
|
||||
|
||||
PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))); //清除中断标志
|
||||
PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13)));
|
||||
PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset+1)) |
|
||||
(initStruct->HEndAIEn << (bit_offset+12)) | (initStruct->HEndBIEn << (bit_offset+13));
|
||||
PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))); //清除中断标志
|
||||
PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13)));
|
||||
PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset + 1)) |
|
||||
(initStruct->HEndAIEn << (bit_offset + 12)) | (initStruct->HEndBIEn << (bit_offset + 13));
|
||||
|
||||
if(initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
|
||||
if (initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(PWM_IRQn);
|
||||
}
|
||||
else if((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))))) == 0)
|
||||
else if ((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))))) == 0)
|
||||
{
|
||||
NVIC_DisableIRQ(PWM_IRQn);
|
||||
}
|
||||
|
@ -108,31 +107,31 @@ void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
|
||||
void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
case ((uint32_t)PWM0):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
case ((uint32_t)PWM1):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
case ((uint32_t)PWM2):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
case ((uint32_t)PWM3):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
case ((uint32_t)PWM4):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
case ((uint32_t)PWM5):
|
||||
PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
|
||||
break;
|
||||
}
|
||||
|
@ -147,31 +146,31 @@ void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
|
||||
void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
case ((uint32_t)PWM0):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
case ((uint32_t)PWM1):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
case ((uint32_t)PWM2):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
case ((uint32_t)PWM3):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
case ((uint32_t)PWM4):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
case ((uint32_t)PWM5):
|
||||
PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
|
||||
break;
|
||||
}
|
||||
|
@ -186,11 +185,11 @@ void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle)
|
||||
void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
|
||||
{
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
PWMx->PERA = cycle;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
PWMx->PERB = cycle;
|
||||
}
|
||||
|
||||
|
@ -202,13 +201,13 @@ void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle)
|
|||
* 输 出: uint16_t 获取到的周期值
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
uint16_t cycle = 0;
|
||||
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
cycle = PWMx->PERA;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
cycle = PWMx->PERB;
|
||||
|
||||
return cycle;
|
||||
|
@ -223,11 +222,11 @@ uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
|
||||
void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
|
||||
{
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
PWMx->HIGHA = hduty;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
PWMx->HIGHB = hduty;
|
||||
}
|
||||
|
||||
|
@ -239,13 +238,13 @@ void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
|
|||
* 输 出: uint16_t 获取到的高电平时长
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
uint16_t hduty = 0;
|
||||
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
hduty = PWMx->HIGHA;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
hduty = PWMx->HIGHB;
|
||||
|
||||
return hduty;
|
||||
|
@ -260,11 +259,11 @@ uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone)
|
||||
void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
|
||||
{
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
PWMx->DZA = deadzone;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
PWMx->DZB = deadzone;
|
||||
}
|
||||
|
||||
|
@ -276,19 +275,18 @@ void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone)
|
|||
* 输 出: uint8_t 获取到的死区时长
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
uint8_t deadzone = 0;
|
||||
|
||||
if(chn == PWM_CH_A)
|
||||
if (chn == PWM_CH_A)
|
||||
deadzone = PWMx->DZA;
|
||||
else if(chn == PWM_CH_B)
|
||||
else if (chn == PWM_CH_B)
|
||||
deadzone = PWMx->DZB;
|
||||
|
||||
return deadzone;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: PWM_IntNCycleEn()
|
||||
* 功能说明: 新周期开始中断使能
|
||||
|
@ -297,38 +295,50 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -341,38 +351,50 @@ void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -385,38 +407,50 @@ void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -429,47 +463,58 @@ void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
uint32_t int_stat = 0;
|
||||
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
|
||||
break;
|
||||
}
|
||||
|
||||
return int_stat;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: PWM_IntHEndEn()
|
||||
* 功能说明: 高电平结束中断使能
|
||||
|
@ -478,38 +523,50 @@ uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
|
||||
else PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
|
||||
else
|
||||
PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -522,38 +579,50 @@ void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
|
||||
else PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
|
||||
else
|
||||
PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -566,38 +635,50 @@ void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
|
||||
else PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
|
||||
else
|
||||
PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -610,40 +691,52 @@ void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
|
|||
* 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn)
|
||||
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
|
||||
{
|
||||
uint32_t int_stat = 0;
|
||||
|
||||
switch((uint32_t)PWMx)
|
||||
switch ((uint32_t)PWMx)
|
||||
{
|
||||
case((uint32_t)PWM0):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
|
||||
case ((uint32_t)PWM0):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM1):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
|
||||
case ((uint32_t)PWM1):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM2):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
|
||||
case ((uint32_t)PWM2):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM3):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
|
||||
case ((uint32_t)PWM3):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM4):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
|
||||
case ((uint32_t)PWM4):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
|
||||
break;
|
||||
|
||||
case((uint32_t)PWM5):
|
||||
if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
|
||||
else int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
|
||||
case ((uint32_t)PWM5):
|
||||
if (chn == PWM_CH_A)
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
|
||||
else
|
||||
int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_PWM_H__
|
||||
#define __SWM320_PWM_H__
|
||||
|
||||
typedef struct {
|
||||
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
|
||||
|
@ -33,26 +34,24 @@ typedef struct {
|
|||
#define PWM_CH_A 0
|
||||
#define PWM_CH_B 1
|
||||
|
||||
void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct); //PWM初始化
|
||||
void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始PWM输出
|
||||
void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
|
||||
|
||||
void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct); //PWM初始化
|
||||
void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始PWM输出
|
||||
void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
|
||||
|
||||
void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle); //设置周期
|
||||
uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn); //获取周期
|
||||
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
|
||||
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn); //获取高电平时长
|
||||
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
|
||||
uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn); //获取死区时长
|
||||
|
||||
void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断使能
|
||||
void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断禁能
|
||||
void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断标志清除
|
||||
uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn); //新周期开始中断是否发生
|
||||
void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断使能
|
||||
void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断禁能
|
||||
void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断标志清除
|
||||
uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn); //高电平结束中断是否发生
|
||||
void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle); //设置周期
|
||||
uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn); //获取周期
|
||||
void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
|
||||
uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn); //获取高电平时长
|
||||
void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
|
||||
uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn); //获取死区时长
|
||||
|
||||
void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断使能
|
||||
void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断禁能
|
||||
void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断标志清除
|
||||
uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断是否发生
|
||||
void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断使能
|
||||
void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断禁能
|
||||
void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断标志清除
|
||||
uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断是否发生
|
||||
|
||||
#endif //__SWM320_PWM_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_rtc.h"
|
||||
|
||||
|
||||
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: RTC_Init()
|
||||
|
@ -31,7 +30,7 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
|
||||
void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
|
||||
{
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
|
||||
|
||||
|
@ -42,7 +41,8 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
|
|||
|
||||
RTC_Stop(RTCx);
|
||||
|
||||
while(RTCx->CFGABLE == 0);
|
||||
while (RTCx->CFGABLE == 0)
|
||||
;
|
||||
|
||||
RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
|
||||
(initStruct->Minute << RTC_MINSEC_MIN_Pos);
|
||||
|
@ -61,7 +61,7 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
|
|||
RTCx->IE = (initStruct->SecondIEn << RTC_IE_SEC_Pos) |
|
||||
(initStruct->MinuteIEn << RTC_IE_MIN_Pos);
|
||||
|
||||
if(initStruct->SecondIEn | initStruct->MinuteIEn)
|
||||
if (initStruct->SecondIEn | initStruct->MinuteIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(RTC_IRQn);
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_Start(RTC_TypeDef * RTCx)
|
||||
void RTC_Start(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->EN = 1;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ void RTC_Start(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_Stop(RTC_TypeDef * RTCx)
|
||||
void RTC_Stop(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->EN = 0;
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ void RTC_Stop(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
|
||||
void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
|
||||
{
|
||||
dateTime->Year = RTCx->YEAR + 1901;
|
||||
dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos;
|
||||
|
@ -122,9 +122,10 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
|
||||
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
|
||||
{
|
||||
while(RTCx->CFGABLE == 0);
|
||||
while (RTCx->CFGABLE == 0)
|
||||
;
|
||||
|
||||
RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
|
||||
(alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
|
||||
|
@ -133,13 +134,15 @@ void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
|
|||
(alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
|
||||
|
||||
RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
|
||||
while(RTCx->LOAD & RTC_LOAD_ALARM_Msk);
|
||||
while (RTCx->LOAD & RTC_LOAD_ALARM_Msk)
|
||||
;
|
||||
|
||||
RTCx->IF = (1 << RTC_IF_ALARM_Pos);
|
||||
RTCx->IE &= ~RTC_IE_ALARM_Msk;
|
||||
RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
|
||||
|
||||
if(alarmStruct->AlarmIEn) NVIC_EnableIRQ(RTC_IRQn);
|
||||
if (alarmStruct->AlarmIEn)
|
||||
NVIC_EnableIRQ(RTC_IRQn);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -156,20 +159,23 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
|
|||
uint32_t i, cnt = 0;
|
||||
const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
for(i = 1; i < month; i++) cnt += daysOfMonth[i];
|
||||
for (i = 1; i < month; i++)
|
||||
cnt += daysOfMonth[i];
|
||||
|
||||
cnt += date;
|
||||
|
||||
if((year%4 == 0) && ((year%100 != 0) || (year%400 == 0)) && (month >= 3)) cnt += 1;
|
||||
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3))
|
||||
cnt += 1;
|
||||
|
||||
cnt += (year - 1901) * 365;
|
||||
|
||||
for(i = 1901; i < year; i++)
|
||||
for (i = 1901; i < year; i++)
|
||||
{
|
||||
if((i%4 == 0) && ((i%100 != 0) || (i%400 == 0))) cnt += 1;
|
||||
if ((i % 4 == 0) && ((i % 100 != 0) || (i % 400 == 0)))
|
||||
cnt += 1;
|
||||
}
|
||||
|
||||
return (cnt+1) % 7;
|
||||
return (cnt + 1) % 7;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -179,7 +185,7 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntSecondEn(RTC_TypeDef * RTCx)
|
||||
void RTC_IntSecondEn(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE |= (1 << RTC_IE_SEC_Pos);
|
||||
}
|
||||
|
@ -191,7 +197,7 @@ void RTC_IntSecondEn(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntSecondDis(RTC_TypeDef * RTCx)
|
||||
void RTC_IntSecondDis(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE &= ~(1 << RTC_IE_SEC_Pos);
|
||||
}
|
||||
|
@ -203,7 +209,7 @@ void RTC_IntSecondDis(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntSecondClr(RTC_TypeDef * RTCx)
|
||||
void RTC_IntSecondClr(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IF = (1 << RTC_IF_SEC_Pos);
|
||||
}
|
||||
|
@ -215,7 +221,7 @@ void RTC_IntSecondClr(RTC_TypeDef * RTCx)
|
|||
* 输 出: uint32_t 1 秒中断发生 0 秒中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
|
||||
{
|
||||
return (RTCx->IF & RTC_IF_SEC_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -227,7 +233,7 @@ uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
|
||||
void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE |= (1 << RTC_IE_MIN_Pos);
|
||||
}
|
||||
|
@ -239,7 +245,7 @@ void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
|
||||
void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE &= ~(1 << RTC_IE_MIN_Pos);
|
||||
}
|
||||
|
@ -251,7 +257,7 @@ void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
|
||||
void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IF = (1 << RTC_IF_MIN_Pos);
|
||||
}
|
||||
|
@ -263,7 +269,7 @@ void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
|
|||
* 输 出: uint32_t 1 分中断发生 0 分中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
|
||||
{
|
||||
return (RTCx->IF & RTC_IF_MIN_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -275,7 +281,7 @@ uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntHourEn(RTC_TypeDef * RTCx)
|
||||
void RTC_IntHourEn(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE |= (1 << RTC_IE_HOUR_Pos);
|
||||
}
|
||||
|
@ -287,7 +293,7 @@ void RTC_IntHourEn(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntHourDis(RTC_TypeDef * RTCx)
|
||||
void RTC_IntHourDis(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE &= ~(1 << RTC_IE_HOUR_Pos);
|
||||
}
|
||||
|
@ -299,7 +305,7 @@ void RTC_IntHourDis(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntHourClr(RTC_TypeDef * RTCx)
|
||||
void RTC_IntHourClr(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IF = (1 << RTC_IF_HOUR_Pos);
|
||||
}
|
||||
|
@ -311,7 +317,7 @@ void RTC_IntHourClr(RTC_TypeDef * RTCx)
|
|||
* 输 出: uint32_t 1 时中断发生 0 时中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
|
||||
{
|
||||
return (RTCx->IF & RTC_IF_HOUR_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -323,7 +329,7 @@ uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntDateEn(RTC_TypeDef * RTCx)
|
||||
void RTC_IntDateEn(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE |= (1 << RTC_IE_DATE_Pos);
|
||||
}
|
||||
|
@ -335,7 +341,7 @@ void RTC_IntDateEn(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntDateDis(RTC_TypeDef * RTCx)
|
||||
void RTC_IntDateDis(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE &= ~(1 << RTC_IE_DATE_Pos);
|
||||
}
|
||||
|
@ -347,7 +353,7 @@ void RTC_IntDateDis(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntDateClr(RTC_TypeDef * RTCx)
|
||||
void RTC_IntDateClr(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IF = (1 << RTC_IF_DATE_Pos);
|
||||
}
|
||||
|
@ -359,7 +365,7 @@ void RTC_IntDateClr(RTC_TypeDef * RTCx)
|
|||
* 输 出: uint32_t 1 日中断发生 0 日中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
|
||||
{
|
||||
return (RTCx->IF & RTC_IF_DATE_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -371,7 +377,7 @@ uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
|
||||
void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE |= (1 << RTC_IE_ALARM_Pos);
|
||||
}
|
||||
|
@ -383,7 +389,7 @@ void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
|
||||
void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IE &= ~(1 << RTC_IE_ALARM_Pos);
|
||||
}
|
||||
|
@ -395,7 +401,7 @@ void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
|
||||
void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
|
||||
{
|
||||
RTCx->IF = (1 << RTC_IF_ALARM_Pos);
|
||||
}
|
||||
|
@ -407,7 +413,7 @@ void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
|
|||
* 输 出: uint32_t 1 闹钟中断发生 0 闹钟中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx)
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx)
|
||||
{
|
||||
return (RTCx->IF & RTC_IF_ALARM_Msk) ? 1 : 0;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef __SWM320_RTC_H__
|
||||
#define __SWM320_RTC_H__
|
||||
|
||||
|
||||
#define RTC_SUN 0x01
|
||||
#define RTC_MON 0x02
|
||||
#define RTC_TUE 0x04
|
||||
|
@ -10,8 +9,8 @@
|
|||
#define RTC_FRI 0x20
|
||||
#define RTC_SAT 0x40
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint16_t Year;
|
||||
uint8_t Month; //取值1--12
|
||||
uint8_t Date; //取值1--31
|
||||
|
@ -22,7 +21,8 @@ typedef struct {
|
|||
uint8_t MinuteIEn;
|
||||
} RTC_InitStructure;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Days; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT及其或运算组合
|
||||
uint8_t Hour;
|
||||
uint8_t Minute;
|
||||
|
@ -30,7 +30,8 @@ typedef struct {
|
|||
uint8_t AlarmIEn;
|
||||
} RTC_AlarmStructure;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint16_t Year;
|
||||
uint8_t Month;
|
||||
uint8_t Date;
|
||||
|
@ -40,34 +41,33 @@ typedef struct {
|
|||
uint8_t Second;
|
||||
} RTC_DateTime;
|
||||
|
||||
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct);
|
||||
void RTC_Start(RTC_TypeDef * RTCx);
|
||||
void RTC_Stop(RTC_TypeDef * RTCx);
|
||||
void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
|
||||
void RTC_Start(RTC_TypeDef *RTCx);
|
||||
void RTC_Stop(RTC_TypeDef *RTCx);
|
||||
|
||||
void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
|
||||
void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
|
||||
|
||||
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct);
|
||||
void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
|
||||
|
||||
|
||||
void RTC_IntSecondEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntMinuteClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntHourClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntDateClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmEn(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmDis(RTC_TypeDef * RTCx);
|
||||
void RTC_IntAlarmClr(RTC_TypeDef * RTCx);
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx);
|
||||
void RTC_IntSecondEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntSecondDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntSecondClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntMinuteClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntHourClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntDateClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmEn(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmDis(RTC_TypeDef *RTCx);
|
||||
void RTC_IntAlarmClr(RTC_TypeDef *RTCx);
|
||||
uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx);
|
||||
|
||||
#endif //__SWM320_RTC_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_sdio.h"
|
||||
|
||||
|
||||
SD_CardInfo SD_cardInfo;
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -37,7 +36,7 @@ uint32_t SDIO_Init(uint32_t freq)
|
|||
uint32_t resp, resps[4];
|
||||
|
||||
SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
|
||||
if(SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
|
||||
if (SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
|
||||
SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
|
||||
else
|
||||
SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
|
||||
|
@ -57,59 +56,59 @@ uint32_t SDIO_Init(uint32_t freq)
|
|||
(calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
|
||||
(0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
|
||||
|
||||
while((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0);
|
||||
while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0)
|
||||
;
|
||||
|
||||
SDIO->IFE = 0xFFFFFFFF;
|
||||
|
||||
|
||||
SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE
|
||||
|
||||
res = SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp); //CMD8: SEND_IF_COND, 检测工作电压、检测是否支持SD 2.0
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
if(resp == 0x1AA) SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
|
||||
else SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
|
||||
if (resp == 0x1AA)
|
||||
SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
|
||||
else
|
||||
SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
|
||||
|
||||
do //ACMD41: SD_CMD_SD_APP_OP_COND
|
||||
{
|
||||
res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
if(resp != 0x120) return SD_RES_ERR; //不是SD卡,可能是MMC卡
|
||||
if (resp != 0x120)
|
||||
return SD_RES_ERR; //不是SD卡,可能是MMC卡
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
|
||||
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x40000000, SD_RESP_32b, &resp);
|
||||
if (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
|
||||
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp);
|
||||
else
|
||||
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x00000000, SD_RESP_32b, &resp);
|
||||
} while(((resp >> 31) & 0x01) == 0); //上电没完成时resp[31] == 0
|
||||
|
||||
if(((resp >> 30) & 0x01) == 1) SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
|
||||
SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
|
||||
} while (((resp >> 31) & 0x01) == 0); //上电没完成时resp[31] == 0
|
||||
|
||||
if (((resp >> 30) & 0x01) == 1)
|
||||
SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
|
||||
|
||||
SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID,获取CID
|
||||
|
||||
parseCID(resps);
|
||||
|
||||
|
||||
SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR,设置RCA
|
||||
|
||||
SD_cardInfo.RCA = resp >> 16;
|
||||
|
||||
|
||||
SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD,获取CSD
|
||||
|
||||
parseCSD(resps);
|
||||
|
||||
if(SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR; //本驱动只支持以512字节为单位的读写,所以最大读写单位必须不小于512
|
||||
|
||||
if (SD_cardInfo.CardBlockSize < 0x200)
|
||||
return SD_RES_ERR; //本驱动只支持以512字节为单位的读写,所以最大读写单位必须不小于512
|
||||
|
||||
SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
|
||||
SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
|
||||
(calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //初始化完成,SDCLK切换到高速
|
||||
|
||||
|
||||
SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: 选中卡,从Standy模式进入Transfer模式
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
|
@ -119,7 +118,6 @@ uint32_t SDIO_Init(uint32_t freq)
|
|||
|
||||
SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
|
||||
|
||||
|
||||
SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节
|
||||
|
||||
SDIO->BLK = 512;
|
||||
|
@ -140,19 +138,24 @@ uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
|
|||
uint32_t res, i;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
|
||||
|
||||
for(i = 0; i < 512/4; i++) SDIO->DATA = buff[i];
|
||||
for (i = 0; i < 512 / 4; i++)
|
||||
SDIO->DATA = buff[i];
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -172,22 +175,27 @@ uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t
|
|||
uint32_t res, i, j;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
for(i = 0; i < block_cnt; i++)
|
||||
for (i = 0; i < block_cnt; i++)
|
||||
{
|
||||
while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
|
||||
|
||||
for(j = 0; j < 512/4; j++) SDIO->DATA = buff[i*(512/4) + j];
|
||||
for (j = 0; j < 512 / 4; j++)
|
||||
SDIO->DATA = buff[i * (512 / 4) + j];
|
||||
}
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -207,16 +215,19 @@ uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t bu
|
|||
uint32_t res;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
SDIO->DMA_MEM_ADDR = (uint32_t) buff;
|
||||
SDIO->DMA_MEM_ADDR = (uint32_t)buff;
|
||||
|
||||
res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -235,19 +246,24 @@ uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
|
|||
uint32_t res, i;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
|
||||
|
||||
for(i = 0; i < 512/4; i++) buff[i] = SDIO->DATA;
|
||||
for (i = 0; i < 512 / 4; i++)
|
||||
buff[i] = SDIO->DATA;
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -267,22 +283,27 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
|
|||
uint32_t res, i, j;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
for(i = 0; i < block_cnt; i++)
|
||||
for (i = 0; i < block_cnt; i++)
|
||||
{
|
||||
while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
|
||||
|
||||
for(j = 0; j < 512/4; j++) buff[i*(512/4) + j] = SDIO->DATA;
|
||||
for (j = 0; j < 512 / 4; j++)
|
||||
buff[i * (512 / 4) + j] = SDIO->DATA;
|
||||
}
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -302,16 +323,19 @@ uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buf
|
|||
uint32_t res;
|
||||
uint32_t addr, resp;
|
||||
|
||||
if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
|
||||
else addr = block_addr * 512;
|
||||
if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
|
||||
addr = block_addr;
|
||||
else
|
||||
addr = block_addr * 512;
|
||||
|
||||
SDIO->DMA_MEM_ADDR = (uint32_t)buff;
|
||||
|
||||
res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
|
||||
if(res != SD_RES_OK)
|
||||
if (res != SD_RES_OK)
|
||||
return res;
|
||||
|
||||
while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
|
||||
while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
|
||||
__NOP();
|
||||
SDIO->IF = SDIO_IF_TRXDONE_Msk;
|
||||
|
||||
return SD_RES_OK;
|
||||
|
@ -349,15 +373,15 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
|
|||
((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) |
|
||||
(use_dma << SDIO_CMD_DMAEN_Pos);
|
||||
|
||||
while((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
|
||||
while ((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
|
||||
{
|
||||
if(SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
|
||||
if (SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
|
||||
{
|
||||
SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk;
|
||||
|
||||
return SD_RES_TIMEOUT;
|
||||
}
|
||||
else if(SDIO->IF & SDIO_IF_ERROR_Msk)
|
||||
else if (SDIO->IF & SDIO_IF_ERROR_Msk)
|
||||
{
|
||||
SDIO->IF = 0xFFFFFFFF;
|
||||
|
||||
|
@ -366,11 +390,11 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
|
|||
}
|
||||
SDIO->IF = SDIO_IF_CMDDONE_Msk;
|
||||
|
||||
if(resp_type == SD_RESP_32b)
|
||||
if (resp_type == SD_RESP_32b)
|
||||
{
|
||||
resp_data[0] = SDIO->RESP[0];
|
||||
}
|
||||
else if(resp_type == SD_RESP_128b)
|
||||
else if (resp_type == SD_RESP_128b)
|
||||
{
|
||||
//寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0],最低位的CRC被丢掉
|
||||
//读出数据时调整了顺序,将CID/CSD[127-8]存放在resp_data0-3[127-8],最低8位填充0x00
|
||||
|
@ -383,7 +407,6 @@ uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t
|
|||
return SD_RES_OK;
|
||||
}
|
||||
|
||||
|
||||
void parseCID(uint32_t CID_Tab[4])
|
||||
{
|
||||
uint8_t tmp = 0;
|
||||
|
@ -514,7 +537,7 @@ void parseCSD(uint32_t CSD_Tab[4])
|
|||
tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
|
||||
SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
|
||||
|
||||
SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) ;
|
||||
SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1);
|
||||
SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
|
||||
SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
|
||||
SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
|
||||
|
@ -580,15 +603,24 @@ uint32_t calcSDCLKDiv(uint32_t freq)
|
|||
uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
|
||||
uint32_t regdiv = 0;
|
||||
|
||||
if(clkdiv > 128) regdiv = 0x80;
|
||||
else if(clkdiv > 64) regdiv = 0x40;
|
||||
else if(clkdiv > 32) regdiv = 0x20;
|
||||
else if(clkdiv > 16) regdiv = 0x10;
|
||||
else if(clkdiv > 8) regdiv = 0x08;
|
||||
else if(clkdiv > 4) regdiv = 0x04;
|
||||
else if(clkdiv > 2) regdiv = 0x02;
|
||||
else if(clkdiv > 1) regdiv = 0x01;
|
||||
else regdiv = 0x00;
|
||||
if (clkdiv > 128)
|
||||
regdiv = 0x80;
|
||||
else if (clkdiv > 64)
|
||||
regdiv = 0x40;
|
||||
else if (clkdiv > 32)
|
||||
regdiv = 0x20;
|
||||
else if (clkdiv > 16)
|
||||
regdiv = 0x10;
|
||||
else if (clkdiv > 8)
|
||||
regdiv = 0x08;
|
||||
else if (clkdiv > 4)
|
||||
regdiv = 0x04;
|
||||
else if (clkdiv > 2)
|
||||
regdiv = 0x02;
|
||||
else if (clkdiv > 1)
|
||||
regdiv = 0x01;
|
||||
else
|
||||
regdiv = 0x00;
|
||||
|
||||
return regdiv;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef __SWM320_SDIO_H__
|
||||
#define __SWM320_SDIO_H__
|
||||
|
||||
|
||||
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
||||
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
||||
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
||||
|
@ -34,7 +33,6 @@
|
|||
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
|
||||
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
|
||||
|
||||
|
||||
#define SD_RESP_NO 0 //0 无响应
|
||||
#define SD_RESP_32b 2 //2 32位响应
|
||||
#define SD_RESP_128b 1 //1 128位响应
|
||||
|
@ -47,7 +45,6 @@
|
|||
#define SD_RES_ERR 1
|
||||
#define SD_RES_TIMEOUT 2
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t CSDStruct; // CSD structure
|
||||
|
@ -99,7 +96,6 @@ typedef struct
|
|||
__IO uint16_t ManufactDate; // Manufacturing Date
|
||||
} SD_CID;
|
||||
|
||||
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
||||
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
||||
|
@ -109,7 +105,6 @@ typedef struct
|
|||
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
||||
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SD_CSD SD_csd;
|
||||
|
@ -120,7 +115,6 @@ typedef struct
|
|||
uint8_t CardType;
|
||||
} SD_CardInfo;
|
||||
|
||||
|
||||
extern SD_CardInfo SD_cardInfo;
|
||||
|
||||
uint32_t SDIO_Init(uint32_t freq);
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SDRAM_Init(SDRAM_InitStructure * initStruct)
|
||||
void SDRAM_Init(SDRAM_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t row_n;
|
||||
|
||||
|
@ -53,19 +53,30 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
|
|||
|
||||
SDRAMC->LATCH = 0x02;
|
||||
|
||||
switch(initStruct->CellSize)
|
||||
switch (initStruct->CellSize)
|
||||
{
|
||||
case SDRAM_CELLSIZE_16Mb: row_n = 11; break;
|
||||
case SDRAM_CELLSIZE_64Mb: row_n = 12; break;
|
||||
case SDRAM_CELLSIZE_128Mb: row_n = 12; break;
|
||||
case SDRAM_CELLSIZE_256Mb: row_n = 13; break;
|
||||
default: row_n = 13; break;
|
||||
case SDRAM_CELLSIZE_16Mb:
|
||||
row_n = 11;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_64Mb:
|
||||
row_n = 12;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_128Mb:
|
||||
row_n = 12;
|
||||
break;
|
||||
case SDRAM_CELLSIZE_256Mb:
|
||||
row_n = 13;
|
||||
break;
|
||||
default:
|
||||
row_n = 13;
|
||||
break;
|
||||
}
|
||||
|
||||
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
|
||||
(((SystemCoreClock/2)/1000*64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
|
||||
(((SystemCoreClock / 2) / 1000 * 64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -82,7 +93,8 @@ void SDRAM_Enable(void)
|
|||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 100; i++) __NOP();
|
||||
for (i = 0; i < 100; i++)
|
||||
__NOP();
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -99,5 +111,6 @@ void SDRAM_Disable(void)
|
|||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 100; i++) __NOP();
|
||||
for (i = 0; i < 100; i++)
|
||||
__NOP();
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_SDRAM_H__
|
||||
#define __SWM320_SDRAM_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t CellSize; // SDRAM颗粒的容量,SDRAM_CELLSIZE_16Mb、SDRAM_CELLSIZE_64Mb、SDRAM_CELLSIZE_128Mb、SDRAM_CELLSIZE_256Mb
|
||||
uint8_t CellBank; // SDRAM颗粒有几个bank,SDRAM_CELLBANK_2、SDRAM_CELLBANK_4
|
||||
uint8_t CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
|
||||
|
@ -72,9 +73,7 @@ typedef struct {
|
|||
#define SDRAM_TRP_6 6
|
||||
#define SDRAM_TRP_7 7
|
||||
|
||||
|
||||
|
||||
void SDRAM_Init(SDRAM_InitStructure * initStruct);
|
||||
void SDRAM_Init(SDRAM_InitStructure *initStruct);
|
||||
|
||||
void SDRAM_Enable(void);
|
||||
void SDRAM_Disable(void);
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_spi.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SPI_Init()
|
||||
* 功能说明: SPI同步串行接口初始化,包括帧长度设定、时序设定、速度设定、中断设定、FIFO触发设定
|
||||
|
@ -30,9 +29,9 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
|
||||
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)SPIx)
|
||||
switch ((uint32_t)SPIx)
|
||||
{
|
||||
case ((uint32_t)SPI0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);
|
||||
|
@ -50,7 +49,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
|
|||
SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
|
||||
(initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
|
||||
(initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
|
||||
((initStruct->WordSize-1) << SPI_CTRL_SIZE_Pos) |
|
||||
((initStruct->WordSize - 1) << SPI_CTRL_SIZE_Pos) |
|
||||
(initStruct->Master << SPI_CTRL_MSTR_Pos) |
|
||||
(initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
|
||||
(0 << SPI_CTRL_SSN_H_Pos);
|
||||
|
@ -61,10 +60,10 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
|
|||
(initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
|
||||
(initStruct->TXCompleteIEn << SPI_IE_FTC_Pos);
|
||||
|
||||
switch((uint32_t)SPIx)
|
||||
switch ((uint32_t)SPIx)
|
||||
{
|
||||
case ((uint32_t)SPI0):
|
||||
if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
|
||||
if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(SPI0_IRQn);
|
||||
}
|
||||
|
@ -75,7 +74,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)SPI1):
|
||||
if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
|
||||
if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(SPI1_IRQn);
|
||||
}
|
||||
|
@ -94,7 +93,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_Open(SPI_TypeDef * SPIx)
|
||||
void SPI_Open(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
|
||||
}
|
||||
|
@ -106,7 +105,7 @@ void SPI_Open(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_Close(SPI_TypeDef * SPIx)
|
||||
void SPI_Close(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
|
||||
}
|
||||
|
@ -118,7 +117,7 @@ void SPI_Close(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 读取到的数据
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_Read(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_Read(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return SPIx->DATA;
|
||||
}
|
||||
|
@ -131,7 +130,7 @@ uint32_t SPI_Read(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data)
|
||||
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
|
||||
{
|
||||
SPIx->DATA = data;
|
||||
}
|
||||
|
@ -144,13 +143,14 @@ void SPI_Write(SPI_TypeDef * SPIx, uint32_t data)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
|
||||
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
|
||||
{
|
||||
SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
|
||||
|
||||
SPIx->DATA = data;
|
||||
|
||||
while((SPIx->STAT & SPI_STAT_WTC_Msk) == 0);
|
||||
while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
|
||||
;
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -161,10 +161,11 @@ void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
|
|||
* 输 出: uint32_t 接收到的数据
|
||||
* 注意事项: 对于同一个SPI模块,此函数不应与SPI_Write()混着用,因为SPI_Write()不清除SPI_STAT_RFNE状态
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
|
||||
{
|
||||
SPIx->DATA = data;
|
||||
while(!(SPIx->STAT & SPI_STAT_RFNE_Msk));
|
||||
while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
|
||||
;
|
||||
|
||||
return SPIx->DATA;
|
||||
}
|
||||
|
@ -176,7 +177,7 @@ uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
|
|||
* 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
|
||||
}
|
||||
|
@ -188,7 +189,7 @@ uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
|
||||
}
|
||||
|
@ -200,12 +201,11 @@ uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SPI_INTRXHalfFullEn()
|
||||
* 功能说明: 接收FIFO半满中断使能
|
||||
|
@ -213,7 +213,7 @@ uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
|
||||
}
|
||||
|
@ -225,7 +225,7 @@ void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
|
||||
}
|
||||
|
@ -237,7 +237,7 @@ void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_RFHF_Pos);
|
||||
}
|
||||
|
@ -249,7 +249,7 @@ void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 接收FIFO达到半满 0 接收FIFO未达到半满
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -261,7 +261,7 @@ uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXFullEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
|
||||
}
|
||||
|
@ -273,7 +273,7 @@ void SPI_INTRXFullEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXFullDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
|
||||
}
|
||||
|
@ -285,7 +285,7 @@ void SPI_INTRXFullDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXFullClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_RFF_Pos);
|
||||
}
|
||||
|
@ -297,7 +297,7 @@ void SPI_INTRXFullClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 接收FIFO满 0 接收FIFO未满
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -309,7 +309,7 @@ uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
|
||||
}
|
||||
|
@ -321,7 +321,7 @@ void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
|
||||
}
|
||||
|
@ -333,7 +333,7 @@ void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
|
||||
}
|
||||
|
@ -345,7 +345,7 @@ void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 接收FIFO溢出 0 接收FIFO未溢出
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -357,7 +357,7 @@ uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
|
||||
}
|
||||
|
@ -369,7 +369,7 @@ void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
|
||||
}
|
||||
|
@ -381,7 +381,7 @@ void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_TFHF_Pos);
|
||||
}
|
||||
|
@ -393,7 +393,7 @@ void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送FIFO达到半满 0 发送FIFO未达到半满
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -405,7 +405,7 @@ uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
|
||||
}
|
||||
|
@ -417,7 +417,7 @@ void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
|
||||
}
|
||||
|
@ -429,7 +429,7 @@ void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_TFE_Pos);
|
||||
}
|
||||
|
@ -441,7 +441,7 @@ void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -453,7 +453,7 @@ uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
|
||||
}
|
||||
|
@ -465,7 +465,7 @@ void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
|
||||
}
|
||||
|
@ -477,7 +477,7 @@ void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_FTC_Pos);
|
||||
}
|
||||
|
@ -489,7 +489,7 @@ void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器非空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -501,7 +501,7 @@ uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
|
||||
}
|
||||
|
@ -513,7 +513,7 @@ void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
|
||||
}
|
||||
|
@ -525,7 +525,7 @@ void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx)
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
|
||||
{
|
||||
SPIx->IF = (1 << SPI_IF_WTC_Pos);
|
||||
}
|
||||
|
@ -537,7 +537,7 @@ void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx)
|
|||
* 输 出: uint32_t 1 发送完成中断已发生 0 发送完成中断未发生
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx)
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
|
||||
{
|
||||
return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_SPI_H__
|
||||
#define __SWM320_SPI_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t FrameFormat; //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
|
||||
uint8_t SampleEdge; //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
|
||||
uint8_t IdleLevel; //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
|
||||
|
@ -32,52 +33,48 @@ typedef struct {
|
|||
#define SPI_CLKDIV_256 6
|
||||
#define SPI_CLKDIV_512 7
|
||||
|
||||
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
|
||||
void SPI_Open(SPI_TypeDef *SPIx); //SPI打开,允许收发
|
||||
void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭,禁止收发
|
||||
|
||||
uint32_t SPI_Read(SPI_TypeDef *SPIx);
|
||||
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
|
||||
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
|
||||
|
||||
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化
|
||||
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开,允许收发
|
||||
void SPI_Close(SPI_TypeDef * SPIx); //SPI关闭,禁止收发
|
||||
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
|
||||
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
|
||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
|
||||
|
||||
uint32_t SPI_Read(SPI_TypeDef * SPIx);
|
||||
void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
|
||||
void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
|
||||
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx);
|
||||
|
||||
uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
|
||||
uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
|
||||
uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //发送FIFO是否空
|
||||
|
||||
|
||||
void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx);
|
||||
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx);
|
||||
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx);
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx);
|
||||
void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
|
||||
|
||||
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx);
|
||||
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
|
||||
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
|
||||
|
||||
#endif //__SWM320_SPI_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_sram.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: SRAM_Init()
|
||||
* 功能说明: SRAM控制器初始化
|
||||
|
@ -29,23 +28,27 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void SRAM_Init(SRAM_InitStructure * initStruct)
|
||||
void SRAM_Init(SRAM_InitStructure *initStruct)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
// 配置SRAM前需要刷新下SDRAM控制器
|
||||
do {
|
||||
do
|
||||
{
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
|
||||
|
||||
while(SDRAMC->REFDONE == 0);
|
||||
while (SDRAMC->REFDONE == 0)
|
||||
;
|
||||
SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
|
||||
|
||||
for(i = 0; i < 1000; i++) __NOP();
|
||||
for (i = 0; i < 1000; i++)
|
||||
__NOP();
|
||||
SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
|
||||
} while(0);
|
||||
} while (0);
|
||||
|
||||
SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
|
||||
for(i = 0; i < 10; i++) __NOP();
|
||||
for (i = 0; i < 10; i++)
|
||||
__NOP();
|
||||
|
||||
SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
|
||||
(initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
#ifndef __SWM320_SRAM_H__
|
||||
#define __SWM320_SRAM_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
|
||||
uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
|
||||
} SRAM_InitStructure;
|
||||
|
||||
|
||||
#define SRAM_CLKDIV_4 3
|
||||
#define SRAM_CLKDIV_5 4
|
||||
#define SRAM_CLKDIV_6 5
|
||||
|
@ -24,8 +24,6 @@ typedef struct {
|
|||
#define SRAM_DATAWIDTH_8 1
|
||||
#define SRAM_DATAWIDTH_16 0
|
||||
|
||||
|
||||
void SRAM_Init(SRAM_InitStructure * initStruct);
|
||||
|
||||
void SRAM_Init(SRAM_InitStructure *initStruct);
|
||||
|
||||
#endif //__SWM320_SRAM_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_timr.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: TIMR_Init()
|
||||
* 功能说明: TIMR定时器/计数器初始化
|
||||
|
@ -32,7 +31,7 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
|
||||
void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
|
||||
{
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
|
||||
|
||||
|
@ -43,14 +42,15 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
|
||||
TIMRx->LDVAL = period;
|
||||
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志
|
||||
TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR0_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR0_IRQn);
|
||||
break;
|
||||
|
||||
case ((uint32_t)TIMR1):
|
||||
|
@ -58,7 +58,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR1_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR1_IRQn);
|
||||
break;
|
||||
|
||||
case ((uint32_t)TIMR2):
|
||||
|
@ -66,7 +67,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR2_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR2_IRQn);
|
||||
break;
|
||||
|
||||
case ((uint32_t)TIMR3):
|
||||
|
@ -74,7 +76,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR3_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR3_IRQn);
|
||||
break;
|
||||
|
||||
case ((uint32_t)TIMR4):
|
||||
|
@ -82,7 +85,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR4_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR4_IRQn);
|
||||
break;
|
||||
|
||||
case ((uint32_t)TIMR5):
|
||||
|
@ -90,7 +94,8 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
|
||||
TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(TIMR5_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(TIMR5_IRQn);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +107,7 @@ void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t in
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_Start(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_Start(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
TIMRx->CTRL |= TIMR_CTRL_EN_Msk;
|
||||
}
|
||||
|
@ -114,7 +119,7 @@ void TIMR_Start(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_Stop(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_Stop(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk;
|
||||
}
|
||||
|
@ -126,9 +131,9 @@ void TIMR_Stop(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_Halt(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_Halt(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos);
|
||||
|
@ -163,9 +168,9 @@ void TIMR_Halt(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_Resume(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_Resume(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos);
|
||||
|
@ -201,7 +206,7 @@ void TIMR_Resume(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
|
||||
void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
|
||||
{
|
||||
TIMRx->LDVAL = period;
|
||||
}
|
||||
|
@ -213,7 +218,7 @@ void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
|
|||
* 输 出: uint32_t 当前定时/计数周期
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
|
||||
uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
return TIMRx->LDVAL;
|
||||
}
|
||||
|
@ -225,7 +230,7 @@ uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: uint32_t 当前计数值
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
|
||||
uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
return TIMRx->CVAL;
|
||||
}
|
||||
|
@ -237,9 +242,9 @@ uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_INTEn(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_INTEn(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos);
|
||||
|
@ -280,9 +285,9 @@ void TIMR_INTEn(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_INTDis(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_INTDis(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos);
|
||||
|
@ -317,9 +322,9 @@ void TIMR_INTDis(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void TIMR_INTClr(TIMR_TypeDef * TIMRx)
|
||||
void TIMR_INTClr(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos);
|
||||
|
@ -354,9 +359,9 @@ void TIMR_INTClr(TIMR_TypeDef * TIMRx)
|
|||
* 输 出: uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
|
||||
uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
|
||||
{
|
||||
switch((uint32_t)TIMRx)
|
||||
switch ((uint32_t)TIMRx)
|
||||
{
|
||||
case ((uint32_t)TIMR0):
|
||||
return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0;
|
||||
|
@ -380,7 +385,6 @@ uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: Pulse_Init()
|
||||
* 功能说明: 脉宽测量功能初始化
|
||||
|
@ -399,7 +403,8 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en)
|
|||
|
||||
TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
|
||||
|
||||
if(int_en) NVIC_EnableIRQ(PULSE_IRQn);
|
||||
if (int_en)
|
||||
NVIC_EnableIRQ(PULSE_IRQn);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -423,7 +428,7 @@ void Pulse_Start(void)
|
|||
******************************************************************************************************************************************/
|
||||
uint32_t Pulse_Done(void)
|
||||
{
|
||||
if(TIMRG->IF & TIMRG_IF_PULSE_Msk)
|
||||
if (TIMRG->IF & TIMRG_IF_PULSE_Msk)
|
||||
{
|
||||
TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志
|
||||
|
||||
|
|
|
@ -4,22 +4,20 @@
|
|||
#define TIMR_MODE_TIMER 0
|
||||
#define TIMR_MODE_COUNTER 1
|
||||
|
||||
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
|
||||
void TIMR_Start(TIMR_TypeDef * TIMRx); //启动定时器,从初始值开始计时/计数
|
||||
void TIMR_Stop(TIMR_TypeDef * TIMRx); //停止定时器
|
||||
void TIMR_Halt(TIMR_TypeDef * TIMRx); //暂停定时器,计数值保持不变
|
||||
void TIMR_Resume(TIMR_TypeDef * TIMRx); //恢复定时器,从暂停处继续计数
|
||||
|
||||
void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period); //设置定时/计数周期
|
||||
uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx); //获取定时/计数周期
|
||||
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx); //获取当前计数值
|
||||
|
||||
void TIMR_INTEn(TIMR_TypeDef * TIMRx); //使能中断
|
||||
void TIMR_INTDis(TIMR_TypeDef * TIMRx); //禁能中断
|
||||
void TIMR_INTClr(TIMR_TypeDef * TIMRx); //清除中断标志
|
||||
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx); //获取中断状态
|
||||
void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
|
||||
void TIMR_Start(TIMR_TypeDef *TIMRx); //启动定时器,从初始值开始计时/计数
|
||||
void TIMR_Stop(TIMR_TypeDef *TIMRx); //停止定时器
|
||||
void TIMR_Halt(TIMR_TypeDef *TIMRx); //暂停定时器,计数值保持不变
|
||||
void TIMR_Resume(TIMR_TypeDef *TIMRx); //恢复定时器,从暂停处继续计数
|
||||
|
||||
void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period); //设置定时/计数周期
|
||||
uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx); //获取定时/计数周期
|
||||
uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx); //获取当前计数值
|
||||
|
||||
void TIMR_INTEn(TIMR_TypeDef *TIMRx); //使能中断
|
||||
void TIMR_INTDis(TIMR_TypeDef *TIMRx); //禁能中断
|
||||
void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
|
||||
uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx); //获取中断状态
|
||||
|
||||
#define PULSE_LOW 0
|
||||
#define PULSE_HIGH 1
|
||||
|
@ -28,5 +26,4 @@ void Pulse_Init(uint32_t pulse, uint32_t int_en);
|
|||
void Pulse_Start(void);
|
||||
uint32_t Pulse_Done(void);
|
||||
|
||||
|
||||
#endif //__SWM320_TIMR_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_uart.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: UART_Init()
|
||||
* 功能说明: UART串口初始化
|
||||
|
@ -30,9 +29,9 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
||||
void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
|
||||
{
|
||||
switch((uint32_t)UARTx)
|
||||
switch ((uint32_t)UARTx)
|
||||
{
|
||||
case ((uint32_t)UART0):
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos);
|
||||
|
@ -55,7 +54,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
|
||||
UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
|
||||
UARTx->BAUD |= ((SystemCoreClock/16/initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
|
||||
UARTx->BAUD |= ((SystemCoreClock / 16 / initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
|
||||
|
||||
UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
|
||||
UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
|
||||
|
@ -65,12 +64,20 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
/* 在SWM320中,当 RXLVL >= RXTHR 时触发中断,如果RXTHR设置为0的话,在未接收到数据时就会一直触发中断;
|
||||
其他芯片中,当 RXLVL > RXTHR 时触发中断,为解决SWM320中RXTHR不能为0的问题,并统一库函数API,这里将RXTHR设置值加一
|
||||
*/
|
||||
switch((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
|
||||
switch ((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
|
||||
{
|
||||
case ((uint32_t)UART0): NVIC_DisableIRQ(UART0_IRQn); break;
|
||||
case ((uint32_t)UART1): NVIC_DisableIRQ(UART1_IRQn); break;
|
||||
case ((uint32_t)UART2): NVIC_DisableIRQ(UART2_IRQn); break;
|
||||
case ((uint32_t)UART3): NVIC_DisableIRQ(UART3_IRQn); break;
|
||||
case ((uint32_t)UART0):
|
||||
NVIC_DisableIRQ(UART0_IRQn);
|
||||
break;
|
||||
case ((uint32_t)UART1):
|
||||
NVIC_DisableIRQ(UART1_IRQn);
|
||||
break;
|
||||
case ((uint32_t)UART2):
|
||||
NVIC_DisableIRQ(UART2_IRQn);
|
||||
break;
|
||||
case ((uint32_t)UART3):
|
||||
NVIC_DisableIRQ(UART3_IRQn);
|
||||
break;
|
||||
}
|
||||
UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
|
||||
UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
|
||||
|
@ -84,10 +91,10 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
(initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
|
||||
(initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
|
||||
|
||||
switch((uint32_t)UARTx)
|
||||
switch ((uint32_t)UARTx)
|
||||
{
|
||||
case ((uint32_t)UART0):
|
||||
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
}
|
||||
|
@ -98,7 +105,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)UART1):
|
||||
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
}
|
||||
|
@ -109,7 +116,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)UART2):
|
||||
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(UART2_IRQn);
|
||||
}
|
||||
|
@ -120,7 +127,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
break;
|
||||
|
||||
case ((uint32_t)UART3):
|
||||
if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
|
||||
{
|
||||
NVIC_EnableIRQ(UART3_IRQn);
|
||||
}
|
||||
|
@ -139,7 +146,7 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_Open(UART_TypeDef * UARTx)
|
||||
void UART_Open(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
|
||||
}
|
||||
|
@ -151,7 +158,7 @@ void UART_Open(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_Close(UART_TypeDef * UARTx)
|
||||
void UART_Close(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
|
||||
}
|
||||
|
@ -164,7 +171,7 @@ void UART_Close(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data)
|
||||
void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data)
|
||||
{
|
||||
UARTx->DATA = data;
|
||||
}
|
||||
|
@ -177,13 +184,14 @@ void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data)
|
|||
* 输 出: uint32_t 0 无错误 UART_ERR_PARITY 奇偶校验错误
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
|
||||
uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
|
||||
{
|
||||
uint32_t reg = UARTx->DATA;
|
||||
|
||||
*data = (reg & UART_DATA_DATA_Msk);
|
||||
|
||||
if(reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
|
||||
if (reg & UART_DATA_PAERR_Msk)
|
||||
return UART_ERR_PARITY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -195,7 +203,7 @@ uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
|
|||
* 输 出: uint32_t 1 UART正在发送数据 0 数据已发完
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
|
||||
}
|
||||
|
@ -207,7 +215,7 @@ uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
|
||||
}
|
||||
|
@ -219,7 +227,7 @@ uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -232,10 +240,10 @@ uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 不要在串口工作时更改波特率,使用此函数前请先调用UART_Close()关闭串口
|
||||
******************************************************************************************************************************************/
|
||||
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
|
||||
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
|
||||
{
|
||||
UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
|
||||
UARTx->BAUD |= ((SystemCoreClock/16/baudrate - 1) << UART_BAUD_BAUD_Pos);
|
||||
UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate - 1) << UART_BAUD_BAUD_Pos);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -245,9 +253,9 @@ void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
|
|||
* 输 出: uint32_t 当前波特率
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
|
||||
{
|
||||
return SystemCoreClock/16/(((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
|
||||
return SystemCoreClock / 16 / (((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
|
||||
}
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
|
@ -259,7 +267,7 @@ uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
|
||||
void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
|
||||
{
|
||||
UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
|
||||
UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
|
||||
|
@ -273,7 +281,7 @@ void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
|
|||
* 输 出: uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
|
||||
uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -288,7 +296,7 @@ uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
|
||||
void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
|
||||
{
|
||||
UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
|
||||
UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
|
||||
|
@ -303,7 +311,7 @@ void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, ui
|
|||
* 输 出: uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
|
||||
uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -317,7 +325,7 @@ uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
|
||||
void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
|
||||
{
|
||||
UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
|
||||
UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
|
||||
|
@ -331,7 +339,7 @@ void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generat
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_LINGenerate(UART_TypeDef * UARTx)
|
||||
void UART_LINGenerate(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
|
||||
}
|
||||
|
@ -343,7 +351,7 @@ void UART_LINGenerate(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 检测到LIN Break 0 未检测到LIN Break
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -355,7 +363,7 @@ uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 LIN Break 发送完成 0 LIN Break发送未完成
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -370,15 +378,21 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 自动波特率检测时不能开启奇偶校验
|
||||
******************************************************************************************************************************************/
|
||||
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
|
||||
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
|
||||
{
|
||||
uint32_t bits;
|
||||
|
||||
if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
|
||||
else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
|
||||
else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
|
||||
else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
|
||||
else while(1);
|
||||
if ((detectChar == 0xFF) || (detectChar == 0x1FF))
|
||||
bits = 0;
|
||||
else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
|
||||
bits = 1;
|
||||
else if ((detectChar == 0xF8) || (detectChar == 0x1F8))
|
||||
bits = 2;
|
||||
else if ((detectChar == 0x80) || (detectChar == 0x180))
|
||||
bits = 3;
|
||||
else
|
||||
while (1)
|
||||
;
|
||||
|
||||
UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
|
||||
UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
|
||||
|
@ -392,13 +406,13 @@ void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
|
|||
* 输 出: uint32_t 0 未完成 UART_ABR_RES_OK 已完成,且成功 UART_ABR_RES_ERR 已完成,但失败、出错
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
|
||||
{
|
||||
if(UARTx->BAUD & UART_BAUD_ABREN_Msk)
|
||||
if (UARTx->BAUD & UART_BAUD_ABREN_Msk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if(UARTx->BAUD & UART_BAUD_ABRERR_Msk)
|
||||
else if (UARTx->BAUD & UART_BAUD_ABRERR_Msk)
|
||||
{
|
||||
return UART_ABR_RES_ERR;
|
||||
}
|
||||
|
@ -415,7 +429,7 @@ uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
|
||||
void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
|
||||
}
|
||||
|
@ -427,7 +441,7 @@ void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
|
||||
void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
|
||||
}
|
||||
|
@ -439,7 +453,7 @@ void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
|
||||
* 注意事项: RXIF = RXTHRF & RXIE
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -451,7 +465,7 @@ uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
|
||||
void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
|
||||
}
|
||||
|
@ -463,7 +477,7 @@ void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
|
||||
void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
|
||||
}
|
||||
|
@ -475,7 +489,7 @@ void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
|
||||
* 注意事项: TXIF = TXTHRF & TXIE
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -487,7 +501,7 @@ uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTimeoutEn(UART_TypeDef * UARTx)
|
||||
void UART_INTTimeoutEn(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
|
||||
}
|
||||
|
@ -499,7 +513,7 @@ void UART_INTTimeoutEn(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTimeoutDis(UART_TypeDef * UARTx)
|
||||
void UART_INTTimeoutDis(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
|
||||
}
|
||||
|
@ -511,7 +525,7 @@ void UART_INTTimeoutDis(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 发生了接收超时 0 未发生接收超时
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
@ -523,7 +537,7 @@ uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTXDoneEn(UART_TypeDef * UARTx)
|
||||
void UART_INTTXDoneEn(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
|
||||
}
|
||||
|
@ -535,7 +549,7 @@ void UART_INTTXDoneEn(UART_TypeDef * UARTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void UART_INTTXDoneDis(UART_TypeDef * UARTx)
|
||||
void UART_INTTXDoneDis(UART_TypeDef *UARTx)
|
||||
{
|
||||
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
|
||||
}
|
||||
|
@ -547,7 +561,7 @@ void UART_INTTXDoneDis(UART_TypeDef * UARTx)
|
|||
* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器未空
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx)
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
|
||||
{
|
||||
return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#ifndef __SWM320_UART_H__
|
||||
#define __SWM320_UART_H__
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint32_t Baudrate;
|
||||
|
||||
uint8_t DataBits; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
|
||||
|
@ -20,7 +21,6 @@ typedef struct {
|
|||
uint8_t TimeoutIEn; //超时中断,RX FIFO非空,且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
|
||||
} UART_InitStructure;
|
||||
|
||||
|
||||
#define UART_DATA_8BIT 0
|
||||
#define UART_DATA_9BIT 1
|
||||
|
||||
|
@ -45,50 +45,46 @@ typedef struct {
|
|||
#define UART_ERR_PARITY 2
|
||||
#define UART_ERR_NOISE 3
|
||||
|
||||
void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART串口初始化
|
||||
void UART_Open(UART_TypeDef *UARTx);
|
||||
void UART_Close(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART串口初始化
|
||||
void UART_Open(UART_TypeDef * UARTx);
|
||||
void UART_Close(UART_TypeDef * UARTx);
|
||||
void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data); //发送一个字节数据
|
||||
uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data); //读取一个字节数据,并指出数据是否Valid
|
||||
|
||||
void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //发送一个字节数据
|
||||
uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //读取一个字节数据,并指出数据是否Valid
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
||||
|
||||
uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
|
||||
uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
|
||||
uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
|
||||
void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
|
||||
|
||||
void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
|
||||
uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //设置波特率
|
||||
uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //获取当前使用的波特率
|
||||
void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
|
||||
uint32_t UART_RTSLineState(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity);
|
||||
uint32_t UART_CTSLineState(UART_TypeDef * UARTx);
|
||||
void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
|
||||
void UART_LINGenerate(UART_TypeDef *UARTx);
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef *UARTx);
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
|
||||
uint32_t UART_RTSLineState(UART_TypeDef * UARTx);
|
||||
void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
|
||||
void UART_LINGenerate(UART_TypeDef * UARTx);
|
||||
uint32_t UART_LINIsDetected(UART_TypeDef * UARTx);
|
||||
uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx);
|
||||
|
||||
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar);
|
||||
uint32_t UART_ABRIsDone(UART_TypeDef * UARTx);
|
||||
|
||||
|
||||
void UART_INTRXThresholdEn(UART_TypeDef * UARTx);
|
||||
void UART_INTRXThresholdDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx);
|
||||
void UART_INTTXThresholdEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTXThresholdDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx);
|
||||
void UART_INTTimeoutEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTimeoutDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx);
|
||||
|
||||
void UART_INTTXDoneEn(UART_TypeDef * UARTx);
|
||||
void UART_INTTXDoneDis(UART_TypeDef * UARTx);
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx);
|
||||
void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
|
||||
void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
|
||||
void UART_INTTXThresholdEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTXThresholdDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx);
|
||||
void UART_INTTimeoutEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTimeoutDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx);
|
||||
|
||||
void UART_INTTXDoneEn(UART_TypeDef *UARTx);
|
||||
void UART_INTTXDoneDis(UART_TypeDef *UARTx);
|
||||
uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
|
||||
|
||||
#endif //__SWM320_UART_H__
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "SWM320.h"
|
||||
#include "SWM320_wdt.h"
|
||||
|
||||
|
||||
/******************************************************************************************************************************************
|
||||
* 函数名称: WDT_Init()
|
||||
* 功能说明: WDT看门狗初始化
|
||||
|
@ -31,7 +30,7 @@
|
|||
* 输 出: 无
|
||||
* 注意事项: 复位使能时中断不起作用,因为计数周期结束时芯片直接复位了,无法响应中断
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
|
||||
void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
|
||||
{
|
||||
SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
|
||||
|
||||
|
@ -39,7 +38,7 @@ void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
|
|||
|
||||
WDTx->LOAD = peroid;
|
||||
|
||||
if(mode == WDT_MODE_RESET)
|
||||
if (mode == WDT_MODE_RESET)
|
||||
{
|
||||
NVIC_DisableIRQ(WDT_IRQn);
|
||||
|
||||
|
@ -60,7 +59,7 @@ void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Start(WDT_TypeDef * WDTx)
|
||||
void WDT_Start(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
|
||||
}
|
||||
|
@ -72,7 +71,7 @@ void WDT_Start(WDT_TypeDef * WDTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Stop(WDT_TypeDef * WDTx)
|
||||
void WDT_Stop(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
|
||||
}
|
||||
|
@ -84,7 +83,7 @@ void WDT_Stop(WDT_TypeDef * WDTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_Feed(WDT_TypeDef * WDTx)
|
||||
void WDT_Feed(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->FEED = 0x55;
|
||||
}
|
||||
|
@ -96,7 +95,7 @@ void WDT_Feed(WDT_TypeDef * WDTx)
|
|||
* 输 出: int32_t 看门狗当前计数值
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
int32_t WDT_GetValue(WDT_TypeDef * WDTx)
|
||||
int32_t WDT_GetValue(WDT_TypeDef *WDTx)
|
||||
{
|
||||
return WDTx->VALUE;
|
||||
}
|
||||
|
@ -108,7 +107,7 @@ int32_t WDT_GetValue(WDT_TypeDef * WDTx)
|
|||
* 输 出: 无
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
void WDT_INTClr(WDT_TypeDef * WDTx)
|
||||
void WDT_INTClr(WDT_TypeDef *WDTx)
|
||||
{
|
||||
WDTx->IF = 1;
|
||||
}
|
||||
|
@ -120,7 +119,7 @@ void WDT_INTClr(WDT_TypeDef * WDTx)
|
|||
* 输 出: int32_t 1 发生中断溢出 0 未发生中断溢出
|
||||
* 注意事项: 无
|
||||
******************************************************************************************************************************************/
|
||||
uint32_t WDT_INTStat(WDT_TypeDef * WDTx)
|
||||
uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
|
||||
{
|
||||
return WDTx->IF;
|
||||
}
|
||||
|
|
|
@ -4,16 +4,15 @@
|
|||
#define WDT_MODE_RESET 0
|
||||
#define WDT_MODE_INTERRUPT 1
|
||||
|
||||
void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
|
||||
void WDT_Start(WDT_TypeDef * WDTx); //启动指定WDT,开始倒计时
|
||||
void WDT_Stop(WDT_TypeDef * WDTx); //关闭指定WDT,停止倒计时
|
||||
void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
|
||||
void WDT_Start(WDT_TypeDef *WDTx); //启动指定WDT,开始倒计时
|
||||
void WDT_Stop(WDT_TypeDef *WDTx); //关闭指定WDT,停止倒计时
|
||||
|
||||
void WDT_Feed(WDT_TypeDef * WDTx); //喂狗,重新从装载值开始倒计时
|
||||
void WDT_Feed(WDT_TypeDef *WDTx); //喂狗,重新从装载值开始倒计时
|
||||
|
||||
int32_t WDT_GetValue(WDT_TypeDef * WDTx); //获取指定看门狗定时器的当前倒计时值
|
||||
int32_t WDT_GetValue(WDT_TypeDef *WDTx); //获取指定看门狗定时器的当前倒计时值
|
||||
|
||||
|
||||
void WDT_INTClr(WDT_TypeDef * WDTx); //中断标志清除
|
||||
uint32_t WDT_INTStat(WDT_TypeDef * WDTx); //中断状态查询
|
||||
void WDT_INTClr(WDT_TypeDef *WDTx); //中断标志清除
|
||||
uint32_t WDT_INTStat(WDT_TypeDef *WDTx); //中断状态查询
|
||||
|
||||
#endif //__SWM320_WDT_H__
|
||||
|
|
Loading…
Reference in New Issue