STM32串口通信的实例(内附详细代码)

这里我们使用串口1,来通过我们发送的数据来决定去实现相应的操作。

示例是当单片机串口接收到数据后控制LED1的亮灭,并且将数据发送到上位机

首先我们的LED1的初始化,当然PB0连接的是蜂鸣器,这边就一起配置,首先初始化这俩个引脚。

LED1灯和BUZZER的配置和相关函数

led.c

#include "stm32f10x.h"                  // Device header
#include "hal_led.h"

static void hal_ledconfig(void);//外部接口
void hal_LEDInit(void)
{
	hal_ledconfig();

}
static void hal_ledconfig(void)
{
		GPIO_InitTypeDef   GPIOInitStructure;//创建GPIO结构体变量
		//用到了GPIOA和GPIOB,打开
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIOB的时钟
		//用到什么外设就需要打开对应外设的时钟,不然初始化不会成功
		GPIOInitStructure.GPIO_Pin=LED1_Pin;//LED1_Pin是对GPIOA_Pin1的宏定义目的是便于移植
		GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//这里我们需要控制灯所以将引脚设置成推挽输出模式
		GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度一般设置成50MHZ,当然你们可以自己去配置成其他的
		
		GPIO_Init(LED1_PORT,&GPIOInitStructure);//将GPIOA_Pin_1的初始化结构体参数初始化
		GPIO_ResetBits(LED1_PORT,LED1_Pin);//关闭灯
		
		GPIOInitStructure.GPIO_Pin=BUZ_Pin;//再给GPIOB_Pin_0配置,BUZZER和LED1的配置相同这边就不重复说明了
		GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
		GPIOInitStructure.GPIO_Speed=GPIO_Spe
当然可以!这里是一个使用STM32HAL库进行串口通信的简单实例: 首先,需要在CubeMX中配置串口。打开CubeMX并选择你的微控制器型号,然后点击"Peripherals"选项卡,在左侧的"USART"菜单下选择一个可用的串口。根据你的需求,配置串口的参数,例如波特率、数据位、停止位等。最后点击"Pinout & Configuration"选项卡,将串口的引脚分配给正确的GPIO引脚。 生成代码后,在你的工程中打开`main.c`文件,并添加以下代码: ```c #include "stm32fxxx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); uint8_t txData[] = "Hello, world!\r\n"; uint8_t rxData[20]; while (1) { HAL_UART_Transmit(&huart2, txData, sizeof(txData), HAL_MAX_DELAY); HAL_UART_Receive(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { while(1); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { while(1); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { while(1); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 这段代码初始化了系统时钟、GPIO和USART2串口。在主循环中,我们通过串口发送"Hello, world!\r\n",然后通过串口接收数据。 请注意,在上述代码中,我们使用了USART2串口和GPIOA的引脚2和3。如果你选择了不同的串口和引脚,请相应地修改代码。 希望这个例子能帮助到你!如有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值