Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- /* Private includes ----------------------------------------------------------*/
- /* USER CODE BEGIN Includes */
- #include <string.h>
- /* USER CODE END Includes */
- /* Private define ------------------------------------------------------------*/
- /* USER CODE BEGIN PD */
- /* ??????????: ??? ???? ????????? ? ???????????? ?? ?????? */
- /* ??????????: ??? ???? ????????? ? ???????????? ?? ?????? */
- #define BTN1_Pin GPIO_PIN_1 // ?????: PA1
- #define BTN1_GPIO_Port GPIOA
- #define BTN2_Pin GPIO_PIN_2 // ?????: PA2
- #define BTN2_GPIO_Port GPIOA
- #define BUZZER_Pin GPIO_PIN_3 // ?????: PB3
- #define BUZZER_GPIO_Port GPIOB
- #define LATCH_Pin GPIO_PIN_5 // ?????: PB4 <-- ??? ?????????? ???
- #define LATCH_GPIO_Port GPIOB
- #define CLOCK_Pin GPIO_PIN_8 // ?????: PA8
- #define CLOCK_GPIO_Port GPIOA
- #define DATA_Pin GPIO_PIN_9 // ?????: PA9
- #define DATA_GPIO_Port GPIOA
- /* USER CODE END PD */
- /* Private variables ---------------------------------------------------------*/
- /* USER CODE BEGIN PV */
- volatile uint8_t speedRamp = 1; /* 1 … 60 */
- volatile uint32_t fastTicks = 0; /* 1-ms ticks */
- volatile uint16_t virtSecCnt = 0; /* 0…3599 – ??????? "???????????" ?????? */
- /* ??????????: ????????????? ????????? ????? */
- volatile uint8_t hh = 10, mm = 43, ss = 0;
- volatile uint32_t lastBtn1Press = 0;
- volatile uint32_t lastBtn2Press = 0;
- /* ??? ???????????? ?????? */
- volatile uint8_t digitToShow = 0; /* ??? ??????????????????? */
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- static void MX_GPIO_Init(void);
- /* USER CODE BEGIN PFP */
- static void shiftOut(uint8_t data);
- // static void showTime(uint8_t h, uint8_t m, uint8_t s); // ??????????: ?????? ?? ?????, ?????? ? SysTick
- static void beep(uint16_t ms);
- /* ??????????: ????????? ??? ?????????? ?????????? (EXTI1 ? EXTI2) */
- void EXTI1_IRQHandler(void);
- void EXTI2_IRQHandler(void);
- /* USER CODE END PFP */
- /* Private user code ---------------------------------------------------------*/
- /* USER CODE BEGIN 0 */
- /* 7-seg codes for COMMON-ANODE (0 = segment ON) */
- static const uint8_t seg7_CA[10] = {
- ~0x3F, ~0x06, ~0x5B, ~0x4F, ~0x66,
- ~0x6D, ~0x7D, ~0x07, ~0x7F, ~0x6F
- };
- static void shiftOut_8bit_noLatch(uint8_t data)
- {
- for(int i = 0; i < 8; i++){
- HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
- HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_SET);
- HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_RESET);
- data <<= 1;
- }
- }
- static void latchData(void)
- {
- HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_SET);
- HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_RESET);
- }
- /* * ??????????: ??????? showTime() ???????.
- * ?????? ??????????? ?????????? ? SysTick_Handler ???
- * ??????????? ??????????????????? ??? ??????????.
- */
- static void beep(uint16_t ms)
- {
- HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
- HAL_Delay(ms);
- HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
- }
- /* ??????????: BUTTON1 (PA1) -> EXTI1_IRQHandler */
- void EXTI1_IRQHandler(void)
- {
- if(__HAL_GPIO_EXTI_GET_IT(BTN1_Pin) != RESET){
- __HAL_GPIO_EXTI_CLEAR_IT(BTN1_Pin);
- /* ??????????: ?????????? lastBtn1Press */
- uint32_t now = HAL_GetTick();
- if (now - lastBtn1Press > 200)
- {
- lastBtn1Press = now;
- if(speedRamp < 60) speedRamp++;
- }
- }
- }
- /* ??????????: BUTTON2 (PA2) -> EXTI2_IRQHandler */
- void EXTI2_IRQHandler(void)
- {
- if(__HAL_GPIO_EXTI_GET_IT(BTN2_Pin) != RESET){
- __HAL_GPIO_EXTI_CLEAR_IT(BTN2_Pin);
- /* ??????????: ?????????? lastBtn2Press */
- uint32_t now = HAL_GetTick();
- if (now - lastBtn2Press > 20)
- {
- lastBtn2Press = now;
- if(speedRamp > 1) speedRamp--;
- }
- }
- }
- /* USER CODE END 0 */
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- /* USER CODE BEGIN 2 */
- /* ??????????: ???????? ?????????? ?????????? EXTI1 ? EXTI2 */
- HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(EXTI1_IRQn);
- HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(EXTI2_IRQn);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN 3 */
- HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
- // uint32_t lastMs = 0; // ??????????: ?????? ?? ?????, fastTicks ? SysTick
- while(1)
- {
- /* * ??????????: ?????? 1-ms ???? ? showTime() ?????????? ? SysTick_Handler.
- * ??????? ???? ?????? ?????????? ?????? ??????????? ???????,
- * ????? fastTicks ????????? ??????? ????????.
- */
- /* ?????? "???????????" ??????? */
- if(fastTicks >= (1000u / speedRamp)){
- fastTicks = 0; // ?????????? ??????? ??
- virtSecCnt++;
- ss++;
- if(ss >= 60){ ss = 0; mm++; }
- if(mm >= 60){ mm = 0; hh++; }
- if(hh >= 24) hh = 0;
- /* ?????? ?????? "???????????" ??? */
- if(virtSecCnt >= 3600){
- virtSecCnt = 0;
- beep(100);
- }
- }
- /*
- * HAL_Delay(1) ? showTime() ??????.
- * ???? ?????? ????????????? ? ???? ????? fastTicks.
- * ????? ???????? HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
- * ??? ???????? ???????, ?.?. ??? ?????? ???? ? ???????????.
- */
- }
- /* USER CODE END 3 */
- }
- /**
- * @brief System Clock Configuration
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // ?????
- RCC_OscInitStruct.HSEState = RCC_HSE_ON; // ?????
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // ????? ????????? PLL ??? ????. ???????, ?? ???? ?? ?????
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB buses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; // ?????
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /**
- * @brief GPIO Initialization Function
- * @retval None
- */
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- /*Outputs*/
- /* ??????????: ?????????? ?????????? ????? ? ???? */
- HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, GPIO_PIN_RESET);
- HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, GPIO_PIN_RESET);
- HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); // Buzzer ???????? (???? 0 - ???)
- HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, GPIO_PIN_RESET);
- /* 7-seg lines (PA8, PA9) */
- GPIO_InitStruct.Pin = CLOCK_Pin | DATA_Pin;
- 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); // ??????????: ?????? ???? GPIOA
- /* Buzzer & Latch (PB3, PB5) */
- GPIO_InitStruct.Pin = LATCH_Pin;
- 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); // ??????????: ?????? ???? GPIOB
- GPIO_InitStruct.Pin = BUZZER_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- /* Buttons – EXTI falling edge (PA1, PA2) */
- GPIO_InitStruct.Pin = BTN1_Pin | BTN2_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
- GPIO_InitStruct.Pull = GPIO_NOPULL; // ???????????? ??????? ???????? (pull-up)
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // ??????????: ?????? ???? GPIOA
- }
- /* USER CODE BEGIN 4 */
- void SysTick_Handler(void)
- {
- /* USER CODE BEGIN SysTick_IRQn 0 */
- /* USER CODE END SysTick_IRQn 0 */
- HAL_IncTick();
- /* USER CODE BEGIN SysTick_IRQn 1 */
- fastTicks++;
- uint8_t d[4] = { hh/10, hh%10, mm/10, mm%10 };
- // --- ??? ????????? (????? ?????? ?? ???????) ---
- uint8_t code = seg7_CA[ d[digitToShow] ];
- // ????? ?? ?????? ????? (?????? 1)
- if(digitToShow == 1) code &= ~0x80;
- // --- ??? ??????? (????? ??????? ?? ???????: 1, 2, 4, 8) ---
- uint8_t digitSelect = (1 << digitToShow);
- // --- ??????? ???????? 1 ---
- // ??????? ?????????? ???? ????????? (code)
- shiftOut_8bit_noLatch( code );
- // ????? ?????????? ???? ??????? (digitSelect)
- shiftOut_8bit_noLatch( digitSelect );
- latchData();
- digitToShow++;
- if (digitToShow > 3) digitToShow = 0;
- /* USER CODE END SysTick_IRQn 1 */
- }
- void Error_Handler(void)
- {
- __disable_irq();
- while(1){}
- }
- /* USER CODE END 4 */ Проверь тут работу прерываний, может изза них кнопка замедления не работает
Advertisement
Add Comment
Please, Sign In to add comment