提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
完全基于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的设置自行调整)
二、使用步骤
1.usart hmi的设置
(1)启动界面
在启动界面选择自己所买的串口屏之后点击ok再在弹出的选项中选择横屏90°之后点击ok进入界面
(2)设置所需界面这里我们设置4个界面一个菜单栏和三个任务栏
1.设置字库 点击工具—>点击字库制作—>点击字高设置为32—>设置为指定字符—>设置字库名称—>在下方空白处添加所需字符—>点击生成字库
2.点击+号导入刚建立的字符库即可修改我们所需字符 点击旁边设置选项 设置界面如下图所示
下面开始界面代码演示
对于点击按钮 点击按下事件(这里一定选择按下事件而不是弹起事件 不然会导致无法正常接收数据)写入
printh AA
printh 01//这里和page一样改变数值代表判定位
printh FF
page page1//代表要跳转的页面
2.cubemx设置
这里就需要一些cubemx的知识了但是最终效果如图 可以去看看b站keysking的视频里面很详细的介绍了cubemx的配置 注意这里usart波特率设置位串口屏相适应的波特率
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的配置