[STM32F4] 【F446RE开发板试用】FreeRTOS+ HAL 串口

[复制链接]
5786|17
 楼主| Ketose 发表于 2015-10-1 23:20 | 显示全部楼层 |阅读模式
本帖最后由 Ketose 于 2015-10-29 19:14 编辑

今天学习使用Cube下使用FreeRTOS+串口,目的是使用DMA把串口的信息转发出来,其中使用了FreeRTOS的信息机制。
通讯原理就是上位机先发两个字节的包头,指示上位机要传偷的数据大小,然后紧跟着发送传输的数据。MCU收到信息后,去掉包头,把信息回显出来。
原理图:
QQ图片20151001220354.png
其实PA2,PA3是连接到ST-LINK的,ST-LINK通过USB在电脑上虚拟了一个串口。
我的电脑上的虚拟串口:
QQ图片20151001220701.jpg
Cube操作如下,首先New Project选择如下:
QQ图片20151001220701.jpg
选择OK之后,配置要使用的部件如下:
因为要使用FreeRTOS所以这个要选上 QQ图片20151001220354.png
然后是USART2选择异步: QQ图片20151001220354.png
PA5连接LED做为工作指示使用,配置成输出: QQ图片20151001220354.png
时钟配置如下: QQ图片20151001220354.png
然是配置外设部分,首先是配置USART2,USART2只需要配置发送使用DMA方式,把USART2的中断设置为Enable,其它参数不变。
QQ图片20151001222603.jpg
NVIC配置如下:
QQ图片20151001220701.jpg
FreeRTOS增加一个Usart2接收任务:
QQ图片20151001220701.jpg
OK,所有的配置完了成,可以生成项目了。生成项目的时候把下面选项选上,生成的代码会更条理一些。
QQ图片20151001220354.png
下面就是代码部分了:freertos.c里添加如下代码:
  1. /* StartDefaultTask function */
  2. void StartDefaultTask(void const * argument)
  3. {

  4.   /* USER CODE BEGIN StartDefaultTask */
  5.   /* Infinite loop */
  6.   for(;;)
  7.   {
  8.     HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
  9.     osDelay(1000);
  10.   }
  11.   /* USER CODE END StartDefaultTask */
  12. }

  13. /* UartReceiveTask function */
  14. void UartReceiveTask(void const * argument)
  15. {
  16.   /* USER CODE BEGIN UartReceiveTask */
  17.   /* Infinite loop */
  18.         for(;;)
  19.         {
  20.                 HAL_UART_Receive_IT(&huart2,receiveBuffer,2);
  21.                 receiveCase = 1;
  22.                 osSignalWait(SIGNAL_01,osWaitForever);
  23.                 HAL_UART_Receive_IT(&huart2,receiveBuffer,receiveCount);
  24.                 receiveCase = 2;
  25.                 osSignalWait(SIGNAL_02,osWaitForever);
  26.         }
  27.   /* USER CODE END UartReceiveTask */
  28. }
main.c文件里添加的代码:
  1. /**
  2.   * @}
  3.   */
  4. /*UART ½ÓÊÕÍê³É»Øµ÷º¯Êý*/
  5. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  6. {
  7.         if(receiveCase == 1)
  8.         {
  9.                 receiveBuffer[2] = 0x0;
  10.                 receiveCount = atoi((char*)receiveBuffer);
  11.                 osSignalSet(uartRxTaskHandle,SIGNAL_01);
  12.         }
  13.         if(receiveCase == 2)
  14.         {
  15.                 receiveBuffer[receiveCount] = 0x0;
  16.                 sprintf(displayBuffer,"STM32F4:>%s",receiveBuffer);
  17.                 int displayLen = strlen(displayBuffer);
  18.                 receiveBuffer[displayLen] = 0x0;
  19.                 HAL_UART_Transmit_DMA(&huart2,(uint8_t*)displayBuffer,displayLen);
  20.         }
  21. }
  22. /*UART dma·¢ËÍÍê³É»Øµ÷*/
  23. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  24. {
  25.         HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);

  26.         if(receiveCase == 2)
  27.         {
  28.                 osSignalSet(uartRxTaskHandle,SIGNAL_02);
  29.         }
  30. }


  31. /**
  32.   * @}
  33. */
统译下载至开发板。效果如下:
UART.rar (1.27 MB, 下载次数: 68)

网站不支持GIF,没办法,只有打个包
源码为7z格式,下载了自己改名为.7z: Usart_Test.7z.rar (1.59 MB, 下载次数: 87)

打赏榜单

21ic小喇叭 打赏了 5.00 元 2015-10-26

wu1169668869 发表于 2015-10-1 23:43 | 显示全部楼层
会玩freertos真好
皈依 发表于 2015-10-2 10:50 | 显示全部楼层
赞一个~
逍遥李 发表于 2015-10-10 15:19 | 显示全部楼层
我尝试过自己移植FREERTOS吗?我试了F070没问题,但是移植到F446上不知道怎么回事就不行了,不运行
 楼主| Ketose 发表于 2015-10-10 22:11 | 显示全部楼层
逍遥李 发表于 2015-10-10 15:19
我尝试过自己移植FREERTOS吗?我试了F070没问题,但是移植到F446上不知道怎么回事就不行了,不运行 ...

F0 和 F4是有区别的。F4用到浮点运算的话,任务切换还要保存浮点寄存器。
逍遥李 发表于 2015-10-14 09:22 | 显示全部楼层
Ketose 发表于 2015-10-10 22:11
F0 和 F4是有区别的。F4用到浮点运算的话,任务切换还要保存浮点寄存器。

新手,不太懂,保存浮点寄存器要用汇编吗?过程复杂不?
 楼主| Ketose 发表于 2015-10-14 11:23 | 显示全部楼层
逍遥李 发表于 2015-10-14 09:22
新手,不太懂,保存浮点寄存器要用汇编吗?过程复杂不?

网上应该有现成的。
逍遥李 发表于 2015-10-14 11:56 | 显示全部楼层
Ketose 发表于 2015-10-14 11:23
网上应该有现成的。

好的,谢谢指点!
yklstudent 发表于 2015-10-28 14:43 | 显示全部楼层
楼主方便分享下范例嘛
foxglove 发表于 2015-10-28 14:57 | 显示全部楼层
FreeRTOS+串口
 楼主| Ketose 发表于 2015-10-28 15:56 | 显示全部楼层
yklstudent 发表于 2015-10-28 14:43
楼主方便分享下范例嘛

没有问题。。。。
yklstudent 发表于 2015-10-28 16:10 | 显示全部楼层
Ketose 发表于 2015-10-28 15:56
没有问题。。。。

524716771,麻烦楼主发一份,谢谢了
zhuotuzi 发表于 2015-10-28 16:37 | 显示全部楼层
根据设备管理器的截图看,那个视频卡没有安装驱动,也就是你的显卡没有安装驱动程序。
734774645 发表于 2015-10-28 17:34 | 显示全部楼层
会玩freertos真好,可以做很多牛X的项目。
 楼主| Ketose 发表于 2015-10-29 09:33 | 显示全部楼层
yklstudent 发表于 2015-10-28 16:10
524716771,麻烦楼主发一份,谢谢了

不好意思,忘了发了。今天给你补上。
yklstudent 发表于 2015-10-29 12:43 | 显示全部楼层
Ketose 发表于 2015-10-29 09:33
不好意思,忘了发了。今天给你补上。

恩,谢谢了,麻烦就在这里上传下好了,造福大家
huangcunxiake 发表于 2015-10-29 16:41 | 显示全部楼层
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 楼主| Ketose 发表于 2015-10-29 19:15 | 显示全部楼层
yklstudent 发表于 2015-10-29 12:43
恩,谢谢了,麻烦就在这里上传下好了,造福大家

已经上传源码。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我最讨厌两种人:一是有种族歧视的; 二是黑人;三是不识数的!

66

主题

3267

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部