实验条件:Cube IDE +Protuse
任务目标: STM32F103R6T6系列的MCU引脚上接有8个LED灯和两个按键,原理图如下,编程实现当KEY1按下时LED灯从上到下流水,当KEY2按下时,LED灯从下至上流水。
一 、Protuse模型的搭建
1. 使用的仿真元器件
2. 使用总线通信,添加方式如下:
3. 使用线标连接原理图中的总线(参考“中断方式实现数码管显示(IDE+Protuse)”)
二、Cube MX的设置
1. 芯片选择“STM32F103R6T6”
2.引脚配置
按键引脚: PA4、PA6 (通用输入)
LED灯控制:PC0-PC7 (通用输出)
3.1 复位及时钟控制(参考“中断方式实现数码管显示(IDE+Protuse)”)
3.2 调试接口(参考“中断方式实现数码管显示(IDE+Protuse)”)
4.时钟配置(参考“中断方式实现数码管显示(IDE+Protuse)”)
输入频率为8MHz,最高为72MHz
5.工程配置(参考“中断方式实现数码管显示(IDE+Protuse)”)
三、Cube IDE程序编写
1. 定义变量
/* USER CODE BEGIN PV */
int8_t i=0;
uint16_t PIN[]={LED_1_Pin,LED_2_Pin,LED_3_Pin,LED_4_Pin,LED_5_Pin,LED_6_Pin,
LED_7_Pin,LED_8_Pin};
/* USER CODE END PV */
2.while()函数
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOA,KEY_1_Pin)==GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOC, LED_1_Pin|LED_2_Pin|LED_3_Pin|LED_4_Pin
|LED_5_Pin|LED_6_Pin|LED_7_Pin|LED_8_Pin, GPIO_PIN_SET);
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOA,KEY_1_Pin)==GPIO_PIN_RESET)
{
for(i=0;i<=7;i++)
{
HAL_GPIO_WritePin(GPIOC, PIN[i],GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOC, PIN[i],GPIO_PIN_SET);
HAL_Delay(100);
}
}
}
else if( HAL_GPIO_ReadPin(GPIOA,KEY_2_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(10);
if( HAL_GPIO_ReadPin(GPIOA,KEY_2_Pin)==GPIO_PIN_RESET)
{
for(i=7;i>=0;i--)
{
HAL_GPIO_WritePin(GPIOC, PIN[i],GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOC, PIN[i],GPIO_PIN_SET);
HAL_Delay(100);
}
}
}
}
/* USER CODE END 3 */
3.编译程序并生成hex文件。
4. 运行结果
按键控制流水灯