OpenEdv-开源电子网

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

USMART调试,放在while()里面的函数看不出效果,拿出来就行

[复制链接]

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
发表于 2015-4-9 21:43:46 | 显示全部楼层 |阅读模式
5金钱

u16 led0pwmval=0;
u8 dir=1;
u16 maxled0pwmval;
 
void CHENGE_LED(void);
 
void CHENGE_LED_init(u16 maxpwmval);
 
 int main(void)
 {  
 
  

 delay_init();       //延时函数初始化  
 NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

 usmart_dev.init(SystemCoreClock/1000000); //初始化USMART 
 
 uart_init(9600);//
                               //配置USART1中断优先级
                               //串口初始化为9600
                     
  LED_Init();        //LED对应的I/O端口初始化

 TIM3_PWM_Init(899,0);  //APB1预分频系数为不为1。则频率*2。PWM频率=72000000/900=80Khz
 
 TIM4_Int_Init(4999,7199);//使能TIM3时钟//TIME2用来USMART的扫描函数,TIME3用来PWM了,所以本工程中所有TIME3->TIME4
        //TIM3初始化,计数到5000为500ms ,10Khz的计数频率,
        //TIM3中断使能,TIM3中断优先级设置,使能TIM3,
                         
   看这里!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
    CHENGE_LED_init(50);//此函数的必要性,原来只需要CHENGE_LED(u16 maxled0pwmval);在WHILE()主循环里面,效果仅限于一个周期 
         //这里添加CHENGE_LED_init(50)然后把CHENGE_LED()放在主循环外面,调试时候调试CHENGE_LED_init()就OK了

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    while(1)
 {
   
  delay_ms(10); 
//  if(dir)led0pwmval++;
//  else led0pwmval--;
//
//   if(led0pwmval>100)dir=0;
//  if(led0pwmval==0)dir=1;          
//  TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比 

         CHENGE_LED();   
 } 
     
 

 


void CHENGE_LED()
{

         
       
   if(dir)led0pwmval++;
   else led0pwmval--;
  
   if(led0pwmval>maxled0pwmval)dir=0;
   if(led0pwmval==0)dir=1;          
   TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比   


}



void CHENGE_LED_init(u16 maxpwmval)
{

maxled0pwmval=maxpwmval;
}

CHENGE_LEDCHENGE_LEDCHENGE_LEDCHENGE_LED

最佳答案

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

就是说,好像在while()主循环里面的函数,用USMART调试,只有一个周期的效果,看不出来。想办法放在外面就好了。求教怎么回事呢?。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-9 21:43:47 | 显示全部楼层
就是说,好像在while()主循环里面的函数,用USMART调试,只有一个周期的效果,看不出来。想办法放在外面就好了。求教怎么回事呢?。。。
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-9 21:48:06 | 显示全部楼层
u16 led0pwmval=0;
u8 dir=1;
u16 maxled0pwmval;
 
void CHENGE_LED(void);

void CHENGE_LED_init(u16 maxpwmval); 
 
 int main(void)
 {
 
   

delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

usmart_dev.init(SystemCoreClock/1000000); //初始化USMART

uart_init(9600);//此函数在本例中多余的  //使能USART1的时钟,
                         //配置USART1中断优先级
                         //串口初始化为9600
                     
  LED_Init();      //LED对应的I/O端口初始化

TIM3_PWM_Init(899,0);  //APB1预分频系数为不为1。则频率*2。PWM频率=72000000/900=80Khz

TIM4_Int_Init(4999,7199);//使能TIM3时钟//TIME2用来USMART的扫描函数,TIME3用来PWM了,所以本工程中所有TIME3->TIME4
 //TIM3初始化,计数到5000为500ms ,10Khz的计数频率,
 //TIM3中断使能,TIM3中断优先级设置,使能TIM3, 
                         
   
   
    CHENGE_LED_init(50);//此函数的必要性,原来直接改CHENGE_LED(u16 maxled0pwmval);发现在WHILE()主循环里面,效果仅限于一个周期
    //这里添加CHENGE_LED_init(50)放在主循环外面就OK了
    while(1)
{
   
delay_ms(10);  
// if(dir)led0pwmval++;
// else led0pwmval--;
//
//  if(led0pwmval>100)dir=0;
// if(led0pwmval==0)dir=1;  
// TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比

         CHENGE_LED();    
}  
      
 
}  
 


void CHENGE_LED()
{

          
     
if(dir)led0pwmval++;
else led0pwmval--;

if(led0pwmval>maxled0pwmval)dir=0;
if(led0pwmval==0)dir=1;  
TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比   


}




void CHENGE_LED_init(u16 maxpwmval)
{

maxled0pwmval=maxpwmval;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-9 22:43:39 | 显示全部楼层
仿真看一下就知道问题在哪里了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-9 23:54:54 | 显示全部楼层
哦,好的,原子哥真不错,估计被我这样的新手快搞晕了
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-10 15:06:58 | 显示全部楼层
原子哥,,今天我仿真,发现
一、CHENGE_LED(100)放在while()循环里面使用的时候,每次进入CHENGE_LED(u16 maxpwmval) ,变量 maxpwmval就会变为0x64。但一跳出该函数,变量maxpwmval显示为   out of scop。再次进入函数又变回0x64。如此循环。

二、使用 CHENGE_LED_init(u16 maxpwmval) 配合CHENGE_LED()使用,CHENGE_LED_init(u16 maxpwmval)放在主循环外面。而CHENGE_LED()放在主循环里面,变量maxpwmval的值一直锁定在0x64。


这是不是就是第一种方法USMART调试没效果的原因


下面是两种方法的MAIN()函数
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-10 15:08:34 | 显示全部楼层
int main(void)
 {
  u32 temp=0; 



delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
 
  usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
 
  TIM3_PWM_Init(899,0);  //TIME3的PWM输出设置,不分频。PWM频率=72000/(899+1)=80Khz
  TIM5_Cap_Init(0XFFFF,72-1); //TIME5通道1的输入捕获设置,以1Mhz的频率计数 
    while(1)
{
 




LED1=!LED1;
       
    CHENGE_LED(100);     




}
}
 }


void CHENGE_LED(u16 maxled0pwmval)
{

          
     
if(dir)led0pwmval++;
else led0pwmval--;

if(led0pwmval>maxled0pwmval)dir=0;
if(led0pwmval==0)dir=1;  
TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比   


}
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-4-10 15:09:42 | 显示全部楼层
int main(void)
 {
 
   

delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

usmart_dev.init(SystemCoreClock/1000000); //初始化USMART

uart_init(9600);//此函数在本例中多余的  //使能USART1的时钟,
                         //配置USART1中断优先级
                         //串口初始化为9600
                     
  LED_Init();      //LED对应的I/O端口初始化

TIM3_PWM_Init(899,0);  //APB1预分频系数为不为1。则频率*2。PWM频率=72000000/900=80Khz

                         
   
   
    CHENGE_LED_init(50);//此函数的必要性,原来直接改CHENGE_LED(u16 maxled0pwmval);发现在WHILE()主循环里面,效果仅限于一个周期
    //这里添加CHENGE_LED_init(50)放在主循环外面就OK了
    while(1)
{
   
delay_ms(10);  
// if(dir)led0pwmval++;
// else led0pwmval--;
//
//  if(led0pwmval>100)dir=0;
// if(led0pwmval==0)dir=1;  
// TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比

         CHENGE_LED();    
}  
      
 
}  
 


void CHENGE_LED()
{

          
     
if(dir)led0pwmval++;
else led0pwmval--;

if(led0pwmval>maxled0pwmval)dir=0;
if(led0pwmval==0)dir=1;  
TIM_SetCompare2(TIM3,led0pwmval);//修改TIME3_CCR2设置占空比   


}




void CHENGE_LED_init(u16 maxpwmval)
{

maxled0pwmval=maxpwmval;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-10 19:54:55 | 显示全部楼层
回复【6楼】lwhqbd:
---------------------------------
1,这个是正常的,局部变量,必须进入该函数才会显示出来,退出就会释放。
2,CHENGE_LED(100);   这就是固定传递100进去,自然就是0X64了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-3-4
在线时间
14 小时
 楼主| 发表于 2015-6-3 21:49:18 | 显示全部楼层
谢谢啦,在这里学习进步很快。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 21:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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