本帖最后由 聪聪哥哥 于 2025-5-27 19:49 编辑
之前对其他的32位单片机对一款工业屏做了调试,今天移植到STM32上面,实际测试一下运行效果,STM32C092的有关串口的知识,请查看之前的C092的论坛帖子。一:STM32cube MX 配置:
这里由于串口2已经被ST-link占用,这里我使用串口3进行串口屏幕的切换;
串口3的串口的波特率,校验位,停止位的设置
配置串口3以DMA的方式发送接收
使能DMA的优先级,如下所示:
二:函数代码如下所示:
2.1 串口3的底层驱动代码如下:
/**
* 函数功能: 串口3的DMA发送
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void UART3_TX_DMA_Send(uint8_t *buffer, uint16_t length)
{
HAL_UART_Transmit(&huart3,buffer,length,1000);
}
2.2 相关串口品的操作过程:/***********************************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url] void Display_Text(unsigned int uiAdd, char *Str)
* @param 切换界面
* @retval 无
* [url=home.php?mod=space&uid=187600]@author[/url] 聪聪哥哥
* [url=home.php?mod=space&uid=895143]@version[/url] V1.1.0
* [url=home.php?mod=space&uid=212281]@date[/url] 12-2-2025
*************************************************************************************************/
void SendTestData(char ID)
{
SendBuffer3[0] = 0x5A ;
SendBuffer3[1] = 0xA5 ;
SendBuffer3[2] = 0x07 ;
SendBuffer3[3] = 0x82 ;
SendBuffer3[4] = 0x00 ;
SendBuffer3[5] = 0x84 ;
SendBuffer3[6] = 0x5A ;
SendBuffer3[7] = 0x01 ;
SendBuffer3[8] = 0x00 ;
SendBuffer3[9] = ID ;
ucDispMode = ID ;
HAL_UART_Transmit(&huart3,&SendBuffer3[0],10,10);
}
屏幕显示以及接收中断的处理部分:
/***********************************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url] void GuiDisplay(void)
* @param 界面显示函数 展示
* @retval 无
* [url=home.php?mod=space&uid=187600]@author[/url] 聪聪哥哥
* @version V1.1.0
* [url=home.php?mod=space&uid=212281]@date[/url] 12-2-2025
*************************************************************************************************/
void GuiDisplay(void)
{
switch (ucDispMode)
{
case 0:
break ;
case 1 :
break ;
default :
break ;
}
}
/***********************************************************************************************
* @brief void DWIN_Key_Deal(uint16_t KeyValue)
* @param 按键处理函数
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 12-2-2025
*************************************************************************************************/
void DWIN_Key_Deal(uint16_t KeyValue)
{
switch (KeyValue)
{
/*工作界面显示*/
case 0x100 : SendTestData(3);
break ;
default:
break ;
}
KeyValue = 0 ;
}
/***********************************************************************************************
* @brief void DWIN_Rec_Deal(void)
* @param 串口3从DWIN屏接收数据
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 12-2-2025
*************************************************************************************************/
void DWIN_Rec_Deal(void)
{
uint16_t RecAdd;
uint16_t KeyValue;
if(usart3_Flag == 1)
{
usart3_Flag = 0 ;
if((Usart3_DEAL_RX_Buf[0] == 0x5A)&&(Usart3_DEAL_RX_Buf[1] == 0xA5))
{
switch(Usart3_DEAL_RX_Buf[3])
{
case 0x83: RecAdd = (Usart3_DEAL_RX_Buf[4]<<8) + Usart3_DEAL_RX_Buf[5];
switch(RecAdd)
{
/*-------------------------------------------------------------------------------------------------------*/
/*---------------------------------按键地址变量-----------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------*/
case 0x4000: KeyValue = (Usart3_DEAL_RX_Buf[7]<<8) + Usart3_DEAL_RX_Buf[8];
DWIN_Key_Deal(KeyValue);
break;
default :
break ;
}
}
}
memset(Usart3_DEAL_RX_Buf,0,32);
}
}
实测串口切换屏幕界面功能:
if(Time2point %200 == 0)
{
PicID++ ;
if(PicID >=20) PicID = 1 ;
SendTestData(PicID);
}
效果图如下所示:
目前在调试的发现DMA的发送数据的时候,出现点问题,有时候会进入硬件错误的程序代码内,所以修采用了阻塞性发送的方式,进行数据的传输,等等查看哪里配置出现的问题,在进行修改。
|