I am using an LCD to display the frequency using the timer in the blue pill. The frequency is displayed when I give the input frequency, but when I remove the input frequency, it does not display 0. How to display the freq to 0 if the input is not given. Here is the code for the above device.
/* USER CODE BEGIN Header *//** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** *//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"#include "stdio.h"
/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */
/* 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 */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/ I2C_HandleTypeDef hi2c2;
TIM_HandleTypeDef htim2;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_I2C2_Init(void);static void MX_TIM2_Init(void);void init();void lcd_command(unsigned char);void lcd_data(unsigned char);void lcd_display(unsigned char *s);unsigned char array[]={"HELLO"};unsigned int overflow=0;char upper,lower;int c,status;char high,low;int rise=0;int down=0;uint32_t value1;uint32_t value2;uint32_t difference;int first_captured=0;int frequency=0;float refclock;
#define TIMCLOCK 72000000#define PRESCALAR 72/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/** * @brief The application entry point. * @retval int */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1) { if(first_captured==0) { rise++; value1=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); value2=value1; first_captured=1; } else { value2=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); down++; if(value2>value1) difference=value2-value1; if(value1>value2) difference=(65536-value1)+value2; refclock =TIMCLOCK/PRESCALAR; frequency=refclock/difference; __HAL_TIM_SET_COUNTER(htim,0); first_captured=0; } } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){ overflow++;}int main(void){ /* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */ SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C2_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */ /* USER CODE BEGIN WHILE */ HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); init(); while (1) { if(value2==value1) { frequency=0; } status=HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_0); lcd_command(0x80); HAL_Delay(30); lcd_display("FREQ:"); //HAL_Delay(20); lcd_command(0x86); c=((frequency/100)%10);
if(c!=0) { lcd_data (((frequency/100)%10)+48); lcd_data (((frequency/10)%10)+48); lcd_data (((frequency/1)%10)+48); } if(c==0) { lcd_data (((frequency/10)%10)+48); lcd_data (((frequency/1)%10)+48); lcd_data(0x20); } //lcd_display(frequency); lcd_command(0x8A); lcd_display("Hz"); if(frequency>99) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); } /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}
void init(){ /*HAL_Delay(500); lcd_command(0x02); HAL_Delay(100); lcd_command(0x28); HAL_Delay(50); lcd_command(0x0E); HAL_Delay(100); lcd_command(0x0F); HAL_Delay(100); lcd_command(0x06); HAL_Delay(100); lcd_command(0x80); HAL_Delay(100);*/ // 4 bit initialisation HAL_Delay(50); // wait for >40ms lcd_command (0x30); HAL_Delay(5); // wait for >4.1ms lcd_command (0x30); HAL_Delay(1); // wait for >100us lcd_command (0x30); HAL_Delay(10); lcd_command (0x20); // 4bit mode HAL_Delay(10);
// dislay initialisation lcd_command (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters) HAL_Delay(1); lcd_command (0x08); //Display on/off control --> D=0,C=0, B=0 ---> display off HAL_Delay(1); lcd_command (0x01); // clear display HAL_Delay(1); HAL_Delay(1); lcd_command (0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift) HAL_Delay(1); lcd_command (0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits) }
void lcd_command(unsigned char i){ uint8_t data[4]; lower=(i<<4)&0xF0; upper=i&0xF0; data[0]=upper|0x0C; data[1]=upper|0x08; data[2]=lower|0x0C; data[3]=lower|0x08; HAL_I2C_Master_Transmit(&hi2c2,0x4E,(uint8_t*)data ,4,100);}
void lcd_data(unsigned char i){ uint8_t data[4]; low=(i<<4)&0xF0; high=i&0xF0; data[0]=high|0x0D; data[1]=high|0x09; data[2]=low|0x0D; data[3]=low|0x09; HAL_I2C_Master_Transmit(&hi2c2,0x4E,(uint8_t*)data, 4, 100);}
void lcd_display(unsigned char *s){ while(*s) { lcd_data(*s++); } //HAL_Delay(50); }
/** * @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.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; 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_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); }}
/** * @brief I2C2 Initialization Function * @param None * @retval None */static void MX_I2C2_Init(void){
/* USER CODE BEGIN I2C2_Init 0 */
/* USER CODE END I2C2_Init 0 */
/* USER CODE BEGIN I2C2_Init 1 */
/* USER CODE END I2C2_Init 1 */ hi2c2.Instance = I2C2; hi2c2.Init.ClockSpeed = 100000; hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c2.Init.OwnAddress1 = 0; hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c2.Init.OwnAddress2 = 0; hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN I2C2_Init 2 */
/* USER CODE END I2C2_Init 2 */
}
/** * @brief TIM2 Initialization Function * @param None * @retval None */static void MX_TIM2_Init(void){
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 72-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 15; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
/** * @brief GPIO Initialization Function * @param None * @retval None */static void MX_GPIO_Init(void){
/* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/** * @brief This function is executed in case of error occurrence. * @retval None */void Error_Handler(void){ /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */}
#ifdef USE_FULL_ASSERT/** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */void assert_failed(uint8_t *file, uint32_t line){ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */}#endif /* USE_FULL_ASSERT */