OpenEdv-开源电子网

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

FreeRTOS加入液晶初始化 死在delay_ms中

[复制链接]

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-5-8
在线时间
51 小时
发表于 2017-5-21 21:49:04 | 显示全部楼层 |阅读模式
1金钱
  液晶初始化  delay_ms(50); // delay 50 ms  进入
void HardFault_Handler(void)


{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
一下是delay函数
////////////////////////////////////////////////////////////
#define   SUPPORT_OS 1

#if       SUPPORT_OS
#include "FreeRTOS.h"
#include "task.h"

#endif

//////////////////////////////////////////////////////
oid delay_init(u8 SYSCLK)
{
       
        #if SUPPORT_OS
       
                u32 reload;
                SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
                fac_us=SYSCLK;                                                       
                reload=SYSCLK;                                                       
                reload*=1000000/configTICK_RATE_HZ;               
                                                                                               
                fac_ms=1000/configTICK_RATE_HZ;                          
                SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;
                SysTick->LOAD=reload;                                        
                SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
               
        #else
                SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
                fac_us=SYSCLK/8;         
                fac_ms=(u16)fac_us*1000; //ÿ¸ömsDèòaμÄsystickê±Öóêy   
     #endif
}                                                                    



void delay_us(u32 nus)
{               
        #if SUPPORT_OS
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOADμÄÖμ                     
        ticks=nus*fac_us;                                                 //DèòaμĽúÅÄêy
        told=SysTick->VAL;                                        //¸Õ½øèëê±μļÆêyÆ÷Öμ
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //&#213;aà&#239;×¢òaò&#187;&#207;&#194;SYSTICKê&#199;ò&#187;&#184;&#246;μY&#188;&#245;μ&#196;&#188;&#198;êy&#198;÷&#190;í&#191;éò&#212;á&#203;.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //ê±&#188;&#228;3&#172;1y/μèóúòa&#209;ó3ùμ&#196;ê±&#188;&#228;,&#212;òí&#203;3&#246;.
                }  
        };       
        #else
        u32 midtime;                     
        SysTick->LOAD=nus*fac_us; //ê±&#188;&#228;&#188;ó&#212;&#216;                           
        SysTick->VAL=0x00;        //&#199;&#229;&#191;&#213;&#188;&#198;êy&#198;÷
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //&#191;aê&#188;μ1êy
        do
        {
                midtime=SysTick->CTRL;
        }
        while((midtime&0x01)&&!(midtime&(1<<16)));//μè′yê±&#188;&#228;μ&#189;′&#239;   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //1&#216;±&#213;&#188;&#198;êy&#198;÷
        SysTick->VAL =0X00;       //&#199;&#229;&#191;&#213;&#188;&#198;êy&#198;÷         
        #endif
       
}
/****************************************************************************
* &#195;&#251;    3&#198;: void delay_xms(u16 nms)
* 1|    &#196;ü£o&#209;óê±nms
* è&#235;&#191;ú2&#206;êy£oòa&#209;óê±μ&#196;oá&#195;&#238;êy
* ·μ&#187;&#216;2&#206;êy£o&#206;T
* &#203;μ    &#195;÷£oSysTick->LOAD&#206;a24&#206;&#187;&#188;&#196;′&#230;&#198;÷,&#203;ùò&#212;,×&#238;′ó&#209;óê±&#206;a: nms<=0xffffff*8*1000/SYSCLK
            &#182;&#212;168Mì&#245;&#188;t&#207;&#194;,nms<=798ms
****************************************************************************/
void delay_xms(u16 nms)
{       
        #if SUPPORT_OS
        u32 i;
        for(i=0;i<nms;i++) delay_us(1000);
        #else
        u32 midtime;                  
        SysTick->LOAD=(u32)nms*fac_ms;//ê±&#188;&#228;&#188;ó&#212;&#216;(SysTick->LOAD&#206;a24bit)
        SysTick->VAL =0x00;           //&#199;&#229;&#191;&#213;&#188;&#198;êy&#198;÷
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //&#191;aê&#188;μ1êy  
        do
        {
                midtime=SysTick->CTRL;
        }
        while((midtime&0x01)&&!(midtime&(1<<16)));//μè′yê±&#188;&#228;μ&#189;′&#239;   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //1&#216;±&#213;&#188;&#198;êy&#198;÷
        SysTick->VAL =0X00;       //&#199;&#229;&#191;&#213;&#188;&#198;êy&#198;÷                 
       
       
        #endif
       
            
}
/****************************************************************************
* &#195;&#251;    3&#198;: void delay_ms(u16 nms)
* 1|    &#196;ü£o&#209;óê±nms
* è&#235;&#191;ú2&#206;êy£oòa&#209;óê±μ&#196;oá&#195;&#238;êy
* ·μ&#187;&#216;2&#206;êy£o&#206;T
* &#203;μ    &#195;÷£onms:0~65535
****************************************************************************/
void delay_ms(u16 nms)
{         
        #if SUPPORT_OS
        if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//&#207;μí3ò&#209;&#190;-&#212;&#203;DD
        {                       
                if(nms>=fac_ms)                                                //&#209;óê±μ&#196;ê±&#188;&#228;′óóúOSμ&#196;×&#238;éùê±&#188;&#228;&#214;ü&#198;ú
                {
                           vTaskDelay(nms/fac_ms);                         //FreeRTOS&#209;óê±
                }
                nms%=fac_ms;                                                //OSò&#209;&#190;-&#206;T·¨ìá1&#169;&#213;a&#195;′D&#161;μ&#196;&#209;óê±á&#203;,2éó&#195;&#198;&#213;í¨·&#189;ê&#189;&#209;óê±   
        }
        delay_us((u32)(nms*1000));                                //&#198;&#213;í¨·&#189;ê&#189;&#209;óê±
        #else
        u8 repeat=nms/540;        //&#213;aà&#239;ó&#195;540,ê&#199;&#191;&#188;&#194;&#199;μ&#189;&#196;3D&#169;&#191;í&#187;§&#191;é&#196;ü3&#172;&#198;μê1ó&#195;,
                                                          //±èè&#231;3&#172;&#198;μμ&#189;248Mμ&#196;ê±oò,delay_xms×&#238;′ó&#214;&#187;&#196;ü&#209;óê±541ms×óóòá&#203;
        u16 remain=nms%540;
        while(repeat)
        {
                delay_xms(540);
                repeat--;
        }
        if(remain)delay_xms(remain);
        #endif
}

                         






