一篇文章入门Stm32CubeMX在freertos系统下进行uart串口通讯

相信大部分人早期入门STM32系列单片机都是从各种例程入手的,STM32单片机繁多的寄存器已经不允许我们像学51系列单片机一样直接操作寄存器了(如果你记忆力好,或者愿意花很多时间翻芯片手册查看对应寄存器的则当我没说过哈),而早期的stm32基本都是运用标准库函数进行编程的,而如今ST公司为了在移植时的方便性推出了HAL库,并且开发了相应的开发软件Stm32CubeMX用于轻松配置所需要的功能外设等,不再需要像以前一样找各种外设例程拷贝各种外设是如何配置的了。
接下来让我们一步步学习如何使用STM32CubeMX,并尝试跑一跑freertos系统,跑系统的好处就不必多说了,最大的好处就是不用考虑过多的程序先后顺序和逻辑了,只需要将所需要的功能配置成各个任务执行就可以了。

1. 打开STM32CUBEMX后选择此项:
在这里插入图片描述

2.选择对应的使用的单片机型号,这里我使用的是STM32F103C8:
在这里插入图片描述
3.接下来进行单片机工作配置,首先配置晶振模式:
在这里插入图片描述
配置仿真烧录模式(这里选择SW模式,即到时候生成keil工程后选择SW烧录仿真):
在这里插入图片描述
配置时钟:
在这里插入图片描述
4.进行功能外设的配置(包括一个IO口和一个UART串口):
在这里插入图片描述
此时可以看到界面已经配置好一个IO管脚了,我们可以再次对其进行修改:
在这里插入图片描述
5.配置uart串口(此处由于我使用了串口中断,所以使能NVIC):
在这里插入图片描述
使能串口中断(不使能到时候无法使用串口IT中断接收和发送功能):

在这里插入图片描述
6.移植freertos系统,并创建两个任务(只需创建多1个,初始已有1个):
在这里插入图片描述
7.进行工程保存与转换的配置:
在这里插入图片描述
在这里插入图片描述
8.保存工程并进行转换:
在这里插入图片描述
9.等待转换完成,到保存路径中打开对应程序工程:
在这里插入图片描述
10.对应工程进行程序修改:
在这里插入图片描述
查看main文件,可以看到串口1和PC13初始化已经帮我们初始化配置好了,我们要进行的操作仅仅是根据自身需求进行对应外设的功能操作(真方便呀!):
在这里插入图片描述
可以看到freertos的两个任务也在main文件中,接下来我们就把任务1设置为PC13驱动LED灯闪烁,任务2则进行串口1的通信:
在这里插入图片描述
对应此部分代码也copy给各位吧:

void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(500);//500Ϊ500ms
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//·­×ªPC13¿Úµçƽ
  }
  /* USER CODE END 5 */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
 	uint8_t rec_buf[8],send_buf[]={'r','e','c'};//ÅäÖÃ1¸ö½ÓÊÕÊý×飬1¸ö·¢ËÍÊý×é
	HAL_UART_Transmit(&huart1, "hello", 5,0xFFFF);//ʹÓô®¿Ú1·¢ËÍ"hello"×Ö·û´®£¬¶ÔÓ¦5¸ö×Ö½Ú£¬³¬Ê±·¢ËÍʱ¼äΪ0xFFFF
  HAL_UART_Receive_IT(&huart1,rec_buf,1);   //¿ªÆô´®¿Ú½ÓÊÕÖжϣ¬ÅäÖô®¿Ú1½ÓÊÕrec_bufÒ»¸ö×Ö½Ú
  for(;;)
  {
    osDelay(1);
		if(rec_buf[0]=='a')//µ±½ÓÊÕµ½Îª×Ö·û´®aʱ£¬·µ»ØÊä³ösend_buf,¼´Êä³örec
		{
			rec_buf[0]=0;
			HAL_UART_Transmit_IT(&huart1, send_buf, sizeof(send_buf));
		}
			HAL_UART_Receive_IT(&huart1,rec_buf,1);   
  }
  /* USER CODE END StartTask2 */
}

*大家是不是疑惑这些操作函数从哪来的呢,他们都在对应的.h文件中;
首先我们编译整个工程,让文件链接好,再点开+号项,就可以查看相关链接文件了,我们以查看GPIO操作函数为例:

在这里插入图片描述
*
11.程序烧录与结果(手上必须有烧录器和单片机,我的是cmsis-dap和stm32f103c8开发板,总成本40块左右,想自己动手而自己手头又没有的朋友可以去某宝上面逛逛):
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在连接好硬件设备的情况下,单击此处进行程序烧录:
在这里插入图片描述
然后我们就可以复位单片机观察单片机的工作情况了,如果你们的LED灯跟我一样接在PC13口的话,可以看到LED灯以500ms的频率在亮灭闪烁,然后通过串口助手观察串口1是否工作正常:
在这里插入图片描述
可以看到复位单片机后接收区收到“hello”字符串,当我们以115200的波特率发送文本数据“a”,接收区可以正确收到“rec”。
好了,本次教程到此为止,第一次写得这么详细,希望各位都可以轻松上手!

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要在STM32上使用FreeRTOS和串口中断,您可以按照以下步骤进行操作: 1. 配置串口模块: - 使用STM32CubeMX配置您的引脚和时钟设置,以启用串口功能。 - 在生成的代码中,找到与您使用的串口对应的文件(例如,USART1、USART2等)。 - 在该文件中,配置串口的波特率、数据位、停止位、校验位等参数。 2. 初始化FreeRTOS: - 在您的main函数中,调用FreeRTOS的初始化函数(例如`vTaskStartScheduler()`)来启动任务调度器。 3. 创建串口接收任务: - 使用FreeRTOS提供的API函数(例如`xTaskCreate()`)创建一个任务,用于处理串口接收中断。 4. 配置串口中断: - 在您的代码中,编写串口接收中断处理函数,并将其与正确的中断向量关联。 - 在中断处理函数中,使用FreeRTOS提供的通信机制(例如队列)来处理接收到的数据。 5. 在串口接收任务中处理数据: - 在串口接收任务的任务函数中,使用FreeRTOS提供的API函数(例如`xQueueReceive()`)从队列中接收数据。 - 处理接收到的数据,执行您希望实现的功能。 6. 发送数据到串口: - 在其他任务中,使用FreeRTOS提供的API函数(例如`xQueueSend()`)将数据发送到串口发送队列。 - 在串口发送中断处理函数中,从发送队列中获取数据,并将其发送到串口。 通过以上步骤,您可以在STM32上实现使用FreeRTOS和串口中断进行数据接收和发送的功能。请注意,在实际编程中,您还需要处理任务优先级、同步和互斥等问题,以确保正确和可靠的数据传输。建议您参考STMicroelectronics的官方文档、FreeRTOS文档和相关示例代码,以获取更详细的指导和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值