硬汉嵌入式论坛

 找回密码
 立即注册
查看: 928|回复: 2
收起左侧

[ThreadX全家桶] STM32C011F6-单线串口半双工

[复制链接]

8

主题

53

回帖

77

积分

初级会员

积分
77
发表于 2024-8-4 13:27:09 | 显示全部楼层 |阅读模式
STM32C011 单线串口半双工:

1、单片机选择: STM32C011F6P6;
2、USART1选择单线半双工模式;
3、采用ThreaX嵌入式操作系统;
4、具体硬件实现如下,测试项目工程文件也同时提供:

一、硬件测试电路如下:


STM32单线串口半双工-1.png   

   STM32单线串口半双工-2.png

STM32单线串口半双工-3.png


二、项目内容如下:
STM32C011_1Wire_Usart-0.png


串口配置:


void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
      
  if(huart->Instance==USART1)
  {
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){
      Error_Handler();
    }


    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();


               
    /**USART1 GPIO Configuration
      PC14-OSCX_IN (PC14) ------> USART1_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF0_USART1;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);  
  }
}



static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
      
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
      
  huart1.Init.Mode = UART_MODE_TX_RX;
      
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      
  if (HAL_HalfDuplex_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }


}


  1、主函数:
int main(void)
{  
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_TIM3_Init();
  MX_TIM1_Init();


  MX_USART1_UART_Init();  

  MX_ThreadX_Init();


  while (1){   
  }  
}


2、任务1:


void tx_app_thread_entry(ULONG thread_input)
{   
   #if USART_1WIRE_RCV_EN ==1         
      
    HAL_HalfDuplex_EnableReceiver(&huart1);//单线串口:使能接收模式;禁止发送               
      
    HAL_UART_Receive_IT(&huart1,&sRcv_data,1); //使能串口1接收中断: 每接收1个字节,中断一次      
      
  #else
    uint32_t  sendNum;
      
  #endif         
      
   while(1)
    {         
        #if USART_1WIRE_RCV_EN ==1


      
        #else            
        HAL_HalfDuplex_EnableTransmitter(&huart1); //使能单线半双工发送模式;同时禁止接收
      
        USART_SendData_Processing(sendNum);
      
        sendNum++;
      
        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);//LED闪烁
               
        #endif               
      
        tx_thread_sleep(200);
               
    }
}





3、任务2:


void Task_USART_Rcvd(ULONG thread_input)
{
  TX_INTERRUPT_SAVE_AREA


  while(1){
               
      if(UART1_received==1){
                       
        TX_DISABLE//关中断
                       
        UART1_received =0; //clear
                       
        TX_RESTORE//开中断   


        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);//LED闪烁      
                       
      }
               
     tx_thread_sleep(10);
   }
      
}



三、STM32Cube配置如下所示:
STM32C011_1Wire_Usart-1.png


STM32C011_1Wire_Usart2.png


STM32C011_1Wire_Usart3.png







四、项目测试过程截图:
STM32C011_1Wire_Usart4.png

STM32C011_1Wire_Usart5.png

STM32C011_1Wire_Usart6.png



1、发送测试端,发送数据包说明:
   数据包头:0x1B,‘U’--------2个字节
   数据包内容1: Btyes2-----Bytes18 ---------->"HTC Uart Running...\n\r";
   数据包内容2: Btyes19-----Bytes22---------->4字节的发送次数;200ms间隔递增
   数据包结尾:  '&','^'-------2个字节
2、数据接收端:
   自动接收数据,自动分析数据包头,尾是否正确;
   接收正确,置位变量: UART1_received
   接收标志置位后,自动触发PC15引脚驱动的LED闪烁。

   驱动LED闪烁的硬件电路如下: 原蜂鸣器BZ1位置处,焊接一个LED;

STM32C011_1Wire_Usart---LED驱动.png

3、可以用仿真器,在接收端仿真运行后,查看rcvd_buf数据缓冲区的数据内容。

五、项目工程文件包:
STM32C011_1WireUsart_Project.zip (2.88 MB, 下载次数: 4)

编译下载说明: 头文件main.h中:
#define  USART_1WIRE_RCV_EN    1    //1--->RX; 0--->TX
选择是发送,还是接收。

其中一个板子烧写发送的代码,一个板上烧写接收的代码;

最后按照如上的连接,上电进行测试。



评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

8

主题

53

回帖

77

积分

初级会员

积分
77
 楼主| 发表于 2024-8-4 13:43:33 | 显示全部楼层
测试图片中:白色连接线,标错了,应该是C14,见下图:

STM32单线串口半双工-3.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-8-5 09:29:09 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-25 18:34 , Processed in 0.494445 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表