#include "stm32c0xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
xTaskHandle HLO;
xTaskHandle HLR;
xTaskHandle Hmode;
xTaskHandle HBTN1;
uint16_t leds1 = GPIO_PIN_1;
uint16_t leds2 = GPIO_PIN_2;
uint16_t btn = GPIO_PIN_12;
uint16_t toggleDelay = 1000; // Початкова затримка
uint8_t btnPressCount = 0; // Лічильник натискань кнопки
// оголошення функцій завдань
void tled(void* p);
void gestion(void * p);
void sButton(void * p);
void switchMode(void * p);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// створюємо завдання
xTaskCreate(sButton, "Start Button", 128, &btn, 1, &HBTN1);
osKernelStart();
vTaskStartScheduler();
while (1)
{
// Ваш основний код
}
}
void sButton(void* p){
uint16_t broche;
broche = *((uint16_t*) p);
while(1) {
if (HAL_GPIO_ReadPin(GPIOA, broche) == GPIO_PIN_SET) { // Кнопка натиснута
btnPressCount++; // Збільшуємо лічильник натискань
if (btnPressCount == 1 ||btnPressCount > 1 ) { // Якщо натиснуто 1 раз
if (toggleDelay > 100) { // Перевіряємо, чи не досягнули мінімальної затримки
toggleDelay -= 100; // Зменшуємо затримку на 100 мс
// Виводимо відповідний коментар
printf("Швидкість мигання збільшена. Затримка: %d мс\n", toggleDelay);
}
}
else{}
xTaskCreate(tled, "tledO", 128, &leds1, 1, &HLO);
HAL_Delay(1000);
xTaskCreate(tled, "tledR", 128, &leds2, 1, &HLR);
HAL_Delay(1000);
xTaskCreate(gestion, "Mode", 128, NULL, 1, &Hmode);
}
vTaskDelay(100); // Чекаємо 100 мс перед перевіркою знову
}
}
void tled(void* p) {
uint16_t broche;
broche = *((uint16_t*) p);
while(1) {
HAL_GPIO_TogglePin(GPIOA, broche);
HAL_GPIO_TogglePin(GPIOB, broche);
HAL_Delay(toggleDelay);
}
}
void gestion(void * p) {
uint8_t cheak = 1;
while(1) {
if(cheak){
vTaskDelay(3000);
vTaskSuspend(HLO);
vTaskDelay(3000);
vTaskResume(HLO);
vTaskDelay(3000);
cheak =! cheak;
}
else{
vTaskDelay(3000);
vTaskSuspend(HLR);
vTaskDelay(3000);
vTaskResume(HLR);
vTaskDelay(3000);
cheak =! cheak;
}
HAL_Delay(5000);
}
}
void MX_GPIO_Init(void) {
/* Включення тактового сигналу для портів GPIO */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Налаштовуємо піни GPIOA */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Налаштовуємо піни GPIOB */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// Кнопка користувача
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
// Обробляємо помилку відповідно
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
// Обробляємо помилку відповідно
}
}
// Функція зменшення швидкості FreeRTOS
void vApplicationIdleHook(void) {
// Функція зменшення швидкості FreeRTOS
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6