Beep sound, delay function in VS

本文介绍如何在Visual C++中使用Beep函数发出指定频率和时长的声音,并提供了一种有效的延迟方法,避免了窗口冻结的问题。

VC中让软件发出Beep声,用Beep函数,另需添加头文件, #include <windows.h>,例如,Beep(1000,500);


Syntax

C++
BOOL WINAPI Beep(
  _In_  DWORD dwFreq,
  _In_  DWORD dwDuration
);

Parameters

dwFreq [in]

The frequency of the sound, in hertz. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).

dwDuration [in]

The duration of the sound, in milliseconds.



延迟函数如下,

int sTime, eTime;
sTime = ::GetTickCount();
eTime = ::GetTickCount();
while (eTime - sTime < 500)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
eTime = ::GetTickCount();
}
 使用Sleep函数,或者使用循环来导致延迟,会出现窗口死的情况,用以上函数则没有,或者使用Timer和线程也可以。


转载:

在一个对话框中访问另一个对话框的变量


HWND mHwnd = ::FindWindow(NULL,"dlgok");//通过windowname得到该窗体的句柄
 DlgOk* mDlgok= (DlgOk*)CWnd::FromHandle(mHwnd ); //有该句柄得到对话框类的指针
 int ntemp= mDlgok->m_temp; //访问其中的变量

“#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "beep.h" #include "key.h" #include "FreeRTOS.h" #include "task.h" #include "timers.h" #include "timer.h" #include "sram.h" #include "string.h" #include "malloc.h" #include "math.h" //#include "exti.h" #include "semphr.h" // 128 x 64 #define SCREEN_WIDTH 256 #define SCREEN_HEIGHT 128 #define MAX_SNAKE_LENGTH 128 typedef enum { DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT } Direction; typedef struct { int x; int y; } Point; // total task #define START_TASK_PRIO 1 //Mem size #define START_STK_SIZE 1024 //total task handler TaskHandle_t StartTask_Handler; //total task function void start_task(void *pvParameters); //KEY task #define KEY_TASK_PRIO 2 //Mem size #define KEY_STK_SIZE 256 //handler TaskHandle_t KEYTask_Handler; //key task function void key_task(void *pvParameters); //LED0 task #define LED0_TASK_PRIO 3 //Mem size #define LED0_STK_SIZE 128 //handler TaskHandle_t LED0Task_Handler; //led0 task function void led0_task(void *pvParameters); //LED1 task #define LED1_TASK_PRIO 3 //Mem size #define LED1_STK_SIZE 128 //handler TaskHandle_t LED1Task_Handler; //led1 task function void led1_task(void *pvParameters); //BEEP task #define BEEP_TASK_PRIO 3 //Mem size #define BEEP_STK_SIZE 128 //handler TaskHandle_t BEEPTask_Handler; //beep task function void beep_task(void *pvParameters); //LCD task #define LCD_TASK_PRIO 3 //Mem size #define LCD_STK_SIZE 128 //handler TaskHandle_t LCDTask_Handler; //lcd task function void lcd_task(void *pvParameters); //Generate Snake Game task //task function void GenerateSnakeGame(void *pvParameters); //GenerateSnakeGame task //v Control Task void vControlTask(void *pvParameters); //software timer control task #define TIMERCONTROL_TASK_PRIO 2 #define TIMERCONTROL_STK_SIZE 256 TaskHandle_t TimerControlTask_Handler; void timercontrol_task(void *pvParameters); int lcd_discolor[14]={WHITE, BLACK, BLUE, BRED, GRED, GBLUE, RED, MAGENTA, GREEN, CYAN, YELLOW,BROWN, BRRED, GRAY }; //////////////////////////////////////////////////////// TimerHandle_t AutoReloadTimer_Handle; //ÖÜÆÚ¶¨Ê±Æ÷¾ä±ú TimerHandle_t AutoReloadTimer1_Handle; //ÖÜÆÚ¶¨Ê±Æ÷¾ä±ú1 TimerHandle_t OneShotTimer_Handle; //µ¥´Î¶¨Ê±Æ÷¾ä±ú void AutoReloadCallback(TimerHandle_t xTimer); //ÖÜÆÚ¶¨Ê±Æ÷»Øµ÷º¯Êý void AutoReloadCallback1(TimerHandle_t xTimer); //ÖÜÆÚ¶¨Ê±Æ÷»Øµ÷º¯Êý1 void OneShotCallback(TimerHandle_t xTimer); //µ¥´Î¶¨Ê±Æ÷»Øµ÷º¯Êý int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓ&Aring;Ïȼ¶·Ö×é4 delay_init(168); //³õʼ»¯ÑÓʱº¯Êý uart_init(115200); //³õʼ»¯´®¿Ú LED_Init(); //³õʼ»¯LED¶Ë¿Ú BEEP_Init(); KEY_Init(); LCD_Init(); //³õʼ»¯LCD TIM3_Int_Init(5000-1,8400-1);//timer3 reset TIM2_Int_Init(10000-1,8400-1);//timer2 reset //creat totol task xTaskCreate((TaskFunction_t )start_task, //tatol task function (const char* )"start_task", //tatol task name (uint16_t )START_STK_SIZE, //Mem size (void* )NULL, // (UBaseType_t )START_TASK_PRIO, //total task prio (TaskHandle_t* )&StartTask_Handler); //total task handler vTaskStartScheduler(); //running total task } //total task function void start_task(void *pvParameters) { taskENTER_CRITICAL(); //mem // //create LED0 task // xTaskCreate((TaskFunction_t )led0_task, // (const char* )"led0_task", // (uint16_t )LED0_STK_SIZE, // (void* )NULL, // (UBaseType_t )LED0_TASK_PRIO, // (TaskHandle_t* )&LED0Task_Handler); // //create beep task // xTaskCreate((TaskFunction_t )beep_task, // (const char* )"beep_task", // (uint16_t )BEEP_STK_SIZE, // (void* )NULL, // (UBaseType_t )BEEP_TASK_PRIO, // (TaskHandle_t* )&BEEPTask_Handler); // //create LED1 task // xTaskCreate((TaskFunction_t )led1_task, // (const char* )"led1_task", // (uint16_t )LED1_STK_SIZE, // (void* )NULL, // (UBaseType_t )LED1_TASK_PRIO, // (TaskHandle_t* )&LED1Task_Handler); // //create LCD task // xTaskCreate((TaskFunction_t )lcd_task, // (const char* )"lcd_task", // (uint16_t )LCD_STK_SIZE, // (void* )NULL, // (UBaseType_t )LCD_TASK_PRIO, // (TaskHandle_t* )&LCDTask_Handler); // //USART // xTaskCreate((TaskFunction_t )float_task, //name of function needle // (const char* )"float_task", //name of function // (uint16_t )FLOAT_STK_SIZE, //size of memory // (void* )NULL, //object // (UBaseType_t )FLOAT_TASK_PRIO, //prio // (TaskHandle_t* )&FLOATTask_Handler); //handler //software timer control task // xTaskCreate((TaskFunction_t )timercontrol_task, // (const char* )"timercontrol_task", // (uint16_t )TIMERCONTROL_STK_SIZE, // (void* )NULL, // (UBaseType_t )TIMERCONTROL_TASK_PRIO, // (TaskHandle_t* )&TimerControlTask_Handler); // //KEY // xTaskCreate((TaskFunction_t )key_task, //name of function needle // (const char* )"key_task", //name of function // (uint16_t )KEY_STK_SIZE, //size of memory // (void* )NULL, //object // (UBaseType_t )KEY_TASK_PRIO, //prio // (TaskHandle_t* )&KEYTask_Handler); //handler //Auto Timer setup AutoReloadTimer_Handle=xTimerCreate((const char* )"AutoReloadTimer", (TickType_t )1000, (UBaseType_t )pdTRUE, (void* )1, (TimerCallbackFunction_t)AutoReloadCallback); // //Auto Timer1 setup AutoReloadTimer1_Handle=xTimerCreate((const char* )"AutoReloadTimer1", (TickType_t )2000, (UBaseType_t )pdTRUE, (void* )1, (TimerCallbackFunction_t)AutoReloadCallback1); //One Timer setup OneShotTimer_Handle=xTimerCreate((const char* )"OneShotTimer", (TickType_t )2000, (UBaseType_t )pdFALSE, (void* )2, (TimerCallbackFunction_t)OneShotCallback); // xTaskCreate(GenerateSnakeGame, "Snake", configMINIMAL_STACK_SIZE * 2, NULL, 1, NULL); xTaskCreate(vControlTask, "Control", configMINIMAL_STACK_SIZE, NULL, 1, NULL); vTaskDelete(StartTask_Handler); // taskEXIT_CRITICAL(); // } //LED0 task function void led0_task(void *pvParameters) { while(1) { LED0=!LED0; vTaskDelay(1000); } } //LED1 task function void led1_task(void *pvParameters) { while(1) { LED1=!LED1; vTaskDelay(2000); } } //BEEP task function void beep_task(void *pvParameters) { while(1) { BEEP=!BEEP; vTaskDelay(10000); } } //LCD task function void lcd_task(void *pvParameters) { u8 i=0; POINT_COLOR = RED; while(1) { for(;i<50;LCD_Draw_Circle(100,80,i++)); } } //USART task function void float_task(void *pvParameters) { static float float_num=0.0000; while(1) { if(float_num<=10.0) { float_num+=0.0001; printf("float_num is: %.4f\r\n",float_num); vTaskDelay(300); } else { float_num=0.0000; vTaskDelay(300); } } } //KEY task function void key_task(void *pvParameters) { while(1) { // u8 key=0; // key=KEY_Scan(0); //get key value // switch(key) // { // case 4 /*WKUP_PRES*/: //4 is WKUP_PRES KEY is touched // vTaskSuspend(LED0Task_Handler); // vTaskSuspend(LED1Task_Handler); // break; // case 1/*KEY0_PRES*/: //4 is KEY0_PRES KEY is touched // vTaskSuspend(BEEPTask_Handler); // break; // case 2/*KEY1_PRES*/: //4 is KEY1_PRES KEY is touched // vTaskSuspend(FLOATTask_Handler); // break; // case 3/*KEY2_PRES*/: //4 is KEY2_PRES KEY is touched // vTaskResume(BEEPTask_Handler); // vTaskResume(FLOATTask_Handler); // vTaskResume(LED0Task_Handler); // vTaskResume(LED1Task_Handler); // break; // } vTaskDelay(20); } } //TimerControl task void timercontrol_task(void *pvParameters) { u8 key; while(1) { if((AutoReloadTimer_Handle!=NULL)&&(OneShotTimer_Handle!=NULL)) { key = KEY_Scan(0); switch(key) { case WKUP_PRES: // xTimerStart(AutoReloadTimer_Handle,0); printf("Start AutoBackTIMER!\r\n"); break; case KEY0_PRES: xTimerStart(OneShotTimer_Handle,0); printf("Start OneTIMER!\r\n"); break; case KEY1_PRES: xTimerStop(AutoReloadTimer_Handle,0); xTimerStop(OneShotTimer_Handle,0); printf("Stop AutoBackTIMER and OneTIMER!\r\n"); break; case KEY2_PRES: xTimerStart(AutoReloadTimer1_Handle,0); printf("Start AutoBackTIMER1!\r\n"); break; } } vTaskDelay(10); } } //auto timer callback function void AutoReloadCallback(TimerHandle_t xTimer) { static u8 tmr1_num=0; tmr1_num++; // LCD_ShowxNum(70,111,tmr1_num,3,16,0x80); // LCD_Fill(6,131,114,313,lcd_discolor[tmr1_num%14]);// } //auto timer1 callback function void AutoReloadCallback1(TimerHandle_t xTimer) { static u8 tmr2_num=0; tmr2_num++; // LCD_ShowxNum(60,90,tmr2_num,3,16,0x80); // POINT_COLOR=tmr2_num%14; LCD_DrawRectangle(30,30,80,90);// } //one timer callback function void OneShotCallback(TimerHandle_t xTimer) { static u8 tmr2_num = 0; tmr2_num++; // LCD_ShowxNum(190,111,tmr2_num,3,16,0x80); // LCD_Fill(126,131,233,313,lcd_discolor[tmr2_num%14]); // } Point snake[MAX_SNAKE_LENGTH]; int snakeLength; Direction currentDir; Point food; //Game over void GameOver(void) { vTaskSuspendAll(); // // } //draw game void DrawGame(void) { LCD_Clear(WHITE); for (int i = 0; i < snakeLength; i++) { FillRect(snake[i].x * 8, snake[i].y * 8, 8, 8, WHITE); } // FillRect(food.x * 8, food.y * 8, 8, 8, RED); // UpdateDisplay(); // } //Generate Snake void GenerateSnakeGame(void *pvParameters) { snake[0].x = 10; snake[0].y = 5; snakeLength = 1; currentDir = DIR_RIGHT; //generate food food.x = rand() % (SCREEN_WIDTH / 8); // food.y = rand() % (SCREEN_HEIGHT / 8); while (1) { //now length for (int i = snakeLength; i > 0; i--) { snake[i] = snake[i - 1]; } //now direct switch (currentDir) { case DIR_UP: snake[0].y--; break; case DIR_DOWN: snake[0].y++; break; case DIR_LEFT: snake[0].x--; break; case DIR_RIGHT: snake[0].x++; break; } //touch wall if (snake[0].x < 0 || snake[0].x >= (SCREEN_WIDTH / 8) || snake[0].y < 0 || snake[0].y >= (SCREEN_HEIGHT / 8)) { GameOver(); break; } if (snake[0].x == food.x && snake[0].y == food.y) { snakeLength++; food.x = rand() % (SCREEN_WIDTH / 8); food.y = rand() % (SCREEN_HEIGHT / 8); } DrawGame(); vTaskDelay(pdMS_TO_TICKS(200)); // } } u8 key; void vControlTask(void *pvParameters) { while (1) { // key=KEY_Scan(0); if (key==WKUP_PRES) { currentDir = DIR_UP; } else if (key==KEY1_PRES) { currentDir = DIR_DOWN; } else if (key==KEY2_PRES) { currentDir = DIR_LEFT; } else if (key==KEY0_PRES) { currentDir = DIR_RIGHT; } vTaskDelay(pdMS_TO_TICKS(50)); } } ”请分析以上代码,根据以上代码来修改及完善功能
06-11
/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * <h2><center>© Copyright (c) 2025 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: * www.st.com/SLA0044 * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" #include "stdio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ extern TIM_HandleTypeDef htim3; //#include "stdio.h" //#include "usart.h" //int fputc(int ch,FILE *f) //{ // HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY); // return ch; //} /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ void Buzzer_Beep(uint16_t duration_ms); typedef struct { uint8_t mode; uint8_t led_index; uint8_t direction; TickType_t delay; } FlowConfig_t; FlowConfig_t flowCfg = {0, 0, 0, 500}; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ osThreadId defaultTaskHandle; osThreadId HighTaskHandle; osThreadId MidTaskHandle; osThreadId LowTaskHandle; osThreadId myTask_FlowTaskHandle; osThreadId myTask_KeyTaskHandle; osThreadId myTask_BeepTaskHandle; osMessageQId beepQueueHandle; osMutexId myMutex01Handle; osSemaphoreId myBinarySem01Handle; osSemaphoreId xSemaphoreHandleHandle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ uint8_t LowPriorityRunningFlag = 0; uint8_t MidPriorityRunningFlag = 0; uint8_t HighPriorityRunningFlag = 0; /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void const * argument); void StartHighPriority_Task(void const * argument); void StartMidPriority_Task(void const * argument); void StartLowPriority_Task(void const * argument); void FlowTask(void const * argument); void KeyTask(void const * argument); void BeepTask(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Create the mutex(es) */ /* definition and creation of myMutex01 */ osMutexDef(myMutex01); myMutex01Handle = osMutexCreate(osMutex(myMutex01)); /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* Create the semaphores(s) */ /* definition and creation of myBinarySem01 */ osSemaphoreDef(myBinarySem01); myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1); /* definition and creation of xSemaphoreHandle */ osSemaphoreDef(xSemaphoreHandle); xSemaphoreHandleHandle = osSemaphoreCreate(osSemaphore(xSemaphoreHandle), 1); /* 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 */ /* Create the queue(s) */ /* definition and creation of beepQueue */ osMessageQDef(beepQueue, 16, uint16_t); beepQueueHandle = osMessageCreate(osMessageQ(beepQueue), NULL); /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of defaultTask */ osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); /* definition and creation of HighTask */ osThreadDef(HighTask, StartHighPriority_Task, osPriorityHigh, 0, 128); HighTaskHandle = osThreadCreate(osThread(HighTask), NULL); /* definition and creation of MidTask */ osThreadDef(MidTask, StartMidPriority_Task, osPriorityNormal, 0, 128); MidTaskHandle = osThreadCreate(osThread(MidTask), NULL); /* definition and creation of LowTask */ osThreadDef(LowTask, StartLowPriority_Task, osPriorityLow, 0, 128); LowTaskHandle = osThreadCreate(osThread(LowTask), NULL); /* definition and creation of myTask_FlowTask */ osThreadDef(myTask_FlowTask, FlowTask, osPriorityIdle, 0, 128); myTask_FlowTaskHandle = osThreadCreate(osThread(myTask_FlowTask), NULL); /* definition and creation of myTask_KeyTask */ osThreadDef(myTask_KeyTask, KeyTask, osPriorityLow, 0, 128); myTask_KeyTaskHandle = osThreadCreate(osThread(myTask_KeyTask), NULL); /* definition and creation of myTask_BeepTask */ osThreadDef(myTask_BeepTask, BeepTask, osPriorityIdle, 0, 128); myTask_BeepTaskHandle = osThreadCreate(osThread(myTask_BeepTask), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ } /* 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 const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END StartDefaultTask */ } /* USER CODE BEGIN Header_StartHighPriority_Task */ /** * @brief Function implementing the HighTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartHighPriority_Task */ void StartHighPriority_Task(void const * argument) { /* USER CODE BEGIN StartHighPriority_Task */ /* Infinite loop */ for(;;) { printf("HighPriority_Task gets binarySem!\n"); if(osSemaphoreWait(myBinarySem01Handle, osWaitForever) == osOK) { printf("HighPriority_Task Ruming\n\n"); } if(osMutexWait(myMutex01Handle, osWaitForever) == osOK) { printf("HighPriority_Task got mutex!\n"); } printf("HighPriority_Task Releasing semaphore!\r\n"); osSemaphoreRelease(myBinarySem01Handle); osMutexRelease(myMutex01Handle); vTaskDelay(500); osDelay(1); } /* USER CODE END StartHighPriority_Task */ } /* USER CODE BEGIN Header_StartMidPriority_Task */ /** * @brief Function implementing the MidTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartMidPriority_Task */ void StartMidPriority_Task(void const * argument) { /* USER CODE BEGIN StartMidPriority_Task */ /* Infinite loop */ for(;;) { printf("MidPriority_Task Runing\n"); vTaskDelay(500); osDelay(1); } /* USER CODE END StartMidPriority_Task */ } /* USER CODE BEGIN Header_StartLowPriority_Task */ /** * @brief Function implementing the LowTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLowPriority_Task */ void StartLowPriority_Task(void const * argument) { /* USER CODE BEGIN StartLowPriority_Task */ static uint32_t i; /* Infinite loop */ for(;;) { printf("LowPriority_Task gets binarySem!\n"); if(osSemaphoreWait(myBinarySem01Handle, osWaitForever) == osOK) { printf("LowPriority_Task Runing\n\n"); } if(osMutexWait(myMutex01Handle, osWaitForever) == osOK) { printf("LowPriority_Task Runing\n\n"); } for(i=0;i<2000000;i++) { osThreadYield(); } printf("LowPriority_Task Releasing semaphore!\r\n"); osSemaphoreRelease(myBinarySem01Handle); osMutexRelease(myMutex01Handle); vTaskDelay(500); osDelay(1); } /* USER CODE END StartLowPriority_Task */ } /* USER CODE BEGIN Header_FlowTask */ /** * @brief Function implementing the myTask_FlowTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_FlowTask */ void FlowTask(void const * argument) { /* USER CODE BEGIN FlowTask */ const uint16_t led_pins[6] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5}; /* Infinite loop */ for(;;) { for (int i = 0; i < 6; i++) HAL_GPIO_WritePin(GPIOA, led_pins[i], GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, led_pins[flowCfg.led_index], GPIO_PIN_RESET); uint8_t dummy = 1; xQueueSend(beepQueueHandle, &dummy, 0); if (flowCfg.direction == 0) { flowCfg.led_index = (flowCfg.led_index + 1) % 6; } else { flowCfg.led_index = (flowCfg.led_index + 5) % 6; } vTaskDelay(pdMS_TO_TICKS(flowCfg.delay)); osDelay(1); } /* USER CODE END FlowTask */ } /* USER CODE BEGIN Header_KeyTask */ /** * @brief Function implementing the myTask_KeyTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_KeyTask */ void KeyTask(void const * argument) { /* USER CODE BEGIN KeyTask */ GPIO_PinState key_state, last_state = GPIO_PIN_SET; /* Infinite loop */ for(;;) { key_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15); if (key_state == GPIO_PIN_RESET && last_state == GPIO_PIN_SET) { flowCfg.mode = (flowCfg.mode + 1) % 4; switch (flowCfg.mode) { case 0: flowCfg.delay = 500; flowCfg.direction = 0; break; case 1: flowCfg.delay = 250; flowCfg.direction = 0; break; case 2: flowCfg.delay = 100; flowCfg.direction = 0; break; case 3: flowCfg.delay = 250; flowCfg.direction = 1; break; } } last_state = key_state; vTaskDelay(pdMS_TO_TICKS(50)); osDelay(1); } /* USER CODE END KeyTask */ } /* USER CODE BEGIN Header_BeepTask */ /** * @brief Function implementing the myTask_BeepTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_BeepTask */ void BeepTask(void const * argument) { /* USER CODE BEGIN BeepTask */ uint8_t beep_flag; /* Infinite loop */ for(;;) { if (xQueueReceive(beepQueueHandle, &beep_flag, portMAX_DELAY)) { HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); vTaskDelay(pdMS_TO_TICKS(300)); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3); } osDelay(1); } /* USER CODE END BeepTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ void Buzzer_Beep(uint16_t duration_ms) { HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 50); osDelay(duration_ms); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3); } /* USER CODE END Application */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 帮我画出基本任务流程图
06-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值