最佳答案

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

参考下我们的freertos例程吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-5-21 21:49:05 | 显示全部楼层
参考下我们的freertos例程吧
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-5-8
在线时间
51 小时
 楼主| 发表于 2017-5-21 21:49:49 | 显示全部楼层
再次说明一下  ,LCD驱动裸机ok
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-5-8
在线时间
51 小时
 楼主| 发表于 2017-5-22 09:15:40 | 显示全部楼层
正点原子 发表于 2017-5-22 00:26
参考下我们的freertos例程吧

好的,我估计数systick定时计不合适 ,我看看!
回复

使用道具 举报

0

主题

18

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1011
金钱
1011
注册时间
2016-5-13
在线时间
107 小时
发表于 2017-5-22 16:26:12 | 显示全部楼层
正点原子 发表于 2017-5-22 00:26
参考下我们的freertos例程吧

视频中F429 FreeRTOS的PDF V1.2,怎么没有地方下载
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-5-22 21:23:24 | 显示全部楼层
suny1022 发表于 2017-5-22 16:26
视频中F429 FreeRTOS的PDF V1.2,怎么没有地方下载

论坛搜索
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-8-8
在线时间
3 小时
发表于 2019-8-8 10:40:13 | 显示全部楼层
请问是怎么解决的,我也遇到了同样的问题,一直在delay_ms中循环
回复

使用道具 举报

4

主题

44

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2019-4-23
在线时间
84 小时
发表于 2019-8-9 20:36:58 | 显示全部楼层
在RTOS里,用vTaskDelay()即可.
如果是微妙级延时,到是可以空等,ms级建议楼主还是用内核API吧.
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-5-8
在线时间
51 小时
 楼主| 发表于 2020-5-26 20:36:27 | 显示全部楼层
统一回复一下,主要原因是操作系统没有启动,调用操作系统延时会死机,在操作系统启动之前调用延时函数也是可以的,不过等到系统调度启动了就不能用以前的那种函数延时了,需要单独配置,具体的可以看原子哥的延时函数
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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