用stm32cube写stm32f103zet6带8个灯的流水灯,使用外部中断4个按钮分别控制开始,暂停,加速,减速,具体代码
时间: 2024-02-15 22:03:30 浏览: 102
好的,我来帮你写一个基于STM32Cube的流水灯程序。
首先,我们需要在CubeMX中配置我们的硬件资源。
1. 设置GPIO口
我们需要使用8个GPIO口来控制8个灯的亮灭。在Pinout选项卡中,选择我们需要使用的GPIO口,例如PA0~PA7,并将它们的模式设置为输出。如果您不熟悉如何设置GPIO口,请参考STM32CubeMX的官方文档。
2. 设置外部中断
我们需要4个外部中断来控制开始,暂停,加速和减速功能。选择我们需要使用的GPIO口,例如PB0~PB3,并将它们的模式设置为外部中断。在NVIC选项卡中,使能外部中断对应的中断线,例如EXTI0、EXTI1、EXTI2和EXTI3。
然后,我们需要在Keil中编写程序。
1. 定义GPIO口
```c
#define LED_PORT GPIOA
#define LED_PIN_1 GPIO_PIN_0
#define LED_PIN_2 GPIO_PIN_1
#define LED_PIN_3 GPIO_PIN_2
#define LED_PIN_4 GPIO_PIN_3
#define LED_PIN_5 GPIO_PIN_4
#define LED_PIN_6 GPIO_PIN_5
#define LED_PIN_7 GPIO_PIN_6
#define LED_PIN_8 GPIO_PIN_7
```
2. 定义外部中断
```c
#define BUTTON_PORT GPIOB
#define BUTTON_PIN_1 GPIO_PIN_0
#define BUTTON_PIN_2 GPIO_PIN_1
#define BUTTON_PIN_3 GPIO_PIN_2
#define BUTTON_PIN_4 GPIO_PIN_3
```
3. 初始化GPIO口和外部中断
```c
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure GPIO pins */
GPIO_InitStruct.Pin = LED_PIN_1 | LED_PIN_2 | LED_PIN_3 | LED_PIN_4 | LED_PIN_5 | LED_PIN_6 | LED_PIN_7 | LED_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure GPIO pins */
GPIO_InitStruct.Pin = BUTTON_PIN_1 | BUTTON_PIN_2 | BUTTON_PIN_3 | BUTTON_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
/* Enable and set EXTI lines */
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}
```
4. 实现外部中断的中断服务程序
```c
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(BUTTON_PIN_1);
}
void EXTI1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(BUTTON_PIN_2);
}
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(BUTTON_PIN_3);
}
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(BUTTON_PIN_4);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == BUTTON_PIN_1) {
// 开始
} else if (GPIO_Pin == BUTTON_PIN_2) {
// 暂停
} else if (GPIO_Pin == BUTTON_PIN_3) {
// 加速
} else if (GPIO_Pin == BUTTON_PIN_4) {
// 减速
}
}
```
5. 实现流水灯程序
```c
void LED_On(uint16_t LED_Pin)
{
HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_SET);
}
void LED_Off(uint16_t LED_Pin)
{
HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_RESET);
}
void LED_Toggle(uint16_t LED_Pin)
{
HAL_GPIO_TogglePin(LED_PORT, LED_Pin);
}
void LED_Scan(uint8_t speed)
{
LED_On(LED_PIN_1);
HAL_Delay(speed);
LED_Off(LED_PIN_1);
LED_On(LED_PIN_2);
HAL_Delay(speed);
LED_Off(LED_PIN_2);
LED_On(LED_PIN_3);
HAL_Delay(speed);
LED_Off(LED_PIN_3);
LED_On(LED_PIN_4);
HAL_Delay(speed);
LED_Off(LED_PIN_4);
LED_On(LED_PIN_5);
HAL_Delay(speed);
LED_Off(LED_PIN_5);
LED_On(LED_PIN_6);
HAL_Delay(speed);
LED_Off(LED_PIN_6);
LED_On(LED_PIN_7);
HAL_Delay(speed);
LED_Off(LED_PIN_7);
LED_On(LED_PIN_8);
HAL_Delay(speed);
LED_Off(LED_PIN_8);
}
void LED_Loop(uint8_t speed)
{
while (1) {
LED_Scan(speed);
}
}
```
6. 在主函数中调用初始化函数和流水灯程序
```c
int main(void)
{
HAL_Init();
GPIO_Init();
LED_Loop(100);
while (1);
}
```
这样就完成了一个基于STM32Cube的流水灯程序,并且支持外部中断控制开始、暂停、加速和减速功能。
阅读全文