STM32最小核心板使用HAL库实现UART接口通讯(中断方式)

正式环境里需要串联电阻,或设计过滤电路。核心板是STM32F103C8T6

这里使用了UART3的接口,具体使用MX创建项目就不放了,百度下都有

复制代码
/*
    USART3 GPIO Configuration
    PB10     ------> USART3_TX
    PB11     ------> USART3_RX
*/

因为是串口通讯所以双机接线需要交叉

接口的关键代码配置如下:

cpp 复制代码
void MX_USART3_UART_Init(void)
{
  huart3.Instance = USART3;
  huart3.Init.BaudRate = 115200;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART3)
  {
    /* USART3 clock enable */
    __HAL_RCC_USART3_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**USART3 GPIO Configuration
    PB10     ------> USART3_TX
    PB11     ------> USART3_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* USART3 interrupt Init */
    HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART3_IRQn);
  }
}

因为是中断方式收数据,所以需要自己实现个中断函数,系统会自己重载你实现的函数(名字要对)

cpp 复制代码
//全局变量
char aRxChr;	
char aRxBuffer[100];
uint32_t nRxLen;
//中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART3){
		if (nRxLen == 0){
			memset(aRxBuffer,0,100);
		}
        //判断结束标志位字符
		if (aRxChr != '#'){
				aRxBuffer[nRxLen] =aRxChr;
				nRxLen++;
		}else{
			  aRxBuffer[nRxLen] = 0;
				nRxLen = 0;
		}
        //打开中断
		HAL_UART_Receive_IT(&huart3,(uint8_t*)&aRxChr,1);
	}
}

需要接收不固定长度的数据,所以必须1个字节1个字节的收,然后组合成完整的。

最后给出Main主线程里的测试代码

cpp 复制代码
//上面其他的初始化就不放了,放关键的
MX_USART3_UART_Init();

nRxLen = 0;
uint8_t aTxBuffer[]="1234567890#";
//打开收中断
HAL_UART_Receive_IT(&huart3,(uint8_t*)&aRxChr,1);	
	
while (1) {
    //发送数据
    HAL_UART_Transmit(&huart3,(uint8_t*)&aTxBuffer,strlen(aTxBuffer),100);

    //这里可以处理aRxBuffer的内容,如果要搞的好点就再自己搞个锁来判断是否收到完整数据


    HAL_Delay(1000);
}
相关推荐
单片机仿真设计7 小时前
【proteus仿真】基于 STM32 单片机衣柜温湿度监测系统(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus
嵌入式学习菌7 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
千秋岁rr8 小时前
11.USART
单片机·嵌入式硬件
ouynagda8 小时前
51 单片机外部中断 + 定时器中断实验(P3.2 按键清零,无消抖)
单片机·嵌入式硬件
辰域电子8 小时前
STM32项目开源:环境质量监测系统(代码+原理图+仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus
单片机仿真设计8 小时前
【proteus仿真】基于 STM32+DHT11 温湿度监测系统 Proteus 仿真设计
stm32·单片机·嵌入式硬件·proteus
国科安芯8 小时前
星链供电架构中的高集成度电源管理方案研究——基于ASP4644四通道降压稳压器在低轨卫星星座中的应用分析
大数据·单片机·嵌入式硬件·架构·低轨卫星·星间链路
wuyk5559 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
xx~t10 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
保安大队王队长11 小时前
51单片机知识
单片机·嵌入式硬件·51单片机