/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "queue.h"
#include "usart.h"
#include <string.h>
#include "event_groups.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
void SendTask(void *data);
void RecvTask(void *data);
//软件定时器的回调函数
void timer1_callback(TimerHandle_t xtimer);
void timer2_callback(TimerHandle_t xtimer);
TimerHandle_t timer1_handle;
TimerHandle_t timer2_handle;
TaskHandle_t sendtaskhandle=NULL;
TaskHandle_t recvtaskhandle=NULL;
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
xTaskCreate(SendTask,"SendTask",128,NULL,2,&sendtaskhandle);
xTaskCreate(RecvTask,"RecvTask",128,NULL,3,&recvtaskhandle);
//创建一个定时器
timer1_handle=xTimerCreate("timer1", //定时器名字,调试用
1000, //多长时间触发 //单位tick
pdTRUE, //是否重复
(void*)1, //标志位,每个定时器不能相同
timer1_callback); //回调函数
timer2_handle=xTimerCreate("timer2",
1000,
pdFALSE,
(void*)2,
timer2_callback);
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* 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 *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
void SendTask(void *data)
{
while(1)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==0)
{
vTaskDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==0);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==1)
{
vTaskDelay(20) ;
USART_printf(&huart1,"button2 on\n");
xTimerStop(timer1_handle,portMAX_DELAY); //停止定时器
xTimerStop(timer2_handle,portMAX_DELAY); //停止定时器
USART_printf(&huart1,"timer1,timer2 stop\n");
}
}
}
vTaskDelete( NULL );
}
void RecvTask(void *data)
{
while(1)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)
{
vTaskDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1)
{
vTaskDelay(20) ;
USART_printf(&huart1,"button1 on\n");
xTimerStart(timer1_handle,portMAX_DELAY); //启动定时器 死等
xTimerStart(timer2_handle,portMAX_DELAY); //启动定时器
USART_printf(&huart1,"timer1,timer2 start\n");
}
}
}
vTaskDelete( NULL );
}
void timer1_callback(TimerHandle_t xtimer)
{
USART_printf(&huart1,"hello\n");
}
void timer2_callback(TimerHandle_t xtimer)
{
USART_printf(&huart1,"word!\n");
}
只有按下按键才会打印hello不按下就不打印,另外pb6不能用不知道为啥
最新发布