这是我接触的比较好的开源旋转钮显示屏,主控为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);
-
- }
|