Cube平台STM32F405RGT6开发日志<FreeRTOS系统及串口调试>

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

 


前言

在上文STM32F405VGT6  Cube 配置的基础上

建立任务函数 并调试了串口模块


 

一、学习USART相关的库函数 (通过F407 HAL库开发函数进行的学习)

   1.在.c  的.h文件里面可以看到HAL库支持哪些函数

2.在FreeRTOS函数界面 引入了串口 .h 文件 不然没法使用句柄

 

二、使用步骤

1.USART任务函数编写

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
		uint8_t d[2];
    d[0]=0x00;


	while(1)
	{       	
			HAL_UART_Transmit(&huart1,d,1,1000);	
			HAL_Delay(1000);
	}
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_task_test_01 */
/**
* @brief Function implementing the task_test thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_task_test_01 */
void task_test_01(void const * argument)
{
  /* USER CODE BEGIN task_test_01 */
  /* Infinite loop */
  for(;;)
  {
		uint8_t a[2];
		a[1]=0x44;
		a[0]=0x55;

	while(1)
	{       	
			HAL_UART_Transmit(&huart1,a,2,1000);	
			HAL_Delay(5000);
	}
  }
  /* USER CODE END task_test_01 */
}

 

2.引脚连接(下载 与 串口调试)

  1.代码下载 

    由于购买的板子并没有USB串口接口,并且只支持SWD下载。因此借用MiniFLy的下载模块 。

   观察实物PCB板正反面走线 和 PCB原理图 判断出如何连接,并且设置Debug 为JTAG SWD下载模式 进行了程序下载。

2.由于没有USB转串口 USB只有供电功能 因此 借用串口线先给F407探索者下载了串口收发程序 然后将F405与F407串口相连接, 将F405发送的数据通过F407再发送到电脑上 进行了调试

三、调试过程

1.在任务编写界面要引入头文件

2.当1任务优先级更高      任务都延时500时                 只会发送 00

                                        低优先级任务延时200          只会发送 00

                                        高优先级任务延时5000        只会发送 00

     当优先级相同时           

                                        都延时500时                           都会发送

                                        2任务延时200                                 都会发送

                                       1任务延时5000  2任务延时200        都会发送   说明延时并不是阻塞

  这里是因为默认任务的优先级一直最高 所以一直进入默认任务 产生了优先级高就阻塞了其他任务的错觉,实际上是每次退出后发现任务1优先级高(因为它并没有进去阻塞态 依旧是就绪态)所以又持续进入任务1了。

————————————————————————————————————————————————————————————————————————

这里理解错误: 因为使用的HAL 所以在优先级相同时都会各自执行,但是在优先级高时就只一直执行优先级高的任务所以只发送00。

osDelay属于CMSIS-RTOS的阶层,ARM CMSIS已经定义好了,由各RTOS具体实现。
FreeRTOS内部其实使用vTaskDelay来实现osDelay,其作用是让任务阻塞(注意是阻塞不是挂起,挂起必须显示调用vTaskSuspend()和vTaskResume()才能够实现),任务阻塞后,RTOS系统调用其它处于就绪状态的优先级最高的任务来执行。 os是us级的,vTaskDelay是ms级的,并且os和vTask都会引起任务切换
当然你也可以不用osDelay而直接使用vTaskDelay,但为了保持兼容性,建议还是用osDelay而不是vTaskDelay,其实其效果类似。
HAL_Delay一直不停的调用获取系统时间的函数,直到指定的时间流逝然后退出,故其占用了全部CPU时间。

3.需要延时应该对osDelay进行学习

差别在于延时时会进行任务切换,此任务进入阻塞态,任务调度器在延时结束前调度其他目前优先级高的任务。


总结

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值