首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stm32优化练习

Stm32优化练习
EN

Stack Overflow用户
提问于 2022-04-19 14:36:11
回答 1查看 85关注 0票数 1

我正在编写一个程序来打开stm 32板上的leds (Kameleon-STM32L496ZGT6型)。

我有LED 7 6 5 4 3 1 0

当我运行程序时,它从0到7,而不是反弹,然后从7到0,依此类推。

当我点击操纵杆(GPIOE,GPIO_PIN_15)时,它会改变方向。

下面的代码可以工作,但我觉得它可能更清晰和/或更优化。是否可以重写main (我宁愿不重写setSingleLED函数)。

代码语言:javascript
复制
void setSingleLED(int which)
{
    if(which > 7 || which < 0)
    {
        return;
    }
    GPIO_TypeDef * ports[8] = {GPIOC, GPIOC, GPIOC, GPIOC, GPIOE, GPIOD, GPIOE, GPIOE};
    uint16_t pins[8] = {GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_4, GPIO_PIN_3, GPIO_PIN_5, GPIO_PIN_6};
    for (int i = 0; i < 8; i++)
    {
        HAL_GPIO_WritePin(ports[i], pins[i], GPIO_PIN_RESET);
    }
    HAL_GPIO_WritePin(ports[which], pins[which], GPIO_PIN_SET);
}
int main(void)
{
    int zmienna=0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, RESET);
    int current_diode = 0;
    int dir = 1;
    while (1)
    {
        if (current_diode < 0)
        {
            zmienna=0;
            current_diode = 1;
            dir=1;
        }
        else if (current_diode > 8)
        {
            zmienna=1;
            current_diode=7;
            dir=1;
        }
        setSingleLED(current_diode);
        //HAL_Delay(100);
        unsigned int i = 0;
        int ischange=0;
        while (i < 5000)
        {
            if((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == 0)&&(ischange==0))
            {
                ischange=1;
                if(dir==1)
                {
                    dir= -1;
                }
                else
                {
                    dir= 1;
                }
            }
            i++;
        }
        if(zmienna>0)
        {
            current_diode -= dir;
        }
        else
        {
            current_diode += dir;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-23 19:28:06

下面是一些改进代码的方法:

once

  • i == which
  • portspins数组移出函数之外,以确保它们仅为选择ports状态而初始化portspins。这样就不需要检查which是否在范围之内。
  • zmiennadir合并成一个单一变量dir,因为如果由于用户交互需要改变方向,或者由于到达上或下循环到5000,则没有任何区别,这似乎是一种取消按钮的方法。这不应该需要,因为循环包含一个HAL_Delay()来控制移动的速度。如果这还不够,在If子句中添加更多的HAL_Delay()以检测按下的按钮。
  • 使用dir = -dir来更改方向(而不是if

代码,这样current_diode的更新就更接近了)。

代码语言:javascript
复制
static GPIO_TypeDef * ports[8] = {GPIOC, GPIOC, GPIOC, GPIOC, GPIOE, GPIOD, GPIOE, GPIOE};
static uint16_t pins[8] = {GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_4, GPIO_PIN_3, GPIO_PIN_5, GPIO_PIN_6};


void setSingleLED(int which)
{
    for (int i = 0; i < 8; i++)
    {
        HAL_GPIO_WritePin(ports[i], pins[i], i == which ? GPIO_PIN_SET : GPIO_PIN_RESET);
    }
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, RESET);
    int current_diode = 0;
    int dir = 1;

    while (1)
    {
        // light up selected LED
        setSingleLED(current_diode);

        // check if button has been pressed
        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == 0)
        {
            dir = -dir;  // change direction
        }

        // update selected LED position
        current_diode += dir;
        if (current_diode < 0)
        {
            current_diode = 0;
            dir = 1;
        }
        else if (current_diode > 7)
        {
            current_diode = 7;
            dir = -1;
        }

        // delay to control speed of effect
        HAL_Delay(100);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71926768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档