零基础也能学会的陶晶屏 完整流程 基于stm32f103c8t6

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

文章目录

 


前言

完全基于stm32 cubemx 和keil5的教程 完全零基础也能学懂。实现(1)串口屏的秒表,(2)通过改变定时器频率控制呼吸灯,(3)接受多个小数

 

 

一、要准备的软硬件和基础知识

1.软甲下载地址淘晶驰资料中心 — 淘晶驰资料中心 1.1.0-2024-04-10 10:51:16 文档 (tjc1688.com)

在下载资料中下载上位机即可。

在这里学习如何安装下载和安装上位机软件 — 淘晶驰资料中心 1.1.0-2024-04-10 10:51:16 文档 (tjc1688.com)

2.接线(本文使用的是usart1 所以接线为a9和a10 小伙伴们可以根据自己cubemx的设置自行调整)

9d0aeb96354f428b813d1efd14638694.png

二、使用步骤

1.usart hmi的设置

(1)启动界面 6adb5816038f4a1fa5c4f0ac02437a88.png

在启动界面选择自己所买的串口屏之后点击ok再在弹出的选项中选择横屏90°之后点击ok进入界面

(2)设置所需界面这里我们设置4个界面一个菜单栏和三个任务栏

1.设置字库 点击工具—>点击字库制作—>点击字高设置为32—>设置为指定字符—>设置字库名称—>在下方空白处添加所需字符—>点击生成字库f288a83b6c8b4c0da15e054762f4f245.png

 

2.点击+号导入刚建立的字符库即可修改我们所需字符 点击旁边设置选项 设置界面如下图所示

361a58ce97d54cf8b7e2ab47b5f930d3.png

49a9df16e01a4203b489188504b94bca.png

196b828ed22a453da813ebb97c3c6b2b.png

155a42638b1f46cca0eee5dd4379fdf2.png

下面开始界面代码演示

对于点击按钮 点击按下事件(这里一定选择按下事件而不是弹起事件 不然会导致无法正常接收数据)写入

printh AA
printh 01//这里和page一样改变数值代表判定位
printh FF
page page1//代表要跳转的页面

 

2.cubemx设置

这里就需要一些cubemx的知识了但是最终效果如图 可以去看看b站keysking的视频里面很详细的介绍了cubemx的配置 注意这里usart波特率设置位串口屏相适应的波特率 

bea4049938044a9e89640f0bb4236ac2.png

3.keil5 代码部分

1.需要的一些变量定义和定义

extern DMA_HandleTypeDef hdma_usart1_rx;
extern TIM_HandleTypeDef htim4;
uint8_t flag,s;
uint32_t num=500,counter=500,cnt=0;
uint32_t hz;
uint8_t	recvedata[3];

2.重定义printf

int fputc(int c,FILE *f)
{
	uint8_t ch[1]={c};
	//HAL_UART_Transmit(&huart1,ch,1,0xffff);
	HAL_UART_Transmit(&huart1,ch,1,2);
	return c;
}

3.判断从窗口屏得到的数据

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart  == &huart1)
	{
		if(recvedata[0]==0xAA&&recvedata[1]==0x01&&recvedata[2]==0xFF)//判断时钟和定时器频率界面的开启
		{
			flag=1;
		}
		else if(recvedata[0]==0xAA&&recvedata[1]==0x04&&recvedata[2]==0xFF)//判断时钟频率是否增加 减少呼吸灯频率
		{
				counter *=2;num*=2;
			__HAL_TIM_SET_PRESCALER(&htim4,num);//修改定时器频率
			 hz =num*72;
				printf("page1.n1.val=%d\xff\xff\xff",hz);
		}
		else if(recvedata[0]==0xAA&&recvedata[1]==0x05&&recvedata[2]==0xFF)//判断时钟频率是否减少 增加呼吸灯频率
		{
				counter/=2;num/=2;
			__HAL_TIM_SET_PRESCALER(&htim4,num);
			 hz =num*72;
			printf("page1.n1.val=%d\xff\xff\xff",hz);
		}
		else if(recvedata[0]==0xAA&&recvedata[1]==0x03&&recvedata[2]==0xFF)//开启接受多个小数
		{
				flag = 3;
		}
		else if(recvedata[0]==0xAA&&recvedata[1]==0x06&&recvedata[2]==0xFF)//判断呼吸灯开启
		{
				flag = 4;
		}
		else if(recvedata[0]==0xAA&&recvedata[1]==0x07&&recvedata[2]==0xFF)//判断呼吸灯关闭
		{
				flag = 5;
		}
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1,recvedata,sizeof(recvedata));
		__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
	}
}

4.发送秒表数据这里tim3我直接设置频率位1hz方便一点

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		if(htim ==&htim3&&flag==1)
		{
				s++;
				printf("page1.n0.val=%d\xff\xff\xff",s);
		}
}	

 

5.初始化

	HAL_TIM_Base_Start_IT(&htim3);
	HAL_TIM_Base_Start_IT(&htim4);
	//HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
	//HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);                                                    );
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
	HAL_UARTEx_ReceiveToIdle_DMA(&huart1,(uint8_t *)recvedata,sizeof(recvedata));
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
	__HAL_TIM_SET_PRESCALER(&htim4,num);
	
	HAL_TIM_Base_Start_IT(&htim3);

	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);

 

6.while中的pwm和小数发送

while(cnt<counter&&flag==4)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12);
			cnt+=10;
			__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,cnt);
			HAL_Delay(20);
		}
		while(cnt&&flag==4) 
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12);
			cnt-=10;
			__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,cnt);
			HAL_Delay(20);
		}
				if(flag==3)
		{
		printf("page3.x0.val=%d\xff\xff\xff",2345);
		HAL_Delay(1000);
		printf("page3.x0.val=%d\xff\xff\xff",3141);
		HAL_Delay(1000);
		printf("page3.x0.val=%d\xff\xff\xff",5201);
		HAL_Delay(1000);
		}

总结

新人第一次发文章有什么错误请大方的指出 看到了都会改的 有什么建议也可以提出 如果有需要可以单开一节讲讲cubemx的配置

 

  • 42
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于stm32f103c8t6与陶晶驰串口屏通信,您可以参考以下代码示例: ```c #include "stm32f10x.h" void USART_Configuration(void) { // 初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化USART USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能USART USART_Cmd(USART1, ENABLE); } void USART_SendString(char* str) { while (*str) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, *str++); } } int main(void) { // 初始化串口 USART_Configuration(); // 发送数据到串口屏幕 char* message = "Hello, TFT!"; USART_SendString(message); while (1) { // 主循环 } } ``` 在这个例子中,我们首先需要初始化GPIO和USART,然后在`USART_SendString`函数中发送字符串到串口屏幕。在主函数中,我们调用`USART_SendString`函数发送消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值