mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-10-02 14:23:19 +08:00
update CSL library (#8370)
This commit is contained in:
@@ -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/)
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user