/* Standard includes. */ #include <stdio.h> #include <stdint.h> /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" /* Library includes. */ #include "stm32f10x.h" #define LED0_ON() GPIO_SetBits(GPIOB,GPIO_Pin_5); #define LED0_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_5); /* 队列句柄 */ xQueueHandle MsgQueue; static void prvSetupHardware( void ); void TaskA( void *pvParameters ); void TaskB( void *pvParameters ); void LedInit(void); void UART1Init( void ); int main( void ) { /* 初始化硬件平台 */ prvSetupHardware(); /* 建立队列 */ MsgQueue = xQueueCreate( 5 , sizeof( int16_t ) ); /* 建立任务 */ xTaskCreate( TaskA, ( signed portCHAR * ) "TaskA", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL ); xTaskCreate( TaskB, ( signed portCHAR * ) "TaskB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+4, NULL ); /* 启动OS */ vTaskStartScheduler(); return 0; } /*-----------------------------------------------------------*/ void TaskA( void *pvParameters ) { int16_t SendNum = 1; for( ;; ) { vTaskDelay( 2000/portTICK_RATE_MS ); /* 向队列中填充内容 */ xQueueSend( MsgQueue, ( void* )&SendNum, 0 ); SendNum++; } } void TaskB( void *pvParameters ) { int16_t ReceiveNum = 0; for( ;; ) { /* 从队列中获取内容 */ if( xQueueReceive( MsgQueue, &ReceiveNum, 100/portTICK_RATE_MS ) == pdPASS) { printf("ReceiveNum:%d\r\n",ReceiveNum); } } } static void prvSetupHardware( void ) { LedInit(); UART1Init(); } void LedInit( void ) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); /*LED0 @ GPIOB.5*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOB, &GPIO_InitStructure ); } void UART1Init( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第1步:打开GPIO和USART时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); /* 第2步:将USART1 Tx@PA9的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 第3步:将USART1 Rx@PA10的GPIO配置为浮空输入模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 第4步:配置USART1参数 */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* 第5步:使能 USART1, 配置完毕 */ USART_Cmd(USART1, ENABLE); } int fputc(int ch, FILE *f) { /* 写一个字节到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送结束 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {} return ch; }