利用CubeMX和Keil基于Proteus虚拟仿真进行STM32F103R6数码管显示秒表仿真,仿真包括两个按键分别为开始和停止,cube的配置和keil代码都要显示出来
时间: 2024-09-23 13:00:41 浏览: 45
STM32F103R6芯片+Proteus仿真+Keil5实现按键中断点亮LED
要在STM32F103R6上利用CubeMX配置数码管显示并配合Keil及Proteus进行模拟器仿真,以下是步骤:
1. **配置CubeMX**:
- 打开CubeMX,选择STM32F103R6作为目标平台。
- 添加外设:添加GPIO、USART (如果数码管连接到串口) 和定时器(如TIM1)。
- 对GPIO配置为输出,用于控制数码管段选信号。
- 对USART配置为半双工模式,用于数码管数据传输。
- 进入"Pinout & IO"选项卡,配置GPIO用于驱动7-segment LED数码管的各段选线和公共端COM。
- 在"Configuration"窗口中,配置定时器为PWM模式,波特率设置为与实际硬件一致,然后配置周期(Prescaler)使得每秒能够发出足够次数的脉冲驱动数码管。
2. **编写Keil代码**:
```c
#include "stm32f10x.h"
#include "usart.h"
// 数码管配置
static const uint8_t displayDigits[] = {B0, B1, B2, B3, B4, B5, B6, B7};
void SetDigit(uint8_t digit)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = digit | (digit << 4); // 指定段选和公共端
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_WritePin(GPIOA, GPIO_InitStruct.Pin, GPIO_PIN_RESET); // 清零
}
void DisplaySecond(uint8_t second)
{
for (int i = 0; i < 8; ++i) {
if ((second / 10) % 10 == i || second % 10 == i) {
SetDigit(displayDigits[i]);
} else {
HAL_GPIO_WritePin(GPIOA, displayDigits[i] | (displayDigits[i] << 4), GPIO_PIN_RESET); // 关断
}
}
}
void Timer_ISR()
{
// 检查是否按下开始或停止键
// ...
if (startButtonPressed) {
startButtonPressed = false;
secondsElapsed = 0;
} else if (!stopButtonPressed && !secondsElapsed) {
secondsElapsed++;
DisplaySecond(secondsElapsed);
}
}
int main(void)
{
// 初始化GPIO、USART和定时器
// ...
HAL_NVIC_SetPriority(TIM1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_IRQn);
while (1)
{
// 中断服务函数调用
HAL_TIM_IRQHandler(&htim1);
}
}
```
阅读全文