打印
[STM32C0]

【STM32C092RC 测评】+11 与串口工业屏通讯测试

[复制链接]
215|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聪聪哥哥 于 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的发送数据的时候,出现点问题,有时候会进入硬件错误的程序代码内,所以修采用了阻塞性发送的方式,进行数据的传输,等等查看哪里配置出现的问题,在进行修改。

  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

179

帖子

1

粉丝