OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3328|回复: 9

LED跑马灯,两个程序出现了不同的效果

[复制链接]

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
发表于 2018-7-28 19:07:23 | 显示全部楼层 |阅读模式
3金钱
大家好,遇到个LED流水灯的问题,问题大概描述如下:我设置系统时钟为72M,采用滴答时钟1MS中断,在中断函数中标记了10MS。在一秒循环点亮LED的过程中,我第一次写的函数,出现了问题,LED亮了一秒左右就熄灭了,没有跑起流水灯的效果。后面写了第二个函数,自己感觉是完全一样的内容,指示简化了,但是LED灯却跑起来了。下面贴出实现函数的内容如下,
/*
LEDÅÜÂíµÆÊµÏÖ
*/
void led_implement(void)
{
    static u32 delay_number=0;
    static u32 led_state=0;
if(led_state==0)
    {
        
    if(systick_type.systick_state_bit.systick_10ms==1)
        {
            systick_type.systick_state_bit.systick_10ms=0;
        
          delay_number++;
            if(delay_number==10)
            {
            delay_number=0;
            LED0=1;
            LED1=1;
            led_state=~led_state;
      }
        }
    }
if(led_state==1)
    {
     if(systick_type.systick_state_bit.systick_10ms==1)
        {
            systick_type.systick_state_bit.systick_10ms=0;
          delay_number++;
            if(delay_number==10)
            {
            delay_number=0;
            LED0=0;
            LED1=0;
            led_state=~led_state;   
            }   
        }
    }
}

第二次写的函数,实现了,内容如下:
void led_implement(void)
        
{
    static u32 delay_number=0;
    static u32 led_state=0;
    if(0==led_state)
    {
    if(systick_type.systick_state_bit.systick_10ms==1)
        {
       systick_type.systick_state_bit.systick_10ms=0;
         delay_number++;
            if(delay_number==10)
            {
                delay_number=0;
                LED0=~LED0;
                LED1=~LED1;
            }
        }
    }
}


请帮忙分析下,万分感谢!!!


最佳答案

查看完整内容[请看2#楼]

一个流水灯,还搞的这么复杂?? led_state=~led_state; 0会变成ffffffff; 导致条件if(led_state==1)不成立, 改成if(led_state!=0) 试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 19:07:24 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 20:44 编辑

一个流水灯,还搞的这么复杂??
led_state=~led_state;    0会变成ffffffff;
导致条件if(led_state==1)不成立,
改成if(led_state!=0) 试试
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-28 20:14:25 | 显示全部楼层
周末大家都休息了,没人理呀
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 20:28:58 | 显示全部楼层
刚才有人问我,SYSTICK中断优先级的事儿,
http://www.openedv.com/forum.php ... &extra=page%3D1
我记得你也关心过类似的
我自己看了一下,默认的SYSTICK优先级不是最低而是最高,=0
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 20:29:36 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 20:38 编辑

如果你的程序没有调用过SysTick_Config();
很可能SYSTICK的中断优先级不是最低值,你可在程序中的任意地方,查看一下:
printf("SCB->SHP[11]=%02X",SCB->SHP[11]);        
或者,给它指派一个中断优先级,
SCB->SHP[11]=0xF0;    //指派为最低优先级
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 20:32:09 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 20:38 编辑

你看一下你的默认优先级,
能打印就用printf("SCB->SHP[11]=%02X",SCB->SHP[11]);     
不能打印就用一个u8 SystickIP=SCB->SHP[11];
然后仿真人工查看一下SystickIP变量的值。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-7-28 20:48:34 | 显示全部楼层
3楼正解
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-28 21:15:25 | 显示全部楼层
warship 发表于 2018-7-28 20:25
一个流水灯,还搞的这么复杂??
led_state=~led_state;    0会变成ffffffff;
导致条件if(led_state==1)不 ...

晕死,调试的时候,明显的看到led_state=ffffffff了,但是我就没想到它不是一呀,哎,看来要多补习补习了,感谢感谢
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-28 21:19:04 | 显示全部楼层
warship 发表于 2018-7-28 20:32
你看一下你的默认优先级,
能打印就用printf("SCB->SHP[11]=%02X",SCB->SHP[11]);     
不能打印就用一个 ...

不错哦,研究得这么透彻!!!赞赞赞
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-28 21:21:36 | 显示全部楼层
hougeqvjing 发表于 2018-7-28 21:15
晕死,调试的时候,明显的看到led_state=ffffffff了,但是我就没想到它不是一呀,哎,看来要多补习补习了 ...

有时候,
智者千虑,
必有一失。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 05:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表