STM32数码管显示
时间: 2024-12-30 11:31:48 浏览: 8
### STM32 控制数码管显示
#### GPIO 配置
为了使STM32能够控制数码管,首先需要配置相应的GPIO引脚作为输出模式来连接到数码管的段选线和位选线上。这可以通过设置寄存器或者使用HAL库函数完成。
对于基于CubeMX初始化项目的情况,在Pinout & Configuration界面中找到对应的端口并将其功能设定为GPIO_Output模式[^1]。
```c
// 初始化GPIO用于数码管控制
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置PA0~PA7为推挽输出 */
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_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 定时器配置
为了让数码管稳定地显示出数字而不闪烁,通常会采用动态扫描的方式刷新每一位上的数值。此时就需要用到定时器中断服务程序来进行周期性的切换操作。给定的工作频率下可以计算出合适的预分频系数(PSC)及时基周期(AutoReload),从而得到所需的延时时间[^2]。
假设希望每秒更新一次,则可按如下方式设置:
```c
#define TIM_PERIOD 999 // 自动重装载值
#define TIM_PRESCALER 7199 // 预分配比例 (72MHz / (TIM_PRESCALER + 1)) * (TIM_PERIOD + 1) ≈ 1s
static void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = TIM_PRESCALER;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = TIM_PERIOD;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK){
Error_Handler();
}
HAL_TIM_Base_Start_IT(&htim2); // 启动定时器中断
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t digit_index = 0;
const uint8_t digits[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90}; // 对应于'0'- '9'
if(htim->Instance==TIM2){
HAL_GPIO_WritePin(DIGIT_PORT[digit_index], DIGIT_PIN[digit_index], RESET);
HAL_GPIO_WritePort(SEGMENT_PORT, digits[number_to_display[digit_index]]);
HAL_GPIO_WritePin(DIGIT_PORT[(digit_index+1)%NUM_DIGITS],
DIGIT_PIN[(digit_index+1)%NUM_DIGITS], SET);
digit_index=(digit_index+1)%NUM_DIGITS;
}
}
```
上述代码片段展示了如何通过定时器触发中断实现多位数码管轮流点亮的效果,并且每次只有一位被激活以减少功耗的同时保持视觉上连续稳定的显示效果。
阅读全文