这是我接触的比较好的开源旋转钮显示屏,主控为SWM166 系列 32 位 MCU(以下简称 SWM166) 内嵌 ARM® Cortex®-M0 内核,高可靠性、低功耗、代码密度大等突出特点,可应用于工业控制、电机控制、白色家电等多种领域。SWM166 支持片上包含精度为 1%以内的 12M 时钟及 PLL 模块, 最高支持 90MHz 的时钟输出。同时提供最大为 64K 字节的 FLASH 和最大 8K 字节的 SRAM。此外,芯片支持向量表重映射和CACHE 单周期取指、 ISP(在系统编程)操作及 IAP(在应用编程) , 支持用户可自定义 BOOT 程序和加密操作。SWM166 外设串行总线包括最多 2 个 UART 接口, 2 个 SPI 接口(一个支持四线 QSPI), 1 个 I2C接口(支持主/择) , 1 个 CAN 接口,此外还具有 1 个 16 位看门狗定时器, 3 组 32 位(24位计数器+8 位预分频) 加强型定时器, 4 组 32 位(24 位计数器+8 位预分频) 基础型定时器, 1个 16 位正交编码器(QEI)模块, 1 个 16 位的 MPU 接口模块, 4 通道(每个通道均可扩展为具备死区的互补模式) 16 位 PWM 模块, 1 个除法器(DIV), 1 个旋转坐标计算模块(CORDIC),1 个最多 12 通道、 12 位、 1MSPS 的逐次逼近型 ADC 模块,并提供欠压中断及复位等功能。
圆形屏的原理图,PCB厂家都开源,圆形屏用华芯微特的成本,性价超级高,自护可控,简直是白色家电的福音。
底板把排线引脚支持双串口,下载口,一个自主可控GPIO,可以用来ADC采样或者普通IO口使用。
底层程序做的非常好,标准库做的,用户可以移植LVGL的GUI,SPI+DMA 刷屏杠杠滴,外扩flash
void SetSPI_4Bit(uint8_t Flag)
{
//ÅäÖóÉ4BitÐÎʽ
if(Flag == 1)
{
SPI_Close(SPI0);
SPI0->CTRL &= ~SPI_CTRL_FFS_Msk;
SPI0->CTRL |= (3 << SPI_CTRL_FFS_Pos);
SPI0->SPIMCR = (1 << SPI_SPIMCR_EN_Pos) |
((Len_Buf - 1) << SPI_SPIMCR_RDLEN_Pos) |
((8 - 1) << SPI_SPIMCR_DUMMY_Pos);
SPI_Open(SPI0);
}
//ÅäÖóÉ1BitÐÎʽ
else
{
SPI0->CTRL &= ~(1 << SPI_CTRL_DMARXEN_Pos);
SPI_Close(SPI0);
SPI0->SPIMCR = 0;
SPI0->CTRL &= ~SPI_CTRL_FFS_Msk;
SPI0->CTRL |= (0 << SPI_CTRL_FFS_Pos);
SPI_Open(SPI0);
}
}
//void
void LogSend256(uint8_t * Buf)
{
for(uint16_t j = 0; j < 256; j++)
{
if(j % 16 == 0)
{
printf("\n");
}
printf("%02X ",Buf[j]);
}
}
void SPI_DMA_SendGet_Init(void)
{
DMA_InitStructure DMA_initStruct;
/*·¢Ë͵½LCD*/
SPI1->CTRL &= ~SPI_CTRL_DMATXEN_Msk;
SPI1->CTRL |= (1 << SPI_CTRL_DMATXEN_Pos);
DMA_initStruct.Mode = DMA_MODE_SINGLE;
DMA_initStruct.Unit = DMA_UNIT_HALFWORD;
DMA_initStruct.Count = Len_Buf/2;
// DMA_initStruct.SrcAddr = (uint32_t)&color;
DMA_initStruct.SrcAddrInc = 1;
DMA_initStruct.DstAddr = (uint32_t)&SPI1->DATA;
DMA_initStruct.DstAddrInc = 0;
DMA_initStruct.Handshake = DMA_CH0_SPI1TX;
DMA_initStruct.Priority = DMA_PRI_LOW;
DMA_initStruct.INTEn = 1;
DMA_CH_Init(DMA_CH0, &DMA_initStruct);
// DMA_CH_Open(DMA_CH0);
/*´ÓSPI-Flash¶ÁÈ¡*/
/*211ÅäÖÃ*/
// DMA_InitStructure DMA_initStruct;
//SPI0 RX DMA
DMA_initStruct.Mode = DMA_MODE_SINGLE;
DMA_initStruct.Unit = DMA_UNIT_BYTE;
DMA_initStruct.Count = Len_Buf;
DMA_initStruct.SrcAddr = (uint32_t)&SPI0->DATA;
DMA_initStruct.SrcAddrInc = 0;
// DMA_initStruct.DstAddr = (uint32_t)buff;
DMA_initStruct.DstAddrInc = 1;
DMA_initStruct.Handshake = DMA_CH1_SPI0RX;
DMA_initStruct.Priority = DMA_PRI_LOW;
DMA_initStruct.INTEn = 1;
DMA_CH_Init(DMA_CH1, &DMA_initStruct);
// DMA_CH_Open(DMA_CH0);
}
|