发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表
打印
[STM32F4]

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

[复制链接]
5419|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ketose|  楼主 | 2015-10-1 23:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Ketose 于 2015-10-29 19:14 编辑

今天学习使用Cube下使用FreeRTOS+串口,目的是使用DMA把串口的信息转发出来,其中使用了FreeRTOS的信息机制。
通讯原理就是上位机先发两个字节的包头,指示上位机要传偷的数据大小,然后紧跟着发送传输的数据。MCU收到信息后,去掉包头,把信息回显出来。
原理图:

其实PA2,PA3是连接到ST-LINK的,ST-LINK通过USB在电脑上虚拟了一个串口。
我的电脑上的虚拟串口:

Cube操作如下,首先New Project选择如下:

选择OK之后,配置要使用的部件如下:
因为要使用FreeRTOS所以这个要选上
然后是USART2选择异步:
PA5连接LED做为工作指示使用,配置成输出:
时钟配置如下:
然是配置外设部分,首先是配置USART2,USART2只需要配置发送使用DMA方式,把USART2的中断设置为Enable,其它参数不变。

NVIC配置如下:

FreeRTOS增加一个Usart2接收任务:

OK,所有的配置完了成,可以生成项目了。生成项目的时候把下面选项选上,生成的代码会更条理一些。

下面就是代码部分了:freertos.c里添加如下代码:
/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{

  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
    osDelay(1000);
  }
  /* USER CODE END StartDefaultTask */
}

/* UartReceiveTask function */
void UartReceiveTask(void const * argument)
{
  /* USER CODE BEGIN UartReceiveTask */
  /* Infinite loop */
        for(;;)
        {
                HAL_UART_Receive_IT(&huart2,receiveBuffer,2);
                receiveCase = 1;
                osSignalWait(SIGNAL_01,osWaitForever);
                HAL_UART_Receive_IT(&huart2,receiveBuffer,receiveCount);
                receiveCase = 2;
                osSignalWait(SIGNAL_02,osWaitForever);
        }
  /* USER CODE END UartReceiveTask */
}
main.c文件里添加的代码:
/**
  * @}
  */
/*UART ½ÓÊÕÍê³É»Øµ÷º¯Êý*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(receiveCase == 1)
        {
                receiveBuffer[2] = 0x0;
                receiveCount = atoi((char*)receiveBuffer);
                osSignalSet(uartRxTaskHandle,SIGNAL_01);
        }
        if(receiveCase == 2)
        {
                receiveBuffer[receiveCount] = 0x0;
                sprintf(displayBuffer,"STM32F4:>%s",receiveBuffer);
                int displayLen = strlen(displayBuffer);
                receiveBuffer[displayLen] = 0x0;
                HAL_UART_Transmit_DMA(&huart2,(uint8_t*)displayBuffer,displayLen);
        }
}
/*UART dma·¢ËÍÍê³É»Øµ÷*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);

        if(receiveCase == 2)
        {
                osSignalSet(uartRxTaskHandle,SIGNAL_02);
        }
}


/**
  * @}
*/
统译下载至开发板。效果如下:
UART.rar (1.27 MB)

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

打赏榜单

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上不知道怎么回事就不行了,不运行

使用特权

评论回复
5
Ketose|  楼主 | 2015-10-10 22:11 | 只看该作者
逍遥李 发表于 2015-10-10 15:19
我尝试过自己移植FREERTOS吗?我试了F070没问题,但是移植到F446上不知道怎么回事就不行了,不运行 ...

F0 和 F4是有区别的。F4用到浮点运算的话,任务切换还要保存浮点寄存器。

使用特权

评论回复
6
逍遥李| | 2015-10-14 09:22 | 只看该作者
Ketose 发表于 2015-10-10 22:11
F0 和 F4是有区别的。F4用到浮点运算的话,任务切换还要保存浮点寄存器。

新手,不太懂,保存浮点寄存器要用汇编吗?过程复杂不?

使用特权

评论回复
7
Ketose|  楼主 | 2015-10-14 11:23 | 只看该作者
逍遥李 发表于 2015-10-14 09:22
新手,不太懂,保存浮点寄存器要用汇编吗?过程复杂不?

网上应该有现成的。

使用特权

评论回复
8
逍遥李| | 2015-10-14 11:56 | 只看该作者
Ketose 发表于 2015-10-14 11:23
网上应该有现成的。

好的,谢谢指点!

使用特权

评论回复
9
yklstudent| | 2015-10-28 14:43 | 只看该作者
楼主方便分享下范例嘛

使用特权

评论回复
10
foxglove| | 2015-10-28 14:57 | 只看该作者
FreeRTOS+串口

使用特权

评论回复
11
Ketose|  楼主 | 2015-10-28 15:56 | 只看该作者
yklstudent 发表于 2015-10-28 14:43
楼主方便分享下范例嘛

没有问题。。。。

使用特权

评论回复
12
yklstudent| | 2015-10-28 16:10 | 只看该作者
Ketose 发表于 2015-10-28 15:56
没有问题。。。。

524716771,麻烦楼主发一份,谢谢了

使用特权

评论回复
13
zhuotuzi| | 2015-10-28 16:37 | 只看该作者
根据设备管理器的截图看,那个视频卡没有安装驱动,也就是你的显卡没有安装驱动程序。

使用特权

评论回复
14
734774645| | 2015-10-28 17:34 | 只看该作者
会玩freertos真好,可以做很多牛X的项目。

使用特权

评论回复
15
Ketose|  楼主 | 2015-10-29 09:33 | 只看该作者
yklstudent 发表于 2015-10-28 16:10
524716771,麻烦楼主发一份,谢谢了

不好意思,忘了发了。今天给你补上。

使用特权

评论回复
16
yklstudent| | 2015-10-29 12:43 | 只看该作者
Ketose 发表于 2015-10-29 09:33
不好意思,忘了发了。今天给你补上。

恩,谢谢了,麻烦就在这里上传下好了,造福大家

使用特权

评论回复
17
huangcunxiake| | 2015-10-29 16:41 | 只看该作者
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

使用特权

评论回复
18
Ketose|  楼主 | 2015-10-29 19:15 | 只看该作者
yklstudent 发表于 2015-10-29 12:43
恩,谢谢了,麻烦就在这里上传下好了,造福大家

已经上传源码。。。

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

64

主题

3223

帖子

15

粉丝