update CSL library (#8370)

This commit is contained in:
Xian Wu
2023-12-12 18:23:12 +08:00
committed by GitHub
parent 304ce5919c
commit 4018092baf
57 changed files with 3836 additions and 1520 deletions
-5
View File
@@ -157,11 +157,6 @@ msh />
| NOR FLASH | 支持 | NOR FLASH |
| CAN | 暂不支持 | |
## 维护人信息
- [yanmowudi](https://github.com/yanmowudi)
- [邮箱](lik@synwit.cn)
## 参考资料
* [RT-Thread 文档中心](https://www.rt-thread.org/document/site/)
+1 -1
View File
@@ -277,7 +277,7 @@ static void rt_hw_uart_isr(struct rt_serial_device *serial_device)
uart_cfg = serial_device->parent.user_data;
/* UART in mode Receiver -------------------------------------------------*/
if (UART_INTRXThresholdStat(uart_cfg->UARTx) || UART_INTTimeoutStat(uart_cfg->UARTx))
if (UART_INTStat(uart_cfg->UARTx, UART_IT_RX_THR) || UART_INTStat(uart_cfg->UARTx, UART_IT_RX_TOUT))
{
rt_hw_serial_isr(serial_device, RT_SERIAL_EVENT_RX_IND);
}
@@ -105,6 +105,7 @@ typedef enum IRQn
#endif
#include <stdio.h>
#include <stdbool.h>
#include "core_cm4.h" /* Cortex-M0 processor and core peripherals */
#include "system_SWM320.h"
@@ -177,8 +178,6 @@ typedef struct {
__IO uint32_t BODIE;
__IO uint32_t BODIF;
__IO uint32_t ADC1IN7;
} SYS_TypeDef;
@@ -359,11 +358,6 @@ typedef struct {
#define SYS_BODIF_2V2_Pos 1 //BOD 2.2V等级触发中断状态,写1清零
#define SYS_BODIF_2V2_Msk (0x01 << SYS_BODIF_2V2_Pos)
#define SYS_ADC1IN7_SEL_Pos 0 //ADC1模块模拟通道7,1 温度传感器 2 电池电压 3 RTC电源域BG 4 主电源域BG 5 PDM33
#define SYS_ADC1IN7_SEL_Msk (0x0F << SYS_ADC1IN7_SEL_Pos)
#define SYS_ADC1IN7_IOON_Pos 4 //ADC1模块模拟通道7所用IO开关
#define SYS_ADC1IN7_IOON_Msk (0x01 << SYS_ADC1IN7_IOON_Pos)
@@ -1472,11 +1466,11 @@ typedef struct {
#define SPI_IE_RFOVF_Msk (0x01 << SPI_IE_RFOVF_Pos)
#define SPI_IE_RFF_Pos 1
#define SPI_IE_RFF_Msk (0x01 << SPI_IE_RFF_Pos)
#define SPI_IE_RFHF_Pos 2
#define SPI_IE_RFHF_Pos 2 //~rxfifo_full & (rxfifo_level == 4)
#define SPI_IE_RFHF_Msk (0x01 << SPI_IE_RFHF_Pos)
#define SPI_IE_TFE_Pos 3
#define SPI_IE_TFE_Msk (0x01 << SPI_IE_TFE_Pos)
#define SPI_IE_TFHF_Pos 4
#define SPI_IE_TFHF_Pos 4 //~txfifo_full & (txfifo_level == 4)
#define SPI_IE_TFHF_Msk (0x01 << SPI_IE_TFHF_Pos)
#define SPI_IE_WTC_Pos 8 //Word Transmit Complete
#define SPI_IE_WTC_Msk (0x01 << SPI_IE_WTC_Pos)
@@ -2712,7 +2706,7 @@ typedef struct {
typedef struct {
__IO uint32_t DATA;
__IO uint32_t ADDR;
__IO uint32_t FLASH_ERASE;
__IO uint32_t ERASE;
__IO uint32_t CACHE;
__IO uint32_t CFG0;
__IO uint32_t CFG1;
@@ -3178,4 +3172,52 @@ typedef void (* Func_void_void) (void);
#include "SWM320_wdt.h"
#ifdef SW_LOG_RTT
#define log_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)
#else
#define log_printf(...) printf(__VA_ARGS__)
#endif
#ifndef SW_LOG_LEVEL
#define SW_LOG_LEVEL 0
#endif
#if (SW_LOG_LEVEL > 0)
#define SW_LOG_ERR(...) { \
log_printf("ERROR: "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#if (SW_LOG_LEVEL > 1)
#define SW_LOG_WARN(...) { \
log_printf("WARN : "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#if (SW_LOG_LEVEL > 2)
#define SW_LOG_INFO(...) { \
log_printf("INFO : "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#else
#define SW_LOG_INFO(...)
#endif
#else
#define SW_LOG_WARN(...)
#define SW_LOG_INFO(...)
#endif
#else
#define SW_LOG_ERR(...)
#define SW_LOG_WARN(...)
#define SW_LOG_INFO(...)
#endif
#endif //__SWM320_H__
File diff suppressed because it is too large Load Diff
@@ -78,6 +78,18 @@ typedef struct {
} CAN_RXMessage;
/* Interrupt Type */
#define CAN_IT_RX_NOTEMPTY (0x01 << 0) //RX Buffer Not Empty
#define CAN_IT_RX_OVERFLOW (0x01 << 3) //RX Buffer Overflow
#define CAN_IT_TX_EMPTY (0x01 << 1) //TX Buffer Empty
#define CAN_IT_ARBLOST (0x01 << 6) //Arbitration lost
#define CAN_IT_ERR (0x01 << 7)
#define CAN_IT_ERR_WARN (0x01 << 2) //TXERR/RXERR计数值达到Error Warning Limit
#define CAN_IT_ERR_PASS (0x01 << 5) //TXERR/RXERR计数值达到127
#define CAN_IT_WAKEUP (0x01 << 4)
void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct);
void CAN_Open(CAN_TypeDef * CANx);
void CAN_Close(CAN_TypeDef * CANx);
@@ -100,31 +112,9 @@ 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_INTErrWarningEn(CAN_TypeDef * CANx);
void CAN_INTErrWarningDis(CAN_TypeDef * CANx);
void CAN_INTRXOverflowEn(CAN_TypeDef * CANx);
void CAN_INTRXOverflowDis(CAN_TypeDef * CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef * CANx);
void CAN_INTWakeupEn(CAN_TypeDef * CANx);
void CAN_INTWakeupDis(CAN_TypeDef * CANx);
void CAN_INTErrPassiveEn(CAN_TypeDef * CANx);
void CAN_INTErrPassiveDis(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);
void CAN_INTEn(CAN_TypeDef * CANx, uint32_t it);
void CAN_INTDis(CAN_TypeDef * CANx, uint32_t it);
void CAN_INTClr(CAN_TypeDef * CANx, uint32_t it);
uint32_t CAN_INTStat(CAN_TypeDef * CANx);
#endif //__SWM320_CAN_H__
@@ -163,7 +163,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
******************************************************************************************************************************************/
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->DATA |= (0x01 << n);
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1;
}
/******************************************************************************************************************************************
@@ -176,7 +176,7 @@ void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
******************************************************************************************************************************************/
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->DATA &= ~(0x01 << n);
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0;
}
/******************************************************************************************************************************************
@@ -189,7 +189,7 @@ void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
******************************************************************************************************************************************/
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->DATA ^= (0x01 << 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));
}
/******************************************************************************************************************************************
@@ -278,45 +278,6 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
return ((GPIOx->DATA >> n) & bits);
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBit()
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicClrBit()
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicInvBit()
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4));
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
@@ -4,6 +4,14 @@
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
#define GPIO_INPUT ((0 << 0) | (0 << 1) | (0 << 2))
#define GPIO_INPUT_PullUp ((0 << 0) | (1 << 1) | (0 << 2))
#define GPIO_INPUT_PullDown ((0 << 0) | (0 << 1) | (1 << 2))
#define GPIO_OUTPUT ((1 << 0) | (0 << 1) | (0 << 2))
#define GPIO_INIT(GPIOx, n, mode) GPIO_Init(GPIOx, n, (mode & 1) ? 1 : 0, (mode & 2) ? 1 : 0, (mode & 4) ? 1 : 0)
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); //将参数指定的引脚电平反转
@@ -13,12 +21,16 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t 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);
// for compatibility
#define GPIO_AtomicSetBit GPIO_SetBit
#define GPIO_AtomicClrBit GPIO_ClrBit
#define GPIO_AtomicInvBit GPIO_InvBit
#endif //__SWM320_GPIO_H__
File diff suppressed because it is too large Load Diff
@@ -40,6 +40,15 @@ typedef struct {
uint8_t Second;
} RTC_DateTime;
/* Interrupt Type */
#define RTC_IT_SECOND (1 << 0) //Second Interrupt
#define RTC_IT_MINUTE (1 << 1)
#define RTC_IT_HOUR (1 << 2)
#define RTC_IT_DATE (1 << 3)
#define RTC_IT_ALARM (1 << 4)
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct);
void RTC_Start(RTC_TypeDef * RTCx);
void RTC_Stop(RTC_TypeDef * RTCx);
@@ -49,25 +58,9 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct);
void RTC_IntSecondEn(RTC_TypeDef * RTCx);
void RTC_IntSecondDis(RTC_TypeDef * RTCx);
void RTC_IntSecondClr(RTC_TypeDef * RTCx);
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_INTEn(RTC_TypeDef * RTCx, uint32_t it);
void RTC_INTDis(RTC_TypeDef * RTCx, uint32_t it);
void RTC_INTClr(RTC_TypeDef * RTCx, uint32_t it);
uint32_t RTC_INTStat(RTC_TypeDef * RTCx, uint32_t it);
#endif //__SWM320_RTC_H__
@@ -33,6 +33,7 @@ SD_CardInfo SD_cardInfo;
******************************************************************************************************************************************/
uint32_t SDIO_Init(uint32_t freq)
{
uint32_t i;
uint32_t res;
uint32_t resp, resps[4];
@@ -59,6 +60,8 @@ uint32_t SDIO_Init(uint32_t freq)
while((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0);
for(i = 0; i < CyclesPerUs * 10 ; i++) __NOP();
SDIO->IM = 0xFFFFFFFF;
@@ -122,6 +125,8 @@ uint32_t SDIO_Init(uint32_t freq)
SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节
SD_cardInfo.CardBlockSize = 512;
SDIO->BLK = 512;
return SD_RES_OK;
@@ -42,7 +42,7 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
(initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
(initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
((initStruct->CellSize == SDRAM_CELLSIZE_16Mb ? SDRAM_CELLBANK_2 : SDRAM_CELLBANK_4) << SDRAMC_CR1_BANK_Pos) |
(0 << SDRAMC_CR1_32BIT_Pos) |
(initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
(initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
@@ -63,7 +63,7 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
}
SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
(((SystemCoreClock/2)/1000*64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
(((SystemCoreClock/2)/1000 * initStruct->RefreshTime / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
while(SDRAMC->REFDONE == 0);
}
@@ -3,14 +3,15 @@
typedef struct {
uint8_t CellSize; // SDRAM颗粒的容量,SDRAM_CELLSIZE_16Mb、SDRAM_CELLSIZE_64Mb、SDRAM_CELLSIZE_128Mb、SDRAM_CELLSIZE_256Mb
uint8_t CellBank; // SDRAM颗粒有几个bank,SDRAM_CELLBANK_2、SDRAM_CELLBANK_4
uint8_t CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
uint8_t RefreshTime; // 刷新时间,单位 ms,在这个时间内 SDRAM 必须完成一次整片刷新,通常为 64ms
uint8_t TimeTMRD; // MRS to New Command
uint8_t TimeTRRD; // Activate to activate on different banks
uint8_t TimeTRAS; // Self refresh time,最小Self-refresh周期
uint8_t TimeTRC; // Row cycle delay,Refresh命令到Activate命令间延时,也是两个连续Refresh命令间延时
uint8_t TimeTRC; // Row cycle delay,Activate to activate on same bank
// 若 SDRAM 颗粒除了 tRC,还有 tRFC 或 tRRC 参数,则按照二者中较大的计算 TimeTRC
uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
} SDRAM_InitStructure;
File diff suppressed because it is too large Load Diff
@@ -33,6 +33,15 @@ typedef struct {
#define SPI_CLKDIV_512 7
/* Interrupt Type */
#define SPI_IT_RX_OVF (1 << 0) //RX FIFO Overflow
#define SPI_IT_RX_FULL (1 << 1) //RX FIFO Full
#define SPI_IT_RX_HFULL (1 << 2) //RX FIFO Half Full
#define SPI_IT_TX_EMPTY (1 << 3) //TX FIFO Empty
#define SPI_IT_TX_HFULL (1 << 4) //TX FIFO Half Full
#define SPI_IT_TX_DONE (1 << 9) //TX Done(发送FIFO空且发送移位寄存器空)
void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI初始化
void SPI_Open(SPI_TypeDef * SPIx); //SPI打开,允许收发
@@ -48,36 +57,10 @@ uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //发送FIFO是否满,
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_INTEn(SPI_TypeDef * SPIx, uint32_t it); //中断使能
void SPI_INTDis(SPI_TypeDef * SPIx, uint32_t it); //中断禁止
void SPI_INTClr(SPI_TypeDef * SPIx, uint32_t it); //中断标志清除
uint32_t SPI_INTStat(SPI_TypeDef * SPIx, uint32_t it); //中断状态查询
#endif //__SWM320_SPI_H__
@@ -372,7 +372,7 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
******************************************************************************************************************************************/
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
{
uint32_t bits;
uint32_t bits = 0;
if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
@@ -409,145 +409,43 @@ uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdEn()
* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 触发中断
* 函数名称: UART_INTEn()
* 功能说明: 中断使能
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
void UART_INTEn(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
UARTx->CTRL |= it;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdDis()
* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 不触发中断
* 函数名称: UART_INTDis()
* 功能说明: 中断禁止
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
void UART_INTDis(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
UARTx->CTRL &= ~it;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdStat()
* 功能说明: 是否RX FIFO中数据个数 >= RXThreshold
* 函数名称: UART_INTStat()
* 功能说明: 中断状态查询
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
* 注意事项: RXIF = RXTHRF & RXIE
******************************************************************************************************************************************/
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdEn()
* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: uint32_t 1 中断已发生 0 中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdDis()
* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 不触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdStat()
* 功能说明: 是否TX FIFO中数据个数 <= TXThreshold
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
* 注意事项: TXIF = TXTHRF & TXIE
******************************************************************************************************************************************/
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutEn()
* 功能说明: 接收发生超时时 触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTimeoutEn(UART_TypeDef * UARTx)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutDis()
* 功能说明: 接收发生超时时 不触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTimeoutDis(UART_TypeDef * UARTx)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutStat()
* 功能说明: 是否发生了接收超时,即超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 发生了接收超时 0 未发生接收超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneEn()
* 功能说明: 发送FIFO空且发送移位寄存器空中断使能
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXDoneEn(UART_TypeDef * UARTx)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneDis()
* 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXDoneDis(UART_TypeDef * UARTx)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneStat()
* 功能说明: 发送FIFO空且发送移位寄存器空中断状态
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器未空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
return (((it & UART_IT_RX_THR) && (UARTx->BAUD & UART_BAUD_RXIF_Msk)) ||
((it & UART_IT_RX_TOUT) && (UARTx->BAUD & UART_BAUD_TOIF_Msk)) ||
((it & UART_IT_TX_THR) && (UARTx->BAUD & UART_BAUD_TXIF_Msk)) ||
((it & UART_IT_TX_DONE) && (UARTx->BAUD & UART_BAUD_TXDOIF_Msk)));
}
@@ -46,6 +46,14 @@ typedef struct {
#define UART_ERR_NOISE 3
/* Interrupt Type */
#define UART_IT_RX_THR (1 << UART_CTRL_RXIE_Pos) //RX FIFO Threshold, RX FIFO中数据个数 > RXThreshold
#define UART_IT_RX_TOUT (1 << UART_CTRL_TOIE_Pos) //RX Timeout, 超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据
#define UART_IT_TX_THR (1 << UART_CTRL_TXIE_Pos) //TX FIFO Threshold, TX FIFO中数据个数 <= TXThreshold
#define UART_IT_TX_DONE (1 << UART_CTRL_TXDOIE_Pos) //TX Done, 发送FIFO空且发送发送移位寄存器已将最后一位发送出去
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART串口初始化
void UART_Open(UART_TypeDef * UARTx);
void UART_Close(UART_TypeDef * UARTx);
@@ -76,19 +84,9 @@ 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_INTEn(UART_TypeDef * UARTx, uint32_t it);
void UART_INTDis(UART_TypeDef * UARTx, uint32_t it);
uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it);
#endif //__SWM320_UART_H__
+2
View File
@@ -6,6 +6,7 @@
/* RT-Thread Kernel */
#define RT_CPUS_NR 1
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 8
#define RT_THREAD_PRIORITY_32
@@ -40,6 +41,7 @@
#define RT_USING_MEMHEAP_AS_HEAP
#define RT_USING_MEMHEAP_AUTO_BINDING
#define RT_USING_HEAP
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* Kernel Device Object */
-5
View File
@@ -144,11 +144,6 @@ msh >
| SDIO | 支持 | SDIO |
| SDRAM | 支持 | SDRAM |
## 维护人信息
- [yanmowudi](https://github.com/yanmowudi)
- [邮箱](lik@synwit.cn)
## 参考资料
* [RT-Thread 文档中心](https://www.rt-thread.org/document/site/)
+3 -2
View File
@@ -63,9 +63,10 @@ int swm_sdram_init(void)
SDRAM_InitStruct.Size = SDRAM_SIZE_8MB;
SDRAM_InitStruct.ClkDiv = SDRAM_CLKDIV_1;
SDRAM_InitStruct.CASLatency = SDRAM_CASLATENCY_3;
SDRAM_InitStruct.TimeTRP = SDRAM_TRP_2;
SDRAM_InitStruct.RefreshTime = 64;
SDRAM_InitStruct.TimeTRP = SDRAM_TRP_2;
SDRAM_InitStruct.TimeTRCD = SDRAM_TRCD_2;
SDRAM_InitStruct.TimeTRFC = SDRAM_TRFC_9;
SDRAM_InitStruct.TimeTRC = SDRAM_TRC_7;
SDRAM_Init(&SDRAM_InitStruct);
return 0;
+1 -1
View File
@@ -273,7 +273,7 @@ static void swm_uart_isr(struct rt_serial_device *serial_device)
uart_cfg = serial_device->parent.user_data;
/* UART in mode Receiver -------------------------------------------------*/
if (UART_INTRXThresholdStat(uart_cfg->UARTx) || UART_INTTimeoutStat(uart_cfg->UARTx))
if (UART_INTStat(uart_cfg->UARTx, UART_IT_RX_THR) || UART_INTStat(uart_cfg->UARTx, UART_IT_RX_TOUT))
{
rt_hw_serial_isr(serial_device, RT_SERIAL_EVENT_RX_IND);
}
@@ -274,8 +274,6 @@ typedef struct {
#define SYS_CLKSEL_SDIO_Msk (0x03 << SYS_CLKSEL_SDIO_Pos)
#define SYS_CLKSEL_WDT_Pos 12 //看门狗时钟选择 0 HRC 1 XTAL 2 LRC 3 XTAL_32K
#define SYS_CLKSEL_WDT_Msk (0x03 << SYS_CLKSEL_WDT_Pos)
#define SYS_CLKSEL_RTCTRIM_Pos 14 //RTC Trim参考时钟 0 XTAL 1 XTAL/2 2 XTAL/4 3 XTAL/8
#define SYS_CLKSEL_RTCTRIM_Msk (0x03 << SYS_CLKSEL_RTCTRIM_Pos)
#define SYS_CLKSEL_AD0_Pos 16 //ADC0时钟选择 0 HRC 1 XTAL 2 PLL
#define SYS_CLKSEL_AD0_Msk (0x03 << SYS_CLKSEL_AD0_Pos)
#define SYS_CLKSEL_AD0DIV_Pos 18 //ADC0时钟分频 0 1分频 1 1分频 2 4分频 3 8分频
@@ -477,12 +475,14 @@ typedef struct {
#define SYS_PRSTR1_GPIOE_Pos 0
#define SYS_PRSTR1_GPIOE_Msk (0x01 << SYS_PRSTR1_GPIOE_Pos)
#define SYS_PRSTR1_SPI2_Pos 8
#define SYS_PRSTR1_SPI2_Msk (0x01 << SYS_PRSTR1_SPI2_Pos)
#define SYS_PRSTR1_SDRAM_Pos 12
#define SYS_PRSTR1_SDRAM_Msk (0x01 << SYS_PRSTR1_SDRAM_Pos)
#define SYS_PRSTR1_SFC_Pos 13
#define SYS_PRSTR1_SFC_Msk (0x01 << SYS_PRSTR1_SFC_Pos)
#define SYS_PRSTR1_ADC1_Pos 16
#define SYS_PRSTR1_ADC1_Msk (0x01 << SYS_PRSTR1_ADC1_Pos)
#define SYS_PRSTR1_CAN1_Pos 17
#define SYS_PRSTR1_CAN1_Msk (0x01 << SYS_PRSTR1_CAN1_Pos)
#define SYS_PRSTR1_RTC_Pos 19
#define SYS_PRSTR1_RTC_Msk (0x01 << SYS_PRSTR1_RTC_Pos)
#define SYS_PRSTR1_IOFILT_Pos 20
@@ -491,6 +491,10 @@ typedef struct {
#define SYS_PRSTR1_BTIMR_Msk (0x01 << SYS_PRSTR1_BTIMR_Pos)
#define SYS_PRSTR1_JPEG_Pos 25
#define SYS_PRSTR1_JPEG_Msk (0x01 << SYS_PRSTR1_JPEG_Pos)
#define SYS_PRSTR1_DAC_Pos 26
#define SYS_PRSTR1_DAC_Msk (0x01 << SYS_PRSTR1_DAC_Pos)
#define SYS_PRSTR1_QEI_Pos 27
#define SYS_PRSTR1_QEI_Msk (0x01 << SYS_PRSTR1_QEI_Pos)
#define SYS_HRCCR_ON_Pos 0 //High speed RC ON
#define SYS_HRCCR_ON_Msk (0x01 << SYS_HRCCR_ON_Pos)
@@ -612,12 +616,12 @@ typedef struct {
#define SYS_ACMPSR_CMP2IF_Pos 10
#define SYS_ACMPSR_CMP2IF_Msk (0x01 << SYS_ACMPSR_CMP2IF_Pos)
#define SYS_ACMPCR2_HALL0_Pos 0 //1 ACMP0输出连接HALL0输入
#define SYS_ACMPCR2_HALL0_Msk (0x01 << SYS_ACMPCR2_HALL0_Pos)
#define SYS_ACMPCR2_HALL1_Pos 1
#define SYS_ACMPCR2_HALL1_Msk (0x01 << SYS_ACMPCR2_HALL1_Pos)
#define SYS_ACMPCR2_HALL2_Pos 2
#define SYS_ACMPCR2_HALL2_Msk (0x01 << SYS_ACMPCR2_HALL2_Pos)
#define SYS_ACMPCR2_BRK0_Pos 0 //1 ACMP0输出连接用作PWM_BRK0
#define SYS_ACMPCR2_BRK0_Msk (0x01 << SYS_ACMPCR2_BRK0_Pos)
#define SYS_ACMPCR2_BRK1_Pos 1 //1 ACMP1输出连接用作PWM_BRK1
#define SYS_ACMPCR2_BRK1_Msk (0x01 << SYS_ACMPCR2_BRK1_Pos)
#define SYS_ACMPCR2_BRK2_Pos 2
#define SYS_ACMPCR2_BRK2_Msk (0x01 << SYS_ACMPCR2_BRK2_Pos)
#define SYS_ACMPCR2_VREF_Pos 3 //ACMP内部基准电压VREF,电压值为 0.6 + 0.04*VREF
#define SYS_ACMPCR2_VREF_Msk (0x3F << SYS_ACMPCR2_VREF_Pos)
@@ -626,10 +630,6 @@ typedef struct {
#define SYS_TEMPCR_EN_Pos 0
#define SYS_TEMPCR_EN_Msk (0x01 << SYS_TEMPCR_EN_Pos)
#define SYS_TEMPCR_TRIM_Pos 4
#define SYS_TEMPCR_TRIM_Msk (0x3F << SYS_TEMPCR_TRIM_Pos)
#define SYS_TEMPCR_AD0CH7_Pos 16 //ADC0 CH7通道测量信号选择,0 外部输入 1 温度传感器输出
#define SYS_TEMPCR_AD0CH7_Msk (0x03 << SYS_TEMPCR_AD0CH7_Pos)
@@ -754,6 +754,11 @@ typedef struct {
} TIMR_TypeDef;
#define TIMR_LOAD_VALUE_Pos 0
#define TIMR_LOAD_VALUE_Msk (0xFFFFFF << TIMR_LOAD_VALUE_Pos)
#define TIMR_LOAD_RELOAD_Pos 24 //reload VALUE to TIMR's internal Counter immediately. only for BTIMRx, not for TIMRx.
#define TIMR_LOAD_RELOAD_Msk (0x01 << TIMR_LOAD_RELOAD_Pos)
#define TIMR_CR_CLKSRC_Pos 0 //时钟源: 0 内部系统时钟 2 外部引脚脉冲计数
#define TIMR_CR_CLKSRC_Msk (0x03 << TIMR_CR_CLKSRC_Pos)
#define TIMR_CR_MODE_Pos 2 //工作模式:0 定时器 1 输入捕获 2 输出比较
@@ -1001,6 +1006,8 @@ typedef struct {
#define UART_RTSCR_STAT_Pos 8 //RTS信号的当前状态
#define UART_RTSCR_STAT_Msk (0x01 << UART_RTSCR_STAT_Pos)
#define UART_CFG_RXEN_Pos 0 //RX Enable
#define UART_CFG_RXEN_Msk (0x01 << UART_CFG_RXEN_Pos)
#define UART_CFG_MSBF_Pos 1 //接收发送MSB First
#define UART_CFG_MSBF_Msk (0x01 << UART_CFG_MSBF_Pos)
#define UART_CFG_BRKTXLEN_Pos 2 //1表示1bit,以此类推,默认值13
@@ -1366,7 +1373,7 @@ typedef struct {
#define ADC_GO_SEQ1_Pos 1
#define ADC_GO_SEQ1_Msk (0x01 << ADC_GO_SEQ1_Pos)
#define ADC_GO_SEQ2_Pos 2
#define ADC_GO_SEQ2_Msk (0x01 << ADC_GO_SEQ3_Pos)
#define ADC_GO_SEQ2_Msk (0x01 << ADC_GO_SEQ2_Pos)
#define ADC_GO_SEQ3_Pos 3
#define ADC_GO_SEQ3_Msk (0x01 << ADC_GO_SEQ3_Pos)
#define ADC_GO_BUSY_Pos 4
@@ -1493,7 +1500,7 @@ typedef struct {
#define ADC_CMP_MIN_Pos 16
#define ADC_CMP_MIN_Msk (0xFFF<< ADC_CMP_MIN_Pos)
#define ADC_SEQCHN0_SEQ0_Pos 0 //序列0通道选择,8位对应8个通道,bitx置位表示将通道x加入序列0
#define ADC_SEQCHN0_SEQ0_Pos 0 //序列0通道选择,12位对应12个通道,bitx置位表示将通道x加入序列0
#define ADC_SEQCHN0_SEQ0_Msk (0xFFF << ADC_SEQCHN0_SEQ0_Pos)
#define ADC_SEQCHN0_SEQ1_Pos 16
#define ADC_SEQCHN0_SEQ1_Msk (0xFFF << ADC_SEQCHN0_SEQ1_Pos)
@@ -2558,6 +2565,8 @@ typedef struct {
#define LCD_CR_CLKALW_Msk (0x01 << LCD_CR_CLKALW_Pos)
#define LCD_CR_BURSTEN_Pos 8 //Burst Enable,0 只进行SINGLE读 1 优先Burst读
#define LCD_CR_BURSTEN_Msk (0x01 << LCD_CR_BURSTEN_Pos)
#define LCD_CR_BURSTLEN_Pos 9 //Burst Length,0 Burst INCR4 1 Burst INCR8
#define LCD_CR_BURSTLEN_Msk (0x01 << LCD_CR_BURSTLEN_Pos)
#define LCD_CR_AUTORESTA_Pos 13 //Auto Restart,1 刷新完一帧后自动重启刷新
#define LCD_CR_AUTORESTA_Msk (0x01 << LCD_CR_AUTORESTA_Pos)
#define LCD_CR_IMMRELOAD_Pos 14 //Immediate Reload,立即将层配置寄存器的值加载到层工作寄存器
@@ -2574,8 +2583,6 @@ typedef struct {
#define LCD_CR_VSYNCINV_Msk (0x01 << LCD_CR_VSYNCINV_Pos)
#define LCD_CR_HSYNCINV_Pos 20 //1 HSYNC反相输出
#define LCD_CR_HSYNCINV_Msk (0x01 << LCD_CR_HSYNCINV_Pos)
#define LCD_CR_BURSTLEN_Pos 21 //Burst Length,0 Burst INCR4 1 Burst INCR8 2 Burst INCR16
#define LCD_CR_BURSTLEN_Msk (0x03 << LCD_CR_BURSTLEN_Pos)
#define LCD_CRH_HSW_Pos 0 //Hsync Width, 输出HSYNC低电平持续多少个DOTCLK周期,0表示1个周期
#define LCD_CRH_HSW_Msk (0xFF << LCD_CRH_HSW_Pos)
@@ -2675,8 +2682,8 @@ typedef struct {
#define DMA2D_PFCCR_AINV_Msk (0x01 << DMA2D_PFCCR_AINV_Pos)
#define DMA2D_PFCCR_RBSWAP_Pos 4 //RB Swap, 0 RGB 1 BGR
#define DMA2D_PFCCR_RBSWAP_Msk (0x01 << DMA2D_PFCCR_RBSWAP_Pos)
#define DAM2D_PFCCR_AMODE_Pos 8 //Alpha Mode, 0 使用像素点自带Alpha值 1 使用PFCCR.ALPHA值 2 使用像素点自带Alpha值与PFCCR.ALPHA值的乘积
#define DMA2D_PFCCR_AMODE_Msk (0x03 << DAM2D_PFCCR_AMODE_Pos)
#define DMA2D_PFCCR_AMODE_Pos 8 //Alpha Mode, 0 使用像素点自带Alpha值 1 使用PFCCR.ALPHA值 2 使用像素点自带Alpha值与PFCCR.ALPHA值的乘积
#define DMA2D_PFCCR_AMODE_Msk (0x03 << DMA2D_PFCCR_AMODE_Pos)
#define DMA2D_PFCCR_ALPHA_Pos 24
#define DMA2D_PFCCR_ALPHA_Msk (0xFFu<< DMA2D_PFCCR_ALPHA_Pos)
@@ -2703,8 +2710,8 @@ typedef struct {
#define SDRAMC_TIM_TRCD_Pos 0 //Row to column delay, Ie. Activate to Command delay
#define SDRAMC_TIM_TRCD_Msk (0x03 << SDRAMC_TIM_TRCD_Pos)
#define SDRAMC_TIM_TRFC_Pos 2 //Refresh Cycle
#define SDRAMC_TIM_TRFC_Msk (0x0F << SDRAMC_TIM_TRFC_Pos)
#define SDRAMC_TIM_TRC_Pos 2 //Activate to Activate on same bank
#define SDRAMC_TIM_TRC_Msk (0x0F << SDRAMC_TIM_TRC_Pos)
#define SDRAMC_TIM_TRP_Pos 6 //Row precharge time, Ie. Precharge to Activate delay
#define SDRAMC_TIM_TRP_Msk (0x03 << SDRAMC_TIM_TRP_Pos)
#define SDRAMC_TIM_T100US_Pos 8
@@ -2856,7 +2863,7 @@ typedef struct {
__IO uint32_t ADDR;
__IO uint32_t FMC_ERASE;
__IO uint32_t ERASE;
__IO uint32_t CACHE;
@@ -4005,4 +4012,51 @@ typedef struct {
#include "SWM341_iofilt.h"
#ifdef SW_LOG_RTT
#define log_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)
#else
#define log_printf(...) printf(__VA_ARGS__)
#endif
#ifndef SW_LOG_LEVEL
#define SW_LOG_LEVEL 0
#endif
#if (SW_LOG_LEVEL > 0)
#define SW_LOG_ERR(...) { \
log_printf("ERROR: "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#if (SW_LOG_LEVEL > 1)
#define SW_LOG_WARN(...) { \
log_printf("WARN : "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#if (SW_LOG_LEVEL > 2)
#define SW_LOG_INFO(...) { \
log_printf("INFO : "); \
log_printf(__VA_ARGS__); \
log_printf("\n"); \
}
#else
#define SW_LOG_INFO(...)
#endif
#else
#define SW_LOG_WARN(...)
#define SW_LOG_INFO(...)
#endif
#else
#define SW_LOG_ERR(...)
#define SW_LOG_WARN(...)
#define SW_LOG_INFO(...)
#endif
#endif //__SWM341_H__
@@ -135,8 +135,8 @@ void ADC_SEQ_Init(ADC_TypeDef * ADCx, uint32_t seq, ADC_SEQ_InitStructure * init
ADCx->SEQCOV &= ~(0xFFu << pos);
ADCx->SEQCOV |= ((initStruct->conv_cnt ? initStruct->conv_cnt - 1 : 0) << pos);
ADCx->SEQSMP &= ~(0xFFu << pos);
ADCx->SEQSMP |= (initStruct->samp_tim << pos);
ADCx->SEQSMP &= ~(0x0Fu << (pos >> 1));
ADCx->SEQSMP |= (initStruct->samp_tim << (pos >> 1));
}
/******************************************************************************************************************************************
@@ -392,7 +392,8 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint32_t filter, uint16_t check1, uint
* 函数名称: CAN_INTEn()
* 功能说明: 使能指定中断
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN0、CAN1
* uint32_t it interrupt type,有效值包括CAN_INT_RX_NOTEMPTY、CAN_INT_RX_OVERFLOW、CAN_INT_TX_EMPTY、...
* uint32_t it interrupt type,有效值包括 CAN_IT_RX_NOTEMPTY、CAN_IT_RX_OVERFLOW、CAN_IT_TX_EMPTY、CAN_IT_ARBLOST、
* CAN_IT_ERR、CAN_IT_ERR_WARN、CAN_IT_ERR_PASS、CAN_IT_WAKEUP 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -405,7 +406,8 @@ void CAN_INTEn(CAN_TypeDef * CANx, uint32_t it)
* 函数名称: CAN_INTDis()
* 功能说明: 关闭指定中断
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN0、CAN1
* uint32_t it interrupt type,有效值包括CAN_INT_RX_NOTEMPTY、CAN_INT_RX_OVERFLOW、CAN_INT_TX_EMPTY、...
* uint32_t it interrupt type,有效值包括 CAN_IT_RX_NOTEMPTY、CAN_IT_RX_OVERFLOW、CAN_IT_TX_EMPTY、CAN_IT_ARBLOST、
* CAN_IT_ERR、CAN_IT_ERR_WARN、CAN_IT_ERR_PASS、CAN_IT_WAKEUP 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
@@ -414,9 +416,22 @@ void CAN_INTDis(CAN_TypeDef * CANx, uint32_t it)
CANx->IE &= ~it;
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTClr()
* 功能说明: 清除中断标志
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN0、CAN1
* uint32_t it interrupt type,有效值包括 CAN_IT_RX_OVERFLOW
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void CAN_INTClr(CAN_TypeDef * CANx, uint32_t it)
{
CANx->CMD = (1 << CAN_CMD_CLROV_Pos);
}
/******************************************************************************************************************************************
* 函数名称: CAN_INTStat()
* 功能说明: 查询指定中断状态
* 功能说明: 查询中断状态
* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN0、CAN1
* 输 出: uint32_t 当前中断状态
* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
@@ -69,14 +69,17 @@ typedef struct {
#define CAN_FILTER_15 14
#define CAN_FILTER_16 15
#define CAN_INT_RX_NOTEMPTY (0x01 << 0) //RX Buffer Not Empty
#define CAN_INT_RX_OVERFLOW (0x01 << 3) //RX Buffer Overflow
#define CAN_INT_TX_EMPTY (0x01 << 1) //TX Buffer Empty
#define CAN_INT_ARBLOST (0x01 << 6) //Arbitration lost
#define CAN_INT_ERR (0x01 << 7)
#define CAN_INT_ERR_WARN (0x01 << 2) //TXERR/RXERR计数值达到Error Warning Limit
#define CAN_INT_ERR_PASS (0x01 << 5) //TXERR/RXERR计数值达到127
#define CAN_INT_WAKEUP (0x01 << 4)
/* Interrupt Type */
#define CAN_IT_RX_NOTEMPTY (0x01 << 0) //RX Buffer Not Empty
#define CAN_IT_RX_OVERFLOW (0x01 << 3) //RX Buffer Overflow
#define CAN_IT_TX_EMPTY (0x01 << 1) //TX Buffer Empty
#define CAN_IT_ARBLOST (0x01 << 6) //Arbitration lost
#define CAN_IT_ERR (0x01 << 7)
#define CAN_IT_ERR_WARN (0x01 << 2) //TXERR/RXERR计数值达到Error Warning Limit
#define CAN_IT_ERR_PASS (0x01 << 5) //TXERR/RXERR计数值达到127
#define CAN_IT_WAKEUP (0x01 << 4)
typedef struct {
@@ -111,6 +114,7 @@ void CAN_SetFilter16b(CAN_TypeDef * CANx, uint32_t filter, uint16_t check1, uint
void CAN_INTEn(CAN_TypeDef * CANx, uint32_t it);
void CAN_INTDis(CAN_TypeDef * CANx, uint32_t it);
void CAN_INTClr(CAN_TypeDef * CANx, uint32_t it);
uint32_t CAN_INTStat(CAN_TypeDef * CANx);
@@ -39,6 +39,9 @@ void DAC_Init(DAC_TypeDef * DACx, uint32_t format)
break;
}
SYS->DACCR &= ~SYS_DACCR_VRADJ_Msk;
SYS->DACCR |= ((SYS->BACKUP[2] & 0x1F) << SYS_DACCR_VRADJ_Pos);
DACx->CR = (format << DAC_CR_DHRFMT_Pos);
}
@@ -51,11 +54,11 @@ void DAC_Init(DAC_TypeDef * DACx, uint32_t format)
******************************************************************************************************************************************/
void DAC_Open(DAC_TypeDef * DACx)
{
DACx->CR |= (1 << ADC_CR_EN_Pos);
DACx->CR |= (1 << DAC_CR_EN_Pos);
}
/******************************************************************************************************************************************
* 函数名称: DAC_Init()
* 函数名称: DAC_Close()
* 功能说明: DAC 关闭
* 输 入: DAC_TypeDef * DACx 指定要被设置的DAC接口,有效值包括DAC
* 输 出: 无
@@ -21,6 +21,7 @@
#include "SWM341.h"
#include "SWM341_dma.h"
/******************************************************************************************************************************************
* 函数名称: DMA_CH_Init()
* 功能说明: DMA通道初始化
@@ -36,7 +37,7 @@ void DMA_CH_Init(uint32_t chn, DMA_InitStructure * initStruct)
DMA_CH_Close(chn); //关闭后配置
DMA->CH[chn].CR = (initStruct->Mode << DMA_CR_AUTORE_Pos) |
((initStruct->Count - 1) << DMA_CR_LEN_Pos);
((initStruct->Count ? initStruct->Count - 1 : 0) << DMA_CR_LEN_Pos);
DMA->CH[chn].SRC = initStruct->SrcAddr;
DMA->CH[chn].DST = initStruct->DstAddr;
@@ -69,15 +70,35 @@ void DMA_CH_Init(uint32_t chn, DMA_InitStructure * initStruct)
break;
}
int totalBytes = initStruct->Count * (1 << initStruct->Unit);
if(initStruct->DstAddrInc == 2) // Destination Scatter-Gather Transfer
{
DMA->CH[chn].DSTSGADDR1 = initStruct->DstAddr + totalBytes / 4 * 1;
DMA->CH[chn].DSTSGADDR2 = initStruct->DstAddr + totalBytes / 4 * 2;
DMA->CH[chn].DSTSGADDR3 = initStruct->DstAddr + totalBytes / 4 * 3;
}
if(initStruct->SrcAddrInc == 2) // Source Scatter-Gather Transfer
{
DMA->CH[chn].SRCSGADDR1 = initStruct->SrcAddr + totalBytes / 4 * 1;
DMA->CH[chn].SRCSGADDR2 = initStruct->SrcAddr + totalBytes / 4 * 2;
DMA->CH[chn].SRCSGADDR3 = initStruct->SrcAddr + totalBytes / 4 * 3;
}
DMA->PRI &= ~(1 << chn);
DMA->PRI |= (initStruct->Priority << chn);
DMA->IF = (1 << chn); //清除中断标志
DMA->IE |= (1 << chn);
if(initStruct->DoneIE) DMA->IM &= ~(1 << chn);
else DMA->IM |= (1 << chn);
DMA->IM |= (1 << chn); // 默认全部关闭
DMA->DSTSGIM |= (3 << (chn * 2));
DMA->SRCSGIM |= (3 << (chn * 2));
DMA->IE |= (1 << chn); // 标志总是可查
DMA->DSTSGIE |= (3 << (chn * 2));
DMA->SRCSGIE |= (3 << (chn * 2));
if(initStruct->DoneIE) NVIC_EnableIRQ(DMA_IRQn);
DMA_CH_INTClr(chn, initStruct->INTEn);
DMA_CH_INTEn(chn, initStruct->INTEn);
if(initStruct->INTEn) NVIC_EnableIRQ(DMA_IRQn);
}
/******************************************************************************************************************************************
@@ -105,49 +126,117 @@ void DMA_CH_Close(uint32_t chn)
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTEn()
* 功能说明: DMA中断使能,数据搬运完成后触发中断
* 函数名称: DMA_CH_SetCount()
* 功能说明: 设置传输 Unit 个数
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t count 传输 Unit 个数,最大取值0x100000
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn)
void DMA_CH_SetCount(uint32_t chn, uint32_t count)
{
DMA->IM &= ~(1 << chn);
DMA->CH[chn].CR &= ~DMA_CR_LEN_Msk;
DMA->CH[chn].CR |= ((count - 1) << DMA_CR_LEN_Pos);
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_GetRemaining()
* 功能说明: 查询剩余的传输 Unit 个数
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* 输 出: uint32_t 剩余的传输 Unit 个数
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t DMA_CH_GetRemaining(uint32_t chn)
{
return (DMA->CH[chn].DSTSR & DMA_DSTSR_LEN_Msk);
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_SetSrcAddress()
* 功能说明: 设置传输源地址
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t address 源地址
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_SetSrcAddress(uint32_t chn, uint32_t address)
{
DMA->CH[chn].SRC = address;
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_SetDstAddress()
* 功能说明: 设置传输目的地址
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t address 目的地址
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_SetDstAddress(uint32_t chn, uint32_t address)
{
DMA->CH[chn].DST = address;
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTEn()
* 功能说明: DMA中断使能
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t it interrupt type,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、
* DMA_IT_SRCSG_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn, uint32_t it)
{
DMA->IM &= ~(it << chn);
DMA->DSTSGIM &= ~((it >> 8) << (chn * 2));
DMA->SRCSGIM &= ~((it >> 16) << (chn * 2));
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTDis()
* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
* 功能说明: DMA中断禁止
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t it interrupt type,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、
* DMA_IT_SRCSG_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTDis(uint32_t chn)
void DMA_CH_INTDis(uint32_t chn, uint32_t it)
{
DMA->IM |= (1 << chn);
DMA->IM |= (it << chn);
DMA->DSTSGIM |= ((it >> 8) << (chn * 2));
DMA->SRCSGIM |= ((it >> 16) << (chn * 2));
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTClr()
* 功能说明: DMA中断标志清除
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* uint32_t it interrupt type,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、
* DMA_IT_SRCSG_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTClr(uint32_t chn)
void DMA_CH_INTClr(uint32_t chn, uint32_t it)
{
DMA->IF = (1 << chn);
DMA->IF = (it << chn);
DMA->DSTSGIF = ((it >> 8) << (chn * 2));
DMA->SRCSGIF = ((it >> 16) << (chn * 2));
}
/******************************************************************************************************************************************
* 函数名称: DMA_CH_INTStat()
* 功能说明: DMA中断状态查询
* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2、DMA_CH3
* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
* uint32_t it interrupt type,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、
* DMA_IT_SRCSG_DONE 及其“或”
* 输 出: uint32_t 1 指定中断已发生 0 指定中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t DMA_CH_INTStat(uint32_t chn)
uint32_t DMA_CH_INTStat(uint32_t chn, uint32_t it)
{
return (DMA->IF & (1 << chn)) ? 1 : 0;
return ((DMA->IF & (it << chn)) ||
(DMA->DSTSGIF & ((it >> 8) << (chn * 2))) ||
(DMA->SRCSGIF & ((it >> 16) << (chn * 2))));
}
@@ -21,7 +21,7 @@ typedef struct {
uint8_t Priority; //DMA_PRI_LOW、DMA_PRI_HIGH
uint8_t DoneIE; //传输完成中断使能
uint32_t INTEn; //中断使能,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、DMA_IT_SRCSG_DONE 及其“或”
} DMA_InitStructure;
@@ -97,15 +97,28 @@ typedef struct {
#define DMA_EXHS_TRIG1 (6 | DMA_HS_EXT | DMA_DIR_RX) // DMA_TRIG1引脚
/* Interrupt Type */
#define DMA_IT_DONE (1 << 0) //Transfer Done
#define DMA_IT_DSTSG_HALF (1 << 8) //Destination Scatter-Gather Transfer Half
#define DMA_IT_DSTSG_DONE (1 << 9) //Destination Scatter-Gather Transfer Done
#define DMA_IT_SRCSG_HALF (1 << 16) //Source Scatter-Gather Transfer Half
#define DMA_IT_SRCSG_DONE (1 << 17) //Source Scatter-Gather Transfer Done
void DMA_CH_Init(uint32_t chn, DMA_InitStructure * initStruct); //DMA通道配置
void DMA_CH_Open(uint32_t chn);
void DMA_CH_Close(uint32_t chn);
void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
void DMA_CH_SetCount(uint32_t chn, uint32_t count);
void DMA_CH_SetSrcAddress(uint32_t chn, uint32_t address);
void DMA_CH_SetDstAddress(uint32_t chn, uint32_t address);
uint32_t DMA_CH_GetRemaining(uint32_t chn);
void DMA_CH_INTEn(uint32_t chn, uint32_t it); //DMA中断使能
void DMA_CH_INTDis(uint32_t chn, uint32_t it); //DMA中断禁止
void DMA_CH_INTClr(uint32_t chn, uint32_t it); //DMA中断标志清除
uint32_t DMA_CH_INTStat(uint32_t chn, uint32_t it); //DMA中断状态查询
#endif //__SWM341_DMA_H__
@@ -135,14 +135,14 @@ void DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * bgLayer
{
DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
DMA2D->L[DMA2D_LAYER_FG].OR = fgLayer->LineOffset;
DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
(fgLayer->AlphaMode << DAM2D_PFCCR_AMODE_Pos) |
DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
(fgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
(fgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
DMA2D->L[DMA2D_LAYER_BG].MAR = bgLayer->Address;
DMA2D->L[DMA2D_LAYER_BG].OR = bgLayer->LineOffset;
DMA2D->L[DMA2D_LAYER_BG].PFCCR = (bgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
(bgLayer->AlphaMode << DAM2D_PFCCR_AMODE_Pos) |
DMA2D->L[DMA2D_LAYER_BG].PFCCR = (bgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
(bgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
(bgLayer->Alpha << DMA2D_PFCCR_ALPHA_Pos);
DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
@@ -111,7 +111,7 @@ void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
******************************************************************************************************************************************/
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->ODR |= (0x01 << n);
*(&GPIOx->DATAPIN0 + n) = 1;
}
/******************************************************************************************************************************************
@@ -124,7 +124,7 @@ void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
******************************************************************************************************************************************/
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->ODR &= ~(0x01 << n);
*(&GPIOx->DATAPIN0 + n) = 0;
}
/******************************************************************************************************************************************
@@ -137,7 +137,7 @@ void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
******************************************************************************************************************************************/
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
GPIOx->ODR ^= (0x01 << n);
*(&GPIOx->DATAPIN0 + n) = 1 - *(&GPIOx->DATAPIN0 + n);
}
/******************************************************************************************************************************************
@@ -150,7 +150,7 @@ void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
******************************************************************************************************************************************/
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
return ((GPIOx->IDR >> n) & 0x01);
return *(&GPIOx->DATAPIN0 + n);
}
/******************************************************************************************************************************************
@@ -226,45 +226,6 @@ uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
return ((GPIOx->IDR >> n) & bits);
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBit()
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*(&GPIOx->DATAPIN0 + n) = 1;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicClrBit()
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*(&GPIOx->DATAPIN0 + n) = 0;
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicInvBit()
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输 出: 无
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
{
*(&GPIOx->DATAPIN0 + n) = 1 - *(&GPIOx->DATAPIN0 + n);
}
/******************************************************************************************************************************************
* 函数名称: GPIO_AtomicSetBits()
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
@@ -4,6 +4,16 @@
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down, uint32_t open_drain); //引脚初始化,包含引脚方向、上拉、下拉、开漏
#define GPIO_INPUT ((0 << 0) | (0 << 1) | (0 << 2) | (0 << 3))
#define GPIO_INPUT_PullUp ((0 << 0) | (1 << 1) | (0 << 2) | (0 << 3))
#define GPIO_INPUT_PullDown ((0 << 0) | (0 << 1) | (1 << 2) | (0 << 3))
#define GPIO_OUTPUT ((1 << 0) | (0 << 1) | (0 << 2) | (0 << 3))
#define GPIO_OUTPUT_OpenDrain ((1 << 0) | (0 << 1) | (0 << 2) | (1 << 3))
#define GPIO_OUTPUT_OpenDrain_PullUp ((1 << 0) | (1 << 1) | (0 << 2) | (1 << 3))
#define GPIO_INIT(GPIOx, n, mode) GPIO_Init(GPIOx, n, (mode & 1) ? 1 : 0, (mode & 2) ? 1 : 0, (mode & 4) ? 1 : 0, (mode & 8) ? 1 : 0)
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); //将参数指定的引脚电平反转
@@ -13,12 +23,16 @@ void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t 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);
// for compatibility
#define GPIO_AtomicSetBit GPIO_SetBit
#define GPIO_AtomicClrBit GPIO_ClrBit
#define GPIO_AtomicInvBit GPIO_InvBit
#endif //__SWM341_GPIO_H__
@@ -47,7 +47,7 @@ void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
((initStruct->Format & 1) << LCD_CR_FORMAT_Pos) |
((initStruct->Format >> 1) << LCD_CR_SEREN_Pos) |
(1 << LCD_CR_BURSTEN_Pos) |
(0 << LCD_CR_BURSTLEN_Pos) |
(1 << LCD_CR_BURSTLEN_Pos) |
((1-initStruct->IntEOTEn) << LCD_CR_AUTORESTA_Pos);
LCDx->CRH = ((initStruct->HsyncWidth - 1) << LCD_CRH_HSW_Pos) |
File diff suppressed because it is too large Load Diff
@@ -44,6 +44,18 @@ typedef struct {
uint8_t Second;
} RTC_DateTime;
/* Interrupt Type */
#define RTC_IT_SECOND (1 << 0) //Second Interrupt
#define RTC_IT_MINUTE (1 << 1)
#define RTC_IT_HOUR (1 << 2)
#define RTC_IT_DATE (1 << 3)
#define RTC_IT_ALARM (1 << 4)
#define RTC_IT_SECOND_DIV2 (1 << 6) //1/2 Second Interrupt
#define RTC_IT_SECOND_DIV4 (1 << 7) //1/4 Second Interrupt
void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct);
void RTC_Start(RTC_TypeDef * RTCx);
void RTC_Stop(RTC_TypeDef * RTCx);
@@ -53,25 +65,9 @@ void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct);
void RTC_IntSecondEn(RTC_TypeDef * RTCx);
void RTC_IntSecondDis(RTC_TypeDef * RTCx);
void RTC_IntSecondClr(RTC_TypeDef * RTCx);
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_INTEn(RTC_TypeDef * RTCx, uint32_t it);
void RTC_INTDis(RTC_TypeDef * RTCx, uint32_t it);
void RTC_INTClr(RTC_TypeDef * RTCx, uint32_t it);
uint32_t RTC_INTStat(RTC_TypeDef * RTCx, uint32_t it);
#endif //__SWM341_RTC_H__
File diff suppressed because it is too large Load Diff
@@ -34,6 +34,13 @@
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
#define SD_CMD53_ARG_Count 0 // 0x001 1 0x002 2 ... 0x1FF 512 0x000 512 byte
#define SD_CMD53_ARG_Addr 9 // Start Address of I/O register to read or write
#define SD_CMD53_ARG_AddrInc 26 // 0 Multi byte R/W to fixed address 1 Multi byte R/W to incrementing address
#define SD_CMD53_ARG_CountUnit 27 // 0 Count in byte 1 Count in block
#define SD_CMD53_ARG_Function 28 // The number of the function within the I/O card you wish to read or write. Function 0x00 selects the common I/O area (CIA).
#define SD_CMD53_ARG_nRW 31 // 0 for read 1 for write
#define SD_RESP_NO 0 //0 无响应
#define SD_RESP_32b 2 //2 32位响应
@@ -48,6 +55,15 @@
#define SD_RES_TIMEOUT 2
/* Card Status return by response R1 */
#define SD_CS_APP_CMD (1 << 5) // The card will expect ACMD
#define SD_CS_READY_FOR_DATA (1 << 8) // Corresponds to buffer empty signaling on the bus
#define SD_CS_CURRENT_STATE (1 << 9) // The state of the card when receiving the command. 共 4 位
#define SD_CS_CARD_ECC_FAILED (1 << 21)
#define SD_CS_ILLEGAL_COMMAND (1 << 22)
#define SD_CS_CARD_IS_LOCKED (1 << 25)
typedef struct
{
__IO uint8_t CSDStruct; // CSD structure
@@ -144,4 +160,15 @@ void parseCSD(uint32_t CID_Tab[4]);
uint32_t calcSDCLKDiv(uint32_t freq_sel);
enum SDIO_bus_width { SDIO_1bit = 0, SDIO_4bit = 1 };
uint32_t SDIO_IO_Init(uint32_t freq, enum SDIO_bus_width w);
uint32_t SDIO_IO_ByteWrite(uint8_t func, uint32_t addr, uint8_t data);
uint32_t SDIO_IO_ByteRead(uint8_t func, uint32_t addr, uint8_t * data);
uint32_t SDIO_IO_BlockWrite(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_size);
uint32_t SDIO_IO_BlockRead(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_size);
uint32_t SDIO_IO_MultiBlockWrite(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_count);
uint32_t SDIO_IO_MultiBlockRead(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_count);
#endif //__SWM341_SDIO_H__
@@ -35,9 +35,9 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
SYS->CLKEN1 |= (1 << SYS_CLKEN1_SDRAM_Pos);
SDRAMC->TIM = (initStruct->TimeTRP << SDRAMC_TIM_TRP_Pos) |
SDRAMC->TIM = (initStruct->TimeTRP << SDRAMC_TIM_TRP_Pos) |
(initStruct->TimeTRCD << SDRAMC_TIM_TRCD_Pos) |
(initStruct->TimeTRFC << SDRAMC_TIM_TRFC_Pos) |
(initStruct->TimeTRC << SDRAMC_TIM_TRC_Pos) |
((cyclesPerUs * 200) << SDRAMC_TIM_T100US_Pos); // 要求大于100us
SDRAMC->CFG = (initStruct->Size << SDRAMC_CFG_SIZE_Pos) |
@@ -54,7 +54,7 @@ void SDRAM_Init(SDRAM_InitStructure * initStruct)
default: row_n = 4096; break;
}
SDRAMC->T64 = (64*1000 / row_n + 1) * cyclesPerUs;
SDRAMC->T64 = (initStruct->RefreshTime * 1000 / row_n + 1) * cyclesPerUs;
SDRAMC->CR = (1 << SDRAMC_CR_PWRON_Pos);
@@ -5,20 +5,22 @@ typedef struct {
uint8_t Size; // SDRAM 容量,SDRAM_SIZE_2MB、SDRAM_SIZE_8MB、SDRAM_SIZE_16MB、SDRAM_SIZE_32MB
uint8_t ClkDiv; // SDRAM 时钟分频,SDRAM_CLKDIV_1、SDRAM_CLKDIV_2
uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
uint8_t RefreshTime; // 刷新时间,单位 ms,在这个时间内 SDRAM 必须完成一次整片刷新,通常为 64ms
uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
uint8_t TimeTRFC; // Refresh Cycle
uint8_t TimeTRC; // Row cycle time, Activate to Activate on same bank
// 若 SDRAM 颗粒除了 tRC,还有 tRFC 或 tRRC 参数,则按照二者中较大的计算 TimeTRC
} SDRAM_InitStructure;
//rowaddr bankaddr coladdr
#define SDRAM_SIZE_2MB 3 //HADDR[20:10] HADDR[9] HADDR[8:1]
#define SDRAM_SIZE_8MB 0 //HADDR[22:11] HADDR[10:9] HADDR[8:1]
#define SDRAM_SIZE_16MB 1 //HADDR[23:12] HADDR[11:10] HADDR[9:1]
#define SDRAM_SIZE_32MB 2 //HADDR[24:12] HADDR[11:10] HADDR[9:1]
// rowaddr bankaddr coladdr
#define SDRAM_SIZE_2MB 3 // HADDR[20:10] HADDR[9] HADDR[8:1]
#define SDRAM_SIZE_8MB 0 // HADDR[22:11] HADDR[10:9] HADDR[8:1]
#define SDRAM_SIZE_16MB 1 // HADDR[23:12] HADDR[11:10] HADDR[9:1]
#define SDRAM_SIZE_32MB 2 // HADDR[24:12] HADDR[11:10] HADDR[9:1]
#define SDRAM_CLKDIV_1 0
#define SDRAM_CLKDIV_2 1
#define SDRAM_CLKDIV_1 0 // 支持的 CPU 频率范围:80MHz--125MHz
#define SDRAM_CLKDIV_2 1 // 支持的 CPU 频率范围:20MHz--160Mhz
#define SDRAM_CASLATENCY_2 0
#define SDRAM_CASLATENCY_3 1
@@ -34,19 +36,19 @@ typedef struct {
#define SDRAM_TRCD_3 2
#define SDRAM_TRCD_4 3
#define SDRAM_TRFC_4 3
#define SDRAM_TRFC_5 4
#define SDRAM_TRFC_6 5
#define SDRAM_TRFC_7 6
#define SDRAM_TRFC_8 7
#define SDRAM_TRFC_9 8
#define SDRAM_TRFC_10 9
#define SDRAM_TRFC_11 10
#define SDRAM_TRFC_12 11
#define SDRAM_TRFC_13 12
#define SDRAM_TRFC_14 13
#define SDRAM_TRFC_15 14
#define SDRAM_TRFC_16 15
#define SDRAM_TRC_4 3
#define SDRAM_TRC_5 4
#define SDRAM_TRC_6 5
#define SDRAM_TRC_7 6
#define SDRAM_TRC_8 7
#define SDRAM_TRC_9 8
#define SDRAM_TRC_10 9
#define SDRAM_TRC_11 10
#define SDRAM_TRC_12 11
#define SDRAM_TRC_13 12
#define SDRAM_TRC_14 13
#define SDRAM_TRC_15 14
#define SDRAM_TRC_16 15
void SDRAM_Init(SDRAM_InitStructure * initStruct);
@@ -49,6 +49,12 @@ void SFC_Init(SFC_InitStructure * initStruct)
SFC->TIM &= ~(SFC_TIM_WIP_CHK_ITV_Msk | SFC_TIM_WIP_CHK_LMT_Msk);
SFC->TIM |= ((CyclesPerUs / 10) << SFC_TIM_WIP_CHK_ITV_Pos) | //2048 * (CyclesPerUs / 10) / CyclesPerUs us = 0.2 ms
(255 << SFC_TIM_WIP_CHK_LMT_Pos);
if((initStruct->Width_Read == SFC_RDWIDTH_4) || (initStruct->Width_PageProgram == SFC_PPWIDTH_4))
{
if(SFC_QuadState() == 0)
SFC_QuadSwitch(1);
}
}
/******************************************************************************************************************************************
@@ -66,7 +72,8 @@ uint32_t SFC_ReadJEDEC(void)
SFC->CMD = SFC_CMD_READ_JEDEC;
SFC->GO = 1;
while(SFC->GO);
__DSB(); __ISB();
while(SFC->GO) __NOP();
return SFC->DATA;
}
@@ -104,9 +111,10 @@ void SFC_EraseEx(uint32_t addr, uint8_t cmd, uint8_t wait)
(1 << SFC_CFG_CMDWREN_Pos) |
(type << SFC_CFG_CMDTYPE_Pos);
SFC->CMD = cmd;
SFC->GO = 1;
for(int i = 0; i < CyclesPerUs; i++) __NOP(); //等待命令发出
SFC->GO = 1;
__DSB(); __ISB();
while(SFC->GO) __NOP();
SFC->CFG &= ~SFC_CFG_WREN_Msk;
@@ -135,6 +143,73 @@ void SFC_Write(uint32_t addr, uint32_t buff[], uint32_t cnt)
SFC->CFG &= ~SFC_CFG_WREN_Msk;
}
#define IOSPI_CS_Low() GPIO_ClrBit(GPIOD, PIN6); __NOP(); __NOP(); __NOP(); __NOP()
#define IOSPI_CS_High() __NOP(); __NOP(); __NOP(); __NOP(); GPIO_SetBit(GPIOD, PIN6)
#define IOSPI_CLK_Low() GPIO_ClrBit(GPIOD, PIN5); __NOP(); __NOP()
#define IOSPI_CLK_High() __NOP(); __NOP(); GPIO_SetBit(GPIOD, PIN5)
#define IOSPI_MOSI_Low() GPIO_ClrBit(GPIOD, PIN8)
#define IOSPI_MOSI_High() GPIO_SetBit(GPIOD, PIN8)
#define IOSPI_MISO_Value() GPIO_GetBit(GPIOD, PIN7)
static uint8_t IOSPI_ReadWrite(uint8_t data)
{
uint8_t val = 0;
for(int i = 0; i < 8; i++)
{
IOSPI_CLK_Low();
if(data & (1 << (7 - i)))
IOSPI_MOSI_High();
else
IOSPI_MOSI_Low();
IOSPI_CLK_High();
val = (val << 1) | IOSPI_MISO_Value();
}
return val;
}
/******************************************************************************************************************************************
* 函数名称: SFC_GPIOWrite()
* 功能说明: SFC 写入较慢,大量写入时,建议用 GPIO 模拟 SPI 写入
* 输 入: uint32_t addr 数据要写入到Flash中的地址,字对齐
* uint32_t buff[] 要写入Flash中的数据
* uint32_t cnt 要写的数据的个数,以字为单位,最大64
* 输 出: 无
* 注意事项: 执行此函数前需要将相应引脚切到 GPIO 功能,使用完后再次将相应引脚切换回 SFC 功能,以便使用 SFC 擦除、读取功能
******************************************************************************************************************************************/
void SFC_GPIOWrite(uint32_t addr, uint32_t buff[], uint32_t cnt)
{
IOSPI_CS_Low();
IOSPI_ReadWrite(SFC_CMD_WRITE_ENABLE);
IOSPI_CS_High();
IOSPI_CS_Low();
IOSPI_ReadWrite(SFC_CMD_PAGE_PROGRAM);
IOSPI_ReadWrite(addr >> 16);
IOSPI_ReadWrite(addr >> 8);
IOSPI_ReadWrite(addr);
for(int i = 0; i < cnt * 4; i++)
{
IOSPI_ReadWrite(((uint8_t *)buff)[i]);
}
IOSPI_CS_High();
int busy;
do {
IOSPI_CS_Low();
IOSPI_ReadWrite(SFC_CMD_READ_STATUS_REG1);
busy = IOSPI_ReadWrite(0xFF) & (1 << SFC_STATUS_REG_BUSY_Pos);
IOSPI_CS_High();
} while(busy);
}
/******************************************************************************************************************************************
* 函数名称: SFC_Read()
* 功能说明: SPI Flash数据读取
@@ -166,7 +241,8 @@ uint8_t SFC_ReadStatusReg(uint8_t cmd)
SFC->CMD = cmd;
SFC->GO = 1;
while(SFC->GO);
__DSB(); __ISB();
while(SFC->GO) __NOP();
return SFC->DATA;
}
@@ -191,7 +267,8 @@ void SFC_WriteStatusReg(uint8_t cmd, uint16_t reg)
SFC->DATA = reg;
SFC->GO = 1;
while(SFC->GO);
__DSB(); __ISB();
while(SFC->GO) __NOP();
}
@@ -26,6 +26,8 @@ typedef struct {
#define SFC_CMD_READ_JEDEC 0x9F
#define SFC_CMD_ERASE_CHIP 0x60
#define SFC_CMD_WRITE_ENABLE 0x06
#define SFC_CMD_PAGE_PROGRAM 0x02
#define SFC_CMD_ERASE_SECTOR 0x20
#define SFC_CMD_ERASE_BLOCK32KB 0x52
#define SFC_CMD_ERASE_BLOCK64KB 0xD8 //W25Q32
@@ -46,6 +48,7 @@ uint32_t SFC_ReadJEDEC(void);
void SFC_Erase(uint32_t addr, uint8_t wait);
void SFC_EraseEx(uint32_t addr, uint8_t cmd, uint8_t wait);
void SFC_Write(uint32_t addr, uint32_t buff[], uint32_t cnt);
void SFC_GPIOWrite(uint32_t addr, uint32_t buff[], uint32_t cnt);
void SFC_Read(uint32_t addr, uint32_t buff[], uint32_t cnt);
@@ -57,7 +57,7 @@ void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
no_sync = 1;
}
SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk | SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk |
SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk | SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_FAST_Msk | SPI_CTRL_NSYNC_Msk |
SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk | SPI_CTRL_RFTHR_Msk | SPI_CTRL_TFTHR_Msk);
SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
(initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
@@ -313,12 +313,13 @@ void I2S_Init(SPI_TypeDef * SPIx, I2S_InitStructure * initStruct)
(1 << SPI_CTRL_TFCLR_Pos);
SPIx->CTRL &= ~(SPI_CTRL_RFCLR_Msk | SPI_CTRL_TFCLR_Msk);
SPIx->I2SCR &= ~(SPI_I2SCR_MSTR_Msk | SPI_I2SCR_DIEN_Msk | SPI_I2SCR_DOEN_Msk | SPI_I2SCR_FFMT_Msk | SPI_I2SCR_DLEN_Msk | SPI_I2SCR_PCMSYNW_Msk);
SPIx->I2SCR &= ~(SPI_I2SCR_MSTR_Msk | SPI_I2SCR_DIEN_Msk | SPI_I2SCR_DOEN_Msk | SPI_I2SCR_FFMT_Msk | SPI_I2SCR_DLEN_Msk | SPI_I2SCR_CHLEN_Msk | SPI_I2SCR_PCMSYNW_Msk);
SPIx->I2SCR |= ((initStruct->Mode & 0x04 ? 1 : 0) << SPI_I2SCR_MSTR_Pos) |
((initStruct->Mode & 0x02 ? 1 : 0) << SPI_I2SCR_DOEN_Pos) |
((initStruct->Mode & 0x01 ? 1 : 0) << SPI_I2SCR_DIEN_Pos) |
((initStruct->FrameFormat & 0x03) << SPI_I2SCR_FFMT_Pos) |
(initStruct->DataLen << SPI_I2SCR_DLEN_Pos) |
(initStruct->ChannelLen << SPI_I2SCR_CHLEN_Pos) |
((initStruct->FrameFormat & 0x04 ? 1 : 0) << SPI_I2SCR_PCMSYNW_Pos);
SPIx->I2SPR &= ~SPI_I2SPR_SCLKDIV_Msk;
@@ -381,27 +382,3 @@ void I2S_Close(SPI_TypeDef * SPIx)
SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
SPIx->I2SCR &= ~SPI_I2SCR_EN_Msk;
}
/******************************************************************************************************************************************
* 函数名称: I2S_MCLKConfig()
* 功能说明: I2S MCLK时钟输出配置
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
* uint32_t output_enable 是否输出MCLK时钟
* uint32_t mclk_freq MCLK时钟频率
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void I2S_MCLKConfig(SPI_TypeDef * SPIx, uint32_t output_enable, uint32_t mclk_freq)
{
if(output_enable)
{
SPIx->I2SPR &= ~SPI_I2SPR_MCLKDIV_Msk;
SPIx->I2SPR |= (SystemCoreClock / mclk_freq / 2 - 1) << SPI_I2SPR_MCLKDIV_Pos;
SPIx->I2SCR |= (1 << SPI_I2SCR_MCLKOE_Pos);
}
else
{
SPIx->I2SCR &= ~(1 << SPI_I2SCR_MCLKOE_Pos);
}
}
@@ -21,7 +21,6 @@ typedef struct {
#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
#define SPI_FORMAT_I2S 2
#define SPI_FORMAT_FLASH 3 //SPI Flash 四线读模式
#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
@@ -78,6 +77,7 @@ uint32_t SPI_INTStat(SPI_TypeDef * SPIx, uint32_t it); //中断状态查询
typedef struct {
uint8_t Mode; //I2S_MASTER_TX、I2S_MASTER_RX、I2S_MASTER_TX_RX、I2S_SLAVE_TX、I2S_SLAVE_RX、I2S_SLAVE_TX_RX
uint8_t FrameFormat; //I2S_I2S_PHILIPS、I2S_MSB_JUSTIFIED、I2S_PCM_SHORT、I2S_PCM_LONG0、I2S_PCM_LONG1
uint8_t ChannelLen; //I2S_CHNNLEN_16、I2S_CHNNLEN_32
uint8_t DataLen; //I2S_DATALEN_8、I2S_DATALEN_16、I2S_DATALEN_24、I2S_DATALEN_32
uint32_t ClkFreq; //I2S_SCLK Frequency
@@ -101,6 +101,9 @@ typedef struct {
#define I2S_PCM_LONG0 3 //PCM Long Mode Sync Width 1 SCLK period
#define I2S_PCM_LONG1 4 //PCM Long Mode Sync Width 1 Data Length
#define I2S_CHNNLEN_16 0
#define I2S_CHNNLEN_32 1
#define I2S_DATALEN_8 0
#define I2S_DATALEN_16 1
#define I2S_DATALEN_24 2
@@ -109,7 +112,6 @@ typedef struct {
void I2S_Init(SPI_TypeDef * SPIx, I2S_InitStructure * initStruct); //I2S初始化
void I2S_Open(SPI_TypeDef * SPIx); //I2S打开,允许收发
void I2S_Close(SPI_TypeDef * SPIx); //I2S关闭,禁止收发
void I2S_MCLKConfig(SPI_TypeDef * SPIx, uint32_t output_enable, uint32_t mclk_freq);
#endif //__SWM341_SPI_H__
@@ -67,7 +67,8 @@ void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
(initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
UARTx->TOCR &= ~UART_TOCR_TIME_Msk;
UARTx->TOCR |= (initStruct->TimeoutTime << UART_TOCR_TIME_Pos);
UARTx->TOCR |= (1 << UART_TOCR_MODE_Pos) |
(initStruct->TimeoutTime << UART_TOCR_TIME_Pos);
UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
@@ -369,7 +370,7 @@ uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
******************************************************************************************************************************************/
void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
{
uint32_t bits;
uint32_t bits = 0;
if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
@@ -406,145 +407,57 @@ uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdEn()
* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 触发中断
* 函数名称: UART_INTEn()
* 功能说明: 中断使能
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
void UART_INTEn(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
UARTx->CTRL |= it;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdDis()
* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 不触发中断
* 函数名称: UART_INTDis()
* 功能说明: 中断禁止
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
void UART_INTDis(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
UARTx->CTRL &= ~it;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTRXThresholdStat()
* 功能说明: 是否RX FIFO中数据个数 >= RXThreshold
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
* 注意事项: RXIF = RXTHRF & RXIE
******************************************************************************************************************************************/
uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdEn()
* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 触发中断
* 函数名称: UART_INTClr()
* 功能说明: 中断标志清除
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* uint32_t it interrupt type,有效值有 UART_IT_RX_TOUT
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
void UART_INTClr(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
if(it & UART_IT_RX_TOUT)
UARTx->TOCR |= UART_TOCR_IFCLR_Msk;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdDis()
* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 不触发中断
* 函数名称: UART_INTStat()
* 功能说明: 中断状态查询
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
* 输 出: uint32_t 1 中断已发生 0 中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXThresholdStat()
* 功能说明: 是否TX FIFO中数据个数 <= TXThreshold
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
* 注意事项: TXIF = TXTHRF & TXIE
******************************************************************************************************************************************/
uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutEn()
* 功能说明: 接收发生超时时 触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTimeoutEn(UART_TypeDef * UARTx)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutDis()
* 功能说明: 接收发生超时时 不触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTimeoutDis(UART_TypeDef * UARTx)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTimeoutStat()
* 功能说明: 是否发生了接收超时,即超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 发生了接收超时 0 未发生接收超时
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneEn()
* 功能说明: 发送FIFO空且发送移位寄存器空中断使能
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXDoneEn(UART_TypeDef * UARTx)
{
UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneDis()
* 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void UART_INTTXDoneDis(UART_TypeDef * UARTx)
{
UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: UART_INTTXDoneStat()
* 功能说明: 发送FIFO空且发送移位寄存器空中断状态
* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器未空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx)
{
return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
return (((it & UART_IT_RX_THR) && (UARTx->BAUD & UART_BAUD_RXIF_Msk)) ||
((it & UART_IT_RX_TOUT) && (UARTx->BAUD & UART_BAUD_TOIF_Msk)) ||
((it & UART_IT_TX_THR) && (UARTx->BAUD & UART_BAUD_TXIF_Msk)) ||
((it & UART_IT_TX_DONE) && (UARTx->BAUD & UART_BAUD_TXDOIF_Msk)));
}
@@ -46,6 +46,14 @@ typedef struct {
#define UART_ERR_NOISE 3
/* Interrupt Type */
#define UART_IT_RX_THR (1 << UART_CTRL_RXIE_Pos) //RX FIFO Threshold, RX FIFO中数据个数 > RXThreshold
#define UART_IT_RX_TOUT (1 << UART_CTRL_TOIE_Pos) //RX Timeout, 超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据
#define UART_IT_TX_THR (1 << UART_CTRL_TXIE_Pos) //TX FIFO Threshold, TX FIFO中数据个数 <= TXThreshold
#define UART_IT_TX_DONE (1 << UART_CTRL_TXDOIE_Pos) //TX Done, 发送FIFO空且发送发送移位寄存器已将最后一位发送出去
void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART串口初始化
void UART_Open(UART_TypeDef * UARTx);
void UART_Close(UART_TypeDef * UARTx);
@@ -75,19 +83,10 @@ 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_INTEn(UART_TypeDef * UARTx, uint32_t it);
void UART_INTDis(UART_TypeDef * UARTx, uint32_t it);
void UART_INTClr(UART_TypeDef * UARTx, uint32_t it);
uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it);
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 //__SWM341_UART_H__
@@ -53,6 +53,7 @@ typedef struct {
#define USB_DESC_OTG 0x09
#define USB_DESC_BOS 0x0F
#define USB_DESC_CAPABILITY 0x10
#define USB_DESC_CS_INTERFACE 0x24 // Class Specific Interface
/* USB HID Descriptor Type */
#define USB_DESC_HID 0x21
@@ -90,12 +91,17 @@ typedef struct {
#define USB_CDC_CTRL_CLASS 0x02 // for Interface
#define USB_CDC_DATA_CLASS 0x0A // for Interface
#define USB_HID_CLASS 0x03 // for Interface
#define USB_MTP_CLASS 0x06 // for Interface
#define USB_MSC_CLASS 0x08 // for Interface
#define USB_UVC_CLASS 0x0E // for Interface
/* SubClass */
#define USB_CDC_ACM 0x02 // Abstract Control Model
#define USB_HID_BOOT 0x01
#define USB_UVC_VIDEOCONTROL 0x01
#define USB_UVC_VIDEOSTREAMING 0x02
#define USB_UVC_VIDEO_INTERFACE_COLLECTION 0x03
/* Protocol */
#define USB_CDC_ATCMD 0x01 // AT Commands defined by ITU-T V.250
@@ -40,6 +40,7 @@ void USBH_HW_Init(void)
SYS->USBCR |= (1 << SYS_USBCR_RST48M_Pos); __DSB();
SYS->USBCR |= (1 << SYS_USBCR_RST12M_Pos); __DSB();
SYS->USBCR |= (1 << SYS_USBCR_RSTPLL_Pos); __DSB();
for(int i = 0; i < CyclesPerUs; i++) __NOP();
SYS->USBCR &= ~SYS_USBCR_ROLE_Msk;
SYS->USBCR |= (2 << SYS_USBCR_ROLE_Pos);
@@ -279,7 +280,7 @@ uint32_t USBH_ReadRxBuffer(uint8_t *buff, uint32_t size)
if(size > real_size)
size = real_size;
memcpy(buff, (uint8_t *)USBH->RXBUF, size);
USBD_memcpy(buff, (uint8_t *)USBH->RXBUF, size);
return size;
}
@@ -29,14 +29,12 @@
* uint32_t int_period 中断周期,取值1--2^16,单位1/1024秒,取值0表示关闭WDT中断功能
* uint32_t rst_period 复位周期,取值1--2^16,单位1/1024秒,取值0表示关闭WDT复位功能
* 输 出: 无
* 注意事项: 无
* 注意事项: 此函数只能在芯片上电后调用一次,若需要重新配置 WDT,请调用 WDT_ReInit()
******************************************************************************************************************************************/
void WDT_Init(WDT_TypeDef * WDTx, uint32_t int_period, uint32_t rst_period)
{
SYS->CLKEN0 |= (1 << SYS_CLKEN0_WDT_Pos);
WDT_Stop(WDTx); //设置前先关闭
WDTx->CR &= ~WDT_CR_CKDIV_Msk;
WDTx->CR |= (4 << WDT_CR_CKDIV_Pos); // 对时钟源 32 分频
@@ -70,6 +68,29 @@ void WDT_Init(WDT_TypeDef * WDTx, uint32_t int_period, uint32_t rst_period)
}
}
/******************************************************************************************************************************************
* 函数名称: WDT_ReInit()
* 功能说明: WDT看门狗重新初始化
* 输 入: 同 WDT_Init()
* 输 出: 无
* 注意事项: 执行 WDT_ReInit() 前请不要执行 WDT_Stop(),因为 WDT 停止状态下无法清零内部计数器
******************************************************************************************************************************************/
void WDT_ReInit(WDT_TypeDef * WDTx, uint32_t int_period, uint32_t rst_period)
{
int i;
/* WDT 已经在运行中,若新设置的 rst_period 比当前计数器值还小,WDT 需要计数到 2^16 溢出返回 0 才能触发中断和复位,
这里执行一下喂狗,保证计数器从零重新计数,避免上述问题 */
WDT_Feed(WDTx);
/* 等待 WDT 内部完成喂狗操作,计数器清零 */
for(i = 0; i < CyclesPerUs * 300 / 4; i++) __NOP();
WDT_Stop(WDTx);
WDT_Init(WDTx, int_period, rst_period);
}
/******************************************************************************************************************************************
* 函数名称: WDT_Start()
* 功能说明: 启动指定WDT,开始倒计时
@@ -103,7 +124,8 @@ void WDT_Stop(WDT_TypeDef * WDTx)
******************************************************************************************************************************************/
void WDT_Feed(WDT_TypeDef * WDTx)
{
WDTx->FEED = 0x55;
if(WDTx->CR & WDT_CR_EN_Msk) // WDT 停止状态下,不执行喂狗
WDTx->FEED = 0x55;
}
/******************************************************************************************************************************************
@@ -2,6 +2,7 @@
#define __SWM341_WDT_H__
void WDT_Init(WDT_TypeDef * WDTx, uint32_t int_period, uint32_t rst_period);
void WDT_ReInit(WDT_TypeDef * WDTx, uint32_t int_period, uint32_t rst_period);
void WDT_Start(WDT_TypeDef * WDTx); //启动指定WDT,开始倒计时
void WDT_Stop(WDT_TypeDef * WDTx); //关闭指定WDT,停止倒计时
@@ -18,6 +18,7 @@
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
#include <string.h>
#include "SWM341.h"
#include "usbh_hid_core.h"
#include "usbh_hid_keybd.h"
@@ -26,17 +27,133 @@
USBH_HID_cb_t USBH_HID_KeyBD_cb =
{
USBH_HID_KeyBD_Init,
USBH_HID_KeyBd_Decode
USBH_HID_KeyBD_Decode
};
static const uint8_t HID_KEYBRD_Codes[] = {
0, 0, 0, 0, 31, 50, 48, 33, 19, 34, 35, 36, 24, 37, 38, 39,
52, 51, 25, 26, 17, 20, 32, 21, 23, 49, 18, 47, 22, 46, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 43, 110, 15, 16, 61, 12, 13, 27,
28, 29, 42, 40, 41, 1, 53, 54, 55, 30, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 75, 80, 85, 76, 81, 86, 89,
79, 84, 83, 90, 95, 100, 105, 106, 108, 93, 98, 103, 92, 97, 102, 91,
96, 101, 99, 104, 45, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 107, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58, 44, 60, 127, 64, 57, 62, 128,
};
static const uint8_t HID_KEYBRD_Key[] = {
'\0', '`', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', '-', '=', '\0', '\r', '\t', 'q', 'w', 'e',
'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\',
'\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
';', '\'', '\0', '\n', '\0', '\0', 'z', 'x', 'c', 'v',
'b', 'n', 'm', ',', '.', '/', '\0', '\0', '\0', '\0',
'\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\r', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '7', '4', '1', '\0', '/', '8', '5', '2', '0',
'*', '9', '6', '3', '.', '-', '+', '\0', '\n', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
};
static const uint8_t HID_KEYBRD_ShiftKey[] = {
'\0', '~', '!', '@', '#', '$', '%', '^', '&', '*',
'(', ')', '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E',
'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|',
'\0', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
};
static uint8_t keys_last[6];
static uint8_t nbr_keys_last;
void USBH_HID_KeyBD_Init(void)
{
nbr_keys_last = 0;
memset(keys_last, 0x00, 6);
}
void USBH_HID_KeyBd_Decode(uint8_t *pbuf)
void USBH_HID_KeyBD_Decode(uint8_t *pbuf)
{
char key;
uint8_t i, j;
uint8_t keys[6];
uint8_t keys_new[6];
uint8_t nbr_keys;
uint8_t nbr_keys_new;
for(i = 2; i < 8; i++)
{
if((pbuf[i] == 0x01) || (pbuf[i] == 0x02) || (pbuf[i] == 0x03))
return;
}
nbr_keys = 0;
nbr_keys_new = 0;
for(i = 2; i < 8; i++)
{
if(pbuf[i] != 0x00)
{
keys[nbr_keys++] = pbuf[i];
for(j = 0; j < nbr_keys_last; j++)
{
if(pbuf[i] == keys_last[j])
break;
}
if(j == nbr_keys_last) // 遍历到了最后,说明 pbuf[i] 不在 keys_last 中,是新按下的
keys_new[nbr_keys_new++] = pbuf[i];
}
}
if(nbr_keys_new == 1)
{
if((pbuf[0] & KBD_LEFT_SHIFT) || (pbuf[0] & KBD_RIGHT_SHIFT))
{
key = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[keys_new[0]]];
}
else
{
key = HID_KEYBRD_Key[HID_KEYBRD_Codes[keys_new[0]]];
}
USBH_HID_KeyBD_Handle(pbuf[0], key); // call user process handle
}
memcpy(keys_last, keys, 6);
nbr_keys_last = nbr_keys;
}
__attribute__((weak))
void USBH_HID_KeyBD_Handle(uint8_t ctrl, char key)
{
if((ctrl & KBD_LEFT_CTRL) | (ctrl & KBD_RIGHT_CTRL))
printf("Ctrl-");
if((ctrl & KBD_LEFT_ALT) | (ctrl & KBD_RIGHT_ALT))
printf("Alt-");
printf("%c\r\n", key);
}
@@ -4,11 +4,24 @@
#include <stdint.h>
#define KBD_LEFT_CTRL 0x01
#define KBD_LEFT_SHIFT 0x02
#define KBD_LEFT_ALT 0x04
#define KBD_LEFT_CMD 0x08
#define KBD_RIGHT_CTRL 0x10
#define KBD_RIGHT_SHIFT 0x20
#define KBD_RIGHT_ALT 0x40
#define KBD_RIGHT_CMD 0x80
extern USBH_HID_cb_t USBH_HID_KeyBD_cb;
void USBH_HID_KeyBD_Init(void);
void USBH_HID_KeyBd_Decode(uint8_t *pbuf);
void USBH_HID_KeyBD_Decode(uint8_t *pbuf);
__attribute__((weak))
void USBH_HID_KeyBD_Handle(uint8_t ctrl, char key);
#endif // __USBH_HID_KEYBD_H__
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,153 @@
#ifndef __USBH_MTP_H__
#define __USBH_MTP_H__
#include "usbh_mtp_ptp.h"
typedef enum {
USBH_MTP_IDLE = 0,
USBH_MTP_GETDEVICEINFO,
USBH_MTP_OPENSESSION,
USBH_MTP_GETSTORAGEIDS,
USBH_MTP_GETSTORAGEINFO,
USBH_MTP_TRANSFER,
USBH_MTP_EVENT,
USBH_MTP_EVENT_WAIT,
/* Events may be interleaved within a data stream during a transaction.
It may be assumed that the Operation Request Phase and Response Phase are atomic, but the Data Phase
must allow for events to be communicated in either direction without interrupting data transfer.
*/
USBH_MTP_EVENT_CHECK,
} USBH_MTP_State;
typedef enum {
USBH_MTP_OP_IDLE = 0,
USBH_MTP_OP_SEND,
USBH_MTP_OP_WAIT,
USBH_MTP_OP_ERROR,
} USBH_MTP_OpState;
typedef enum {
USBH_MTP_XFER_IDLE = 0,
USBH_MTP_XFER_OP_REQ,
USBH_MTP_XFER_OP_REQ_WAIT,
USBH_MTP_XFER_DATA_OUT,
USBH_MTP_XFER_DATA_OUT_WAIT,
USBH_MTP_XFER_DATA_IN,
USBH_MTP_XFER_DATA_IN_WAIT,
USBH_MTP_XFER_RESP,
USBH_MTP_XFER_RESP_WAIT,
USBH_MTP_XFER_ERROR,
} USBH_MTP_XferState;
typedef struct {
uint32_t timer;
uint16_t poll;
PTP_EventContainer_t container;
} MTP_EventHandle_t;
typedef struct {
uint8_t InEp;
uint8_t OutEp;
uint8_t NotifyEp;
uint16_t InEpSize;
uint16_t OutEpSize;
uint16_t NotifyEpSize;
uint8_t InEpDATAX;
uint8_t OutEpDATAX;
uint8_t NotifyEpDATAX;
USBH_MTP_State state;
USBH_MTP_State stateReq;
USBH_MTP_State stateBkp;
USBH_MTP_OpState OpState;
USBH_MTP_XferState XferState;
USBH_Status XferStatus;
PTP_OpContainer_t op_container;
PTP_DataContainer_t data_container;
PTP_RespContainer_t resp_container;
uint32_t session_id;
uint32_t transaction_id;
uint32_t flags;
uint8_t *data_ptr;
uint32_t data_len;
uint8_t first_packet; // 1 数据第一帧 3 数据第一帧,且需丢弃 header 不存储
PTP_DeviceInfo_t devinfo;
PTP_StorageIDs_t storids;
PTP_StorageInfo_t storinfo[PTP_MAX_STORAGE_UNITS_NBR];
MTP_EventHandle_t events;
uint32_t CurrentStorage;
uint32_t is_ready;
} USBH_MTP_Info_t;
extern USBH_MTP_Info_t USBH_MTP_Info;
static uint32_t USBH_MTP_Ready(void)
{
return USBH_MTP_Info.is_ready;
}
static uint32_t USBH_MTP_StorageCount(void)
{
return USBH_MTP_Info.storids.n;
}
static uint32_t USBH_MTP_Storage(uint32_t index)
{
return USBH_MTP_Info.storids.Storage[index];
}
USBH_Status USBH_MTP_GetDeviceInfo(USBH_Info_t *phost, PTP_DeviceInfo_t *dev_info);
USBH_Status USBH_MTP_OpenSession(USBH_Info_t *phost, uint32_t session);
USBH_Status USBH_MTP_GetStorageIds(USBH_Info_t *phost, PTP_StorageIDs_t *storage_ids);
USBH_Status USBH_MTP_GetStorageInfo(USBH_Info_t *phost, uint32_t storage_id, PTP_StorageInfo_t *storage_info);
USBH_Status USBH_MTP_GetNumObjects(USBH_Info_t *phost, uint32_t storage_id, uint32_t format, uint32_t folder, uint32_t *numobs);
USBH_Status USBH_MTP_GetObjectHandles(USBH_Info_t *phost, uint32_t storage_id, uint32_t format, uint32_t folder, PTP_ObjectHandles_t *handles);
USBH_Status USBH_MTP_GetObjectInfo(USBH_Info_t *phost, uint32_t handle, PTP_ObjectInfo_t *object_info);
USBH_Status USBH_MTP_GetObject(USBH_Info_t *phost, uint32_t handle, uint8_t *object);
USBH_Status USBH_MTP_GetPartialObject(USBH_Info_t *phost, uint32_t handle, uint32_t offset, uint32_t maxbytes, uint8_t *object, uint32_t *len);
USBH_Status USBH_MTP_DeleteObject(USBH_Info_t *phost, uint32_t handle, uint32_t format);
USBH_Status USBH_MTP_SendObject(USBH_Info_t *phost, uint32_t handle, uint8_t *object, uint32_t size);
USBH_Status USBH_MTP_GetDevicePropDesc(USBH_Info_t *phost, uint16_t propcode, PTP_DevicePropDesc_t *devicepropertydesc);
USBH_Status USBH_MTP_GetObjectPropsSupported(USBH_Info_t *phost, uint16_t ofc, uint32_t *propnum, uint16_t *props);
USBH_Status USBH_MTP_GetObjectPropDesc(USBH_Info_t *phost, uint16_t opc, uint16_t ofc, PTP_ObjectPropDesc_t *opd);
USBH_Status USBH_MTP_GetObjectPropList(USBH_Info_t *phost, uint32_t handle, MTP_Properties_t *pprops, uint32_t *nrofprops);
void USBH_MTP_EventsCallback(USBH_Info_t *phost, uint32_t event, uint32_t param);
#define USBH_TObreak(ms) \
{ \
static int start; \
start = USBH->FRAMENR; \
if(abs((int)USBH->FRAMENR - start) > ms) \
{ \
break; \
} \
}
#endif // __USBH_MTP_H__
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -204,7 +204,8 @@ void USBH_Process(void)
}
uint8_t Cfg_Desc_Buffer[USBH_MAX_CFG_SIZE];
uint8_t USBH_Cfg_Desc_Buffer[USBH_MAX_CFG_SIZE];
uint16_t USBH_Cfg_Desc_Length;
/******************************************************************************************************************************************
* 函数名称: USBH_HandleEnum()
* 功能说明: Handle the USB device enumeration state machine
@@ -264,11 +265,12 @@ USBH_Status USBH_HandleEnum(USBH_Info_t *phost)
break;
case ENUM_GET_FULL_CFG_DESC:
if(USBH_GetDescriptor(phost, USB_DESC_CONFIG, 0, Cfg_Desc_Buffer, phost->Device.Cfg_Desc.wTotalLength) == USBH_OK)
if(USBH_GetDescriptor(phost, USB_DESC_CONFIG, 0, USBH_Cfg_Desc_Buffer, phost->Device.Cfg_Desc.wTotalLength) == USBH_OK)
{
phost->EnumState = ENUM_GET_VENDOR_STRING_DESC;
USBH_ParseCfgDesc(phost, Cfg_Desc_Buffer, phost->Device.Cfg_Desc.wTotalLength);
USBH_Cfg_Desc_Length = phost->Device.Cfg_Desc.wTotalLength;
USBH_ParseCfgDesc(phost, USBH_Cfg_Desc_Buffer, USBH_Cfg_Desc_Length);
if(phost->usr_cb->ConfigDescAvailable)
phost->usr_cb->ConfigDescAvailable(&phost->Device.Cfg_Desc, phost->Device.Intf_Desc, phost->Device.Ep_Desc[0]);
@@ -278,13 +280,18 @@ USBH_Status USBH_HandleEnum(USBH_Info_t *phost)
case ENUM_GET_VENDOR_STRING_DESC:
if(phost->Device.Dev_Desc.iManufacturer != 0)
{
if(USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iManufacturer, (uint8_t *)phost->Device.strVender, sizeof(phost->Device.strVender)) == USBH_OK)
USBH_Status stat = USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iManufacturer, (uint8_t *)phost->Device.strVender, sizeof(phost->Device.strVender));
if(stat == USBH_OK)
{
phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC;
if(phost->usr_cb->VendorString)
phost->usr_cb->VendorString(phost->Device.strVender);
}
else if(stat == USBH_NOT_SUPPORTED)
{
phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC;
}
}
else
{
@@ -295,13 +302,18 @@ USBH_Status USBH_HandleEnum(USBH_Info_t *phost)
case ENUM_GET_PRODUCT_STRING_DESC:
if(phost->Device.Dev_Desc.iProduct != 0)
{
if(USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iProduct, (uint8_t *)phost->Device.strProduct, sizeof(phost->Device.strProduct)) == USBH_OK)
USBH_Status stat = USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iProduct, (uint8_t *)phost->Device.strProduct, sizeof(phost->Device.strProduct));
if(stat == USBH_OK)
{
phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC;
if(phost->usr_cb->ProductString)
phost->usr_cb->ProductString(phost->Device.strProduct);
}
else if(stat == USBH_NOT_SUPPORTED)
{
phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC;
}
}
else
{
@@ -312,13 +324,18 @@ USBH_Status USBH_HandleEnum(USBH_Info_t *phost)
case ENUM_GET_SERIALNUM_STRING_DESC:
if(phost->Device.Dev_Desc.iSerialNumber != 0)
{
if(USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iSerialNumber, (uint8_t *)phost->Device.strSerialNumber, sizeof(phost->Device.strSerialNumber)) == USBH_OK)
USBH_Status stat = USBH_GetDescriptor(phost, USB_DESC_STRING, phost->Device.Dev_Desc.iSerialNumber, (uint8_t *)phost->Device.strSerialNumber, sizeof(phost->Device.strSerialNumber));
if(stat == USBH_OK)
{
phost->EnumState = ENUM_SET_CONFIGURATION;
if(phost->usr_cb->SerialNumString)
phost->usr_cb->SerialNumString(phost->Device.strSerialNumber);
}
else if(stat == USBH_NOT_SUPPORTED)
{
phost->EnumState = ENUM_SET_CONFIGURATION;
}
}
else
{
@@ -89,6 +89,8 @@ typedef struct {
char strSerialNumber[USBH_MAX_STR_SIZE];
} USBH_Device_t;
extern uint8_t USBH_Cfg_Desc_Buffer[USBH_MAX_CFG_SIZE];
extern uint16_t USBH_Cfg_Desc_Length;
struct USBH_Info_T;
typedef struct {
@@ -36,7 +36,7 @@ USBH_Status USBH_GetDescriptor(USBH_Info_t *phost, uint8_t type, uint8_t index,
phost->Ctrl.setup.bRequestType = USB_REQ_D2H | USB_REQ_STANDARD | USB_REQ_TO_DEVICE;
phost->Ctrl.setup.bRequest = USB_GET_DESCRIPTOR;
phost->Ctrl.setup.wValue = (type << 8) | index;
phost->Ctrl.setup.wIndex = 0;
phost->Ctrl.setup.wIndex = (type == USB_DESC_STRING) ? 0x0409 : 0;
phost->Ctrl.setup.wLength = size;
return USBH_CtrlTransfer(phost, buff, size);
@@ -113,7 +113,7 @@ USBH_Status USBH_SetConfiguration(USBH_Info_t *phost, uint8_t cfg)
******************************************************************************************************************************************/
USBH_Status USBH_SetInterface(USBH_Info_t *phost, uint8_t intf, uint8_t altSetting)
{
phost->Ctrl.setup.bRequestType = USB_REQ_H2D | USB_REQ_STANDARD | USB_REQ_TO_DEVICE;
phost->Ctrl.setup.bRequestType = USB_REQ_H2D | USB_REQ_STANDARD | USB_REQ_TO_INTERFACE;
phost->Ctrl.setup.bRequest = USB_SET_INTERFACE;
phost->Ctrl.setup.wValue = altSetting;
phost->Ctrl.setup.wIndex = intf;
+2
View File
@@ -6,6 +6,7 @@
/* RT-Thread Kernel */
#define RT_CPUS_NR 1
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 8
#define RT_THREAD_PRIORITY_32
@@ -43,6 +44,7 @@
#define RT_USING_MEMHEAP_AS_HEAP
#define RT_USING_MEMHEAP_AUTO_BINDING
#define RT_USING_HEAP
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* Kernel Device Object */