本帖最后由 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)
|