BASIC4MCU | 질문게시판 | smt32405 타이머질문
페이지 정보
작성자 stm32 작성일2024-04-08 19:45 조회2,413회 댓글4건본문
#include "main.h"
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim9; // Timer 9 handle
unsigned char Font[18] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x67, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x08, 0x80};
int t_cnt = 0;
int m_cnt = 0;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM9_Init(void);
/* Private user code ---------------------------------------------------------*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim9)
{
t_cnt++; // Increment the time counter
// Check if about 5 seconds have passed (500 * 10 ms)
if (t_cnt >= 25)
{
t_cnt = 0; // Reset the time counter
m_cnt += 5; // Increase the number by 5
if (m_cnt > 9999) // Reset to 0 after reaching 9999
{
m_cnt = 0;
}
}
}
}
void dec_segment(unsigned int M)
{
unsigned char M1000, M100, M10, M1;
M1000 = M / 1000;
M100 = (M % 1000) / 100;
M10 = (M % 100) / 10;
M1 = M % 10;
HAL_GPIO_WritePin(GPIOC, 0xFFFF, RESET);
HAL_GPIO_WritePin(GPIOC, Font[M1000] | 0x0e00, SET); // Display thousands digit
HAL_GPIO_WritePin(GPIOC, 0xFFFF, RESET);
HAL_GPIO_WritePin(GPIOC, Font[M100] | 0x0d00, SET); // Display hundreds digit
HAL_GPIO_WritePin(GPIOC, 0xFFFF, RESET);
HAL_GPIO_WritePin(GPIOC, Font[M10] | 0x0b00, SET); // Display tens digit
HAL_GPIO_WritePin(GPIOC, 0xFFFF, RESET);
HAL_GPIO_WritePin(GPIOC, Font[M1] | 0x0700, SET); // Display units digit
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM9_Init();
HAL_TIM_Base_Start_IT(&htim9); // Start timer 9 interrupts
while (1)
{
dec_segment(m_cnt); // Update the display
}
}
/* System Clock Configuration */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 168;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
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_5) != HAL_OK)
{
Error_Handler();
}
}
/* TIM9 init function */
void MX_TIM9_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim9.Instance = TIM9;
htim9.Init.Prescaler = 1680 - 1; // 10 ms period with 168 MHz clock
htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
htim9.Init.Period = 10000 - 1; // 10 ms period with 10 kHz clock
htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim9) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim9, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
/* GPIO init function */
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 |
GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
타이머9를 10ms 주기 인터럽트가 발생하도록 하고, 약 5초가 되면 7-세그먼트에서 숫자가 5씩 증가하는 코드입니다
위에 if (t_cnt >= 25)값을 25로 해야만 5초씩 증가합니다
이게 계산법이 5x100 해서 500에서 5로나누어 100을 4초 나누라던데 마지막에 왜 4로 나누는건가요?
항상 질문에 답해주셔서 감사합니다
댓글 4
조회수 2,413master님의 댓글
master 작성일
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==&htim9){
if(++t_cnt>= 25){ t_cnt=0; // 250ms 마다
m_cnt+=5; if(m_cnt>9999)m_cnt=0; // 5씩 증가
}
}
}
인터럽트 주기가 10ms 아닌가요?
25 카운트하면 250ms입니다.
//
5x100 해서 500에서 5로나누어 100을 4초 나누라던데 마지막에 왜 4로 나누는건가요?
이 말은 어느 코드를 의미하는지 모르겠습니다.
stm32님의 댓글
stm32 작성일
10ms가 맞는데 25으로 해야 5초씩 카운트 되서 물어봤습니다..
5x100 해서 500에서 5로나누어 100을 4초 나누라던데 마지막에 왜 4로 나누는건가요? -> 이거은cnt값을 gpt한테 물어보니 이렇게 구하는거라고 해서 물어봤습니다
master님의 댓글
master 작성일
m_cnt+=5;
m_cnt가 1초단위의 카운터가 아닌 것 같은데요
5씩 증가와 5초씩 증가는 의미가 다릅니다.
//
250ms에 5씩 증가는 50ms마다 1씩 증가하는 것과 같죠
왜 이렇게 만들었나요?
master님의 댓글
master 작성일
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==&htim9){ // 10ms 마다
m_cnt+=10; if(m_cnt>9999)m_cnt=0; // 10씩 증가
}
}
}
10ms마다 10씩 증가하면서 0~9.99초 범위로 카운트 되겠습니다.
//
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==&htim9){ // 10ms 마다
if(++m_cnt>9999)m_cnt=0; // 1씩 증가
}
}
}
10ms마다 1씩 증가하면서 0~99.99초 범위로 카운트
스톱워치라면 이렇게 만들면 되겠죠