altervisi0n

Untitled

Oct 24th, 2025
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.39 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   */
  8. /* USER CODE END Header */
  9.  
  10. /* Includes ------------------------------------------------------------------*/
  11. #include "main.h"
  12.  
  13. /* Private includes ----------------------------------------------------------*/
  14. /* USER CODE BEGIN Includes */
  15. #include <string.h>
  16. /* USER CODE END Includes */
  17.  
  18. /* Private define ------------------------------------------------------------*/
  19. /* USER CODE BEGIN PD */
  20.  
  21. /* ??????????: ??? ???? ????????? ? ???????????? ?? ?????? */
  22. /* ??????????: ??? ???? ????????? ? ???????????? ?? ?????? */
  23. #define BTN1_Pin         GPIO_PIN_1   // ?????: PA1
  24. #define BTN1_GPIO_Port   GPIOA
  25. #define BTN2_Pin         GPIO_PIN_2   // ?????: PA2
  26. #define BTN2_GPIO_Port   GPIOA
  27. #define BUZZER_Pin       GPIO_PIN_3   // ?????: PB3
  28. #define BUZZER_GPIO_Port GPIOB
  29. #define LATCH_Pin        GPIO_PIN_5   // ?????: PB4  <-- ??? ?????????? ???
  30. #define LATCH_GPIO_Port  GPIOB
  31. #define CLOCK_Pin        GPIO_PIN_8   // ?????: PA8
  32. #define CLOCK_GPIO_Port  GPIOA
  33. #define DATA_Pin         GPIO_PIN_9   // ?????: PA9
  34. #define DATA_GPIO_Port   GPIOA
  35.  
  36. /* USER CODE END PD */
  37.  
  38. /* Private variables ---------------------------------------------------------*/
  39. /* USER CODE BEGIN PV */
  40. volatile uint8_t  speedRamp  = 1;     /* 1 … 60  */
  41. volatile uint32_t fastTicks  = 0;     /* 1-ms ticks */
  42. volatile uint16_t virtSecCnt = 0;     /* 0…3599 – ??????? "???????????" ?????? */
  43.  
  44. /* ??????????: ????????????? ????????? ????? */
  45. volatile uint8_t  hh = 10, mm = 43, ss = 0; 
  46.  
  47. volatile uint32_t lastBtn1Press = 0;
  48. volatile uint32_t lastBtn2Press = 0;
  49.  
  50.  
  51. /* ??? ???????????? ?????? */
  52. volatile uint8_t  digitToShow = 0;  /* ??? ??????????????????? */
  53. /* USER CODE END PV */
  54.  
  55. /* Private function prototypes -----------------------------------------------*/
  56. void SystemClock_Config(void);
  57. static void MX_GPIO_Init(void);
  58.  
  59. /* USER CODE BEGIN PFP */
  60. static void shiftOut(uint8_t data);
  61. // static void showTime(uint8_t h, uint8_t m, uint8_t s); // ??????????: ?????? ?? ?????, ?????? ? SysTick
  62. static void beep(uint16_t ms);
  63.  
  64. /* ??????????: ????????? ??? ?????????? ?????????? (EXTI1 ? EXTI2) */
  65. void EXTI1_IRQHandler(void);
  66. void EXTI2_IRQHandler(void);
  67. /* USER CODE END PFP */
  68.  
  69. /* Private user code ---------------------------------------------------------*/
  70. /* USER CODE BEGIN 0 */
  71. /* 7-seg codes for COMMON-ANODE (0 = segment ON) */
  72. static const uint8_t seg7_CA[10] = {
  73.   ~0x3F, ~0x06, ~0x5B, ~0x4F, ~0x66,
  74.   ~0x6D, ~0x7D, ~0x07, ~0x7F, ~0x6F
  75. };
  76.  
  77. static void shiftOut_8bit_noLatch(uint8_t data)
  78. {
  79.   for(int i = 0; i < 8; i++){
  80.     HAL_GPIO_WritePin(DATA_GPIO_Port,  DATA_Pin,  (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
  81.     HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_SET);
  82.     HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_RESET);
  83.     data <<= 1;
  84.   }
  85. }
  86.  
  87.  
  88. static void latchData(void)
  89. {
  90.   HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_SET);
  91.   HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_RESET);
  92. }
  93.  
  94. /* * ??????????: ??????? showTime() ???????.
  95.  * ?????? ??????????? ?????????? ? SysTick_Handler ??? 
  96.  * ??????????? ??????????????????? ??? ??????????.
  97.  */
  98.  
  99. static void beep(uint16_t ms)
  100. {
  101.   HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
  102.   HAL_Delay(ms);
  103.   HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
  104. }
  105.  
  106. /* ??????????: BUTTON1 (PA1) -> EXTI1_IRQHandler */
  107. void EXTI1_IRQHandler(void)
  108. {
  109.   if(__HAL_GPIO_EXTI_GET_IT(BTN1_Pin) != RESET){
  110.     __HAL_GPIO_EXTI_CLEAR_IT(BTN1_Pin);
  111.     
  112.     /* ??????????: ?????????? lastBtn1Press */
  113.     uint32_t now = HAL_GetTick();
  114.     if (now - lastBtn1Press > 200)
  115.     {
  116.         lastBtn1Press = now;
  117.         if(speedRamp < 60) speedRamp++;
  118.     }
  119.   }
  120. }
  121.  
  122. /* ??????????: BUTTON2 (PA2) -> EXTI2_IRQHandler */
  123. void EXTI2_IRQHandler(void)
  124. {
  125.   if(__HAL_GPIO_EXTI_GET_IT(BTN2_Pin) != RESET){
  126.     __HAL_GPIO_EXTI_CLEAR_IT(BTN2_Pin);
  127.  
  128.     /* ??????????: ?????????? lastBtn2Press */
  129.     uint32_t now = HAL_GetTick();
  130.     if (now - lastBtn2Press > 20)
  131.     {
  132.         lastBtn2Press = now;
  133.         if(speedRamp > 1) speedRamp--;
  134.     }
  135.   }
  136. }
  137. /* USER CODE END 0 */
  138.  
  139. /**
  140.   * @brief  The application entry point.
  141.   * @retval int
  142.   */
  143. int main(void)
  144. {
  145.   /* USER CODE BEGIN 1 */
  146.  
  147.   /* USER CODE END 1 */
  148.  
  149.   /* MCU Configuration--------------------------------------------------------*/
  150.  
  151.   HAL_Init();
  152.   SystemClock_Config();
  153.   MX_GPIO_Init();
  154.  
  155.   /* USER CODE BEGIN 2 */
  156.   /* ??????????: ???????? ?????????? ?????????? EXTI1 ? EXTI2 */
  157.   HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
  158.   HAL_NVIC_EnableIRQ(EXTI1_IRQn);
  159.   HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
  160.   HAL_NVIC_EnableIRQ(EXTI2_IRQn);
  161.     
  162.   /* USER CODE END 2 */
  163.  
  164.   /* Infinite loop */
  165.   /* USER CODE BEGIN 3 */
  166.     HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
  167.   // uint32_t lastMs = 0; // ??????????: ?????? ?? ?????, fastTicks ? SysTick
  168.   while(1)
  169.   {
  170.     /* * ??????????: ?????? 1-ms ???? ? showTime() ?????????? ? SysTick_Handler.
  171.      * ??????? ???? ?????? ?????????? ?????? ??????????? ???????,
  172.      * ????? fastTicks ????????? ??????? ????????.
  173.      */
  174.  
  175.     /* ?????? "???????????" ??????? */
  176.     if(fastTicks >= (1000u / speedRamp)){
  177.       fastTicks = 0; // ?????????? ??????? ??
  178.       virtSecCnt++;
  179.       ss++;
  180.       if(ss >= 60){ ss = 0; mm++; }
  181.       if(mm >= 60){ mm = 0; hh++; }
  182.       if(hh >= 24) hh = 0;
  183.  
  184.       /* ?????? ?????? "???????????" ??? */
  185.       if(virtSecCnt >= 3600){
  186.         virtSecCnt = 0;
  187.         beep(100);
  188.       }
  189.     }
  190.     
  191.     /*
  192.      * HAL_Delay(1) ? showTime() ??????. 
  193.      * ???? ?????? ????????????? ? ???? ????? fastTicks.
  194.      * ????? ???????? HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  195.      * ??? ???????? ???????, ?.?. ??? ?????? ???? ? ???????????.
  196.      */
  197.   }
  198.   /* USER CODE END 3 */
  199. }
  200.  
  201. /**
  202.   * @brief System Clock Configuration
  203.   * @retval None
  204.   */
  205. void SystemClock_Config(void)
  206. {
  207.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  208.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  209.  
  210.   /** Initializes the RCC Oscillators according to the specified parameters
  211.   * in the RCC_OscInitTypeDef structure.
  212.   */
  213.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // ?????
  214.   RCC_OscInitStruct.HSEState = RCC_HSE_ON; // ?????
  215.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  216.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // ????? ????????? PLL ??? ????. ???????, ?? ???? ?? ?????
  217.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  218.   {
  219.     Error_Handler();
  220.   }
  221.  
  222.   /** Initializes the CPU, AHB and APB buses clocks
  223.   */
  224.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  225.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  226.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; // ?????
  227.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  228.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  229.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  230.  
  231.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  232.   {
  233.     Error_Handler();
  234.   }
  235. }
  236.  
  237. /**
  238.   * @brief GPIO Initialization Function
  239.   * @retval None
  240.   */
  241. static void MX_GPIO_Init(void)
  242. {
  243.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  244.  
  245.   __HAL_RCC_GPIOA_CLK_ENABLE();
  246.   __HAL_RCC_GPIOB_CLK_ENABLE();
  247.  
  248.   /*Outputs*/
  249.   /* ??????????: ?????????? ?????????? ????? ? ???? */
  250.   HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_RESET);
  251.   HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, GPIO_PIN_RESET);
  252.   HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); // Buzzer ???????? (???? 0 - ???)
  253.   HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_RESET);
  254.  
  255.   /* 7-seg lines (PA8, PA9) */
  256.   GPIO_InitStruct.Pin   = CLOCK_Pin | DATA_Pin;
  257.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  258.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  259.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  260.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // ??????????: ?????? ???? GPIOA
  261.  
  262.   /* Buzzer & Latch (PB3, PB5) */
  263.   GPIO_InitStruct.Pin   = LATCH_Pin;
  264.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  265.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  266.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  267.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // ??????????: ?????? ???? GPIOB
  268.     
  269.     GPIO_InitStruct.Pin   = BUZZER_Pin;
  270.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_OD;
  271.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  272.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  273.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  274.  
  275.   /* Buttons – EXTI falling edge (PA1, PA2) */
  276.   GPIO_InitStruct.Pin  = BTN1_Pin | BTN2_Pin;
  277.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  278.   GPIO_InitStruct.Pull = GPIO_NOPULL; // ???????????? ??????? ???????? (pull-up)
  279.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // ??????????: ?????? ???? GPIOA
  280. }
  281.  
  282. /* USER CODE BEGIN 4 */
  283.  
  284. void SysTick_Handler(void)
  285. {
  286.   /* USER CODE BEGIN SysTick_IRQn 0 */
  287.  
  288.   /* USER CODE END SysTick_IRQn 0 */
  289.   HAL_IncTick();
  290.   /* USER CODE BEGIN SysTick_IRQn 1 */
  291.  
  292.   fastTicks++;
  293.  
  294.   uint8_t d[4] = { hh/10, hh%10, mm/10, mm%10 };
  295.   
  296.   // --- ??? ????????? (????? ?????? ?? ???????) ---
  297.   uint8_t code = seg7_CA[ d[digitToShow] ];
  298.   
  299.   // ????? ?? ?????? ????? (?????? 1)
  300.   if(digitToShow == 1) code &= ~0x80; 
  301.  
  302.   // --- ??? ??????? (????? ??????? ?? ???????: 1, 2, 4, 8) ---
  303.   uint8_t digitSelect = (1 << digitToShow);
  304.  
  305.   // --- ??????? ???????? 1 ---
  306.   // ??????? ?????????? ???? ????????? (code)
  307.   shiftOut_8bit_noLatch( code );
  308.   // ????? ?????????? ???? ??????? (digitSelect)
  309.   shiftOut_8bit_noLatch( digitSelect );
  310.   
  311.   latchData();
  312.  
  313.   digitToShow++;
  314.   if (digitToShow > 3) digitToShow = 0;
  315.  
  316.   /* USER CODE END SysTick_IRQn 1 */
  317. }
  318.  
  319. void Error_Handler(void)
  320. {
  321.   __disable_irq();
  322.   while(1){}
  323. }
  324. /* USER CODE END 4 */ Проверь тут работу прерываний, может изза них кнопка замедления не работает
Advertisement
Add Comment
Please, Sign In to add comment