xfcjava2 发表于 2024-8-7 10:59

STM32 单线串口半双工

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_tsendNum;      
#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数据缓冲区的数据内容。



五、项目工程文件包:




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

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

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














菜鸟的第一步 发表于 2024-8-7 13:44

很详细的设计过程

zhuhaiyang 发表于 2024-11-15 10:32

STM32C011F4/20SSOP多钱?

xfcjava2 发表于 2024-11-21 19:51

STM32C011F6P6,年初买的时候,是含税1.85元左右的样子,STM32C011F4的价格,应该更便宜,不过到现在,这款芯片涨价了不少。
页: [1]
查看完整版本: STM32 单线串口半双工