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
选择是发送,还是接收。
其中一个板子烧写发送的代码,一个板上烧写接收的代码;
最后按照如上的连接,上电进行测试。
|