打印
[STM32C0]

STM32 单线串口半双工

[复制链接]
354|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32 单线串口半双工:

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

一、硬件测试电路如下:








二、STM32Cube配置如下所示:













三、项目内容如下:




串口配置:

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);
   }      
}


四、项目测试过程截图:









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;


   

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



五、项目工程文件包:


STM32C011_1WireUsart_Project.zip (2.88 MB)

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

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

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














使用特权

评论回复
沙发
菜鸟的第一步| | 2024-8-7 13:44 | 只看该作者
很详细的设计过程

使用特权

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

本版积分规则

27

主题

450

帖子

42

粉丝