这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 使用stm32wba55cg驱动墨水屏

共4条 1/1 1 跳转至

使用stm32wba55cg驱动墨水屏

菜鸟
2024-12-24 10:31:46     打赏

入手一片微雪3寸墨水屏模块,四色红、黄、黑、白。400×168分辨率,一直很喜欢墨水屏显示的质感,乘此机会买了一片,把玩一下。


一、项目目标

使用NUCLEO-WBA55CG开发板驱动墨水屏,并通过PWM控制LED灯管的亮度。硬件列表。NUCLEO-WBA55CG开发板;一个LED灯管;3寸墨水屏模块;一块电机驱动板,用来通过PWM驱动LED灯管。电机驱动板自带电池升压功能。

51b25d6099513c948c8ade9c3de0778.jpg

1d76a87a330178564e8cf45b168e375.jpg

二、硬件连接

墨水屏有8根线,通过SPI与单片机相连接。LED灯连接驱动板,单片机通过PWM控制驱动板,调节PWM占空比,控制LED灯的亮度。







3寸墨水屏

CN4




3寸墨水屏



2GPIO_2





1GPIO_26





2GPIO_25

4GPIO_4





3GPIO_28PB2D15SCL

4GPIO_27

65V





5GPIO_29PB1D14SDA绿

6GPIO_30

8GND





7AVDD
AVDD



85V

10






9GND





10GPIO_32

12

IOREF



11GPIO_31PB4(LD1)D13SCK
sclk12GPIO_35

14NRST





13GPIO_33PB3D12MISO


14GPIO_36

163V3





15GPIO_34PA15D11MOSI
din16GPIO_38

185V





17GPIO_37PA12D10SS
cs18GPIO_40

20GND





19GPIO_39PA9D9



20GND

22GND





21GPIO_41PA15/PA11D8



22GPIO_43

24VIN





23GPIO_42PB9/PC13D7



24GPIO_45

26GPIO_7





25GPIO_44PB0D6

rst26GPIO_46

28GPIO_11PA7A0



27GPIO_47PB14D5

绿dc28GPIO_48

30GPIO_12PA6A1TIM2_CH4
PWM输出
29GPIO_49PB13D4



30GPIO_51

32GPIO_17PA2A2
busy
31GPIO_50PB6(B2)D3



32GND

34GPIO_18PA1A3



33GPIO_52PB7(B3)D2



34GPIO_53

36GPIO_21PA5/PA8A4SDA


35GPIO_54PB5D1



36GPIO_56

38GPIO_22PA0/PA5A5SCL


37GPIO_55PA10D0



38GPIO_57

三、通过例程创建工程

这里使用stm32cubemx,通过例程创建工程。

image.png

调整tim2的pwm输出,这里只需要一个PWM输出即可。调整PWM频率为1000Hz。

image.png

设置SPI输出,墨水屏驱动,仅仅需要单片机发出指令,所以只开启MOSI。

image.png

最后,开启墨水屏管脚对应的GPIO。

image.png

image.png

四、代码实现

添加一个方法,用来控制PWM的输出。

/* USER CODE BEGIN 0 */
void TIM_SetTIM2Compare4(uint32_t compare){  
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, compare); // 
}  
/* USER CODE END 0 */

重构fputc函数,这样就可以将printf函数,映射输出到串口,方便调试代码。

/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f) { 
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); 
  return ch; 
}
/* USER CODE END 4 */

参考着微雪提供的例程,来驱动墨水屏。这里需要留意,墨水屏显示速度不快,不合适做高速显示的内容。这里将LED灯的亮度分割为了10份,每隔几秒累加一。当PWM值小于4时,使用黑色显示,超过4是使用黄色,高于6时,使用红色。

printf("e-Paper Init and Clear...\r\n");
	EPD_3IN0G_Init();
	EPD_3IN0G_Clear(EPD_3IN0G_WHITE); // WHITE
	DEV_Delay_ms(2000);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(num>9 ) num=0;
			printf("%d EPD_3IN0G_test Demo\r\n",num++);
		
		HAL_Delay(1000);
		printf("SelectImage:BlackImage\r\n");
		if((BlackImage = (UBYTE *)malloc(16680)) == NULL) {
			printf("Failed to apply for black memory...\r\n");
			return -1;
		}
		printf("Paint_NewImage\r\n");
		Paint_NewImage(BlackImage, EPD_3IN0G_WIDTH, EPD_3IN0G_HEIGHT, 0, EPD_3IN0G_WHITE);
		Paint_SetScale(4);
		EPD_3IN0G_Init();
		Paint_SelectImage(BlackImage);
		Paint_Clear(EPD_3IN0G_WHITE);
		//Paint_DrawString_EN(10, 0, "Red, yellow, white and black", &Font16, EPD_3IN0G_RED, EPD_3IN0G_YELLOW);
		sprintf(buf,"PWM = %d",num);
		if(num<4)		Paint_DrawString_EN(10, 35, buf, &Font24, EPD_3IN0G_WHITE, EPD_3IN0G_BLACK);	
		else if(num>6) Paint_DrawString_EN(10, 35, buf, &Font24, EPD_3IN0G_WHITE, EPD_3IN0G_RED);	
		else Paint_DrawString_EN(10, 35, buf, &Font24, EPD_3IN0G_WHITE, EPD_3IN0G_YELLOW);
		EPD_3IN0G_Display(BlackImage);
		free(BlackImage);
		TIM_SetTIM2Compare4(num*100);
		DEV_Delay_ms(5000);
	}

因为墨水屏显示部分使用了,动态内存,并且一次申请内存容量较大,所以需要修改STM32的堆栈设置。否则在malloc时会提示失败。

image.png

五、效果展示

image.png

23b6b5dd8fdf5b2d2a05d286519af07.jpg

image.png

image.png

六、项目源码

TIM_PWMOutput墨水屏+pwm输出驱动.zip




院士
2024-12-24 17:48:37     打赏
2楼

学习了,谢谢分享。


专家
2024-12-24 22:26:45     打赏
3楼

感谢分享


专家
2024-12-24 22:27:59     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]