ddllxxrr 发表于 2018-10-28 17:19

MM32F031开发板评测6:PWM呼吸灯

<div class='showpostmsg'>星期天了有时间了,想搞个呼吸灯的程序试试。可是没有想到,例程里就有。
那么我就看了一下分析了一下:
首先开发板在一上电时就调用了SYSINIT

而其中的一个#define 定义了工作在48MHZ的选项:


//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_24MHz24000000
//#define SYSCLK_FREQ_36MHz36000000
#define SYSCLK_FREQ_48MHz48000000

//#define SYSCLK_HSI_24MHz24000000
//#define SYSCLK_HSI_36MHz36000000
//#define SYSCLK_HSI_48MHz48000000




而在设为48MHz的函数里又把APB1设成了
2分频,APB2设置为1分频。
* HCLK = SYSCLK */
      RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
      /* PCLK2 = HCLK */
      RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
      
      /* PCLK1 = HCLK */
      RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
      
而例程用的是TIM3挂在了APB1上,



但是例程的注释,应是错了,以前注释的,应是240K



因为系统时钟48MHZ,那么APB1为24MHZ
定时器3初始化时周期为99,按100算,应为240KHZ

那么到底对不对,我用手机的秒表,秒杀一下。


主程序如下:
int main(void)
{
    u8 dir=1;       
    u16 led0pwmval=0;   
   
    delay_init();       
    uart_initwBaudRate(115200);
    LED_Init();
    TIM3_PWM_Init(99,0);//2»·ÖÆμ
    while(1)       //ÎTÏTÑ-»·
    {
      delay_ms(4);       
      if(dir)led0pwmval++;
      else led0pwmval--;       
      if(led0pwmval>300)dir=0;
      if(led0pwmval==0)dir=1;                                                  
      TIM_SetCompare1(TIM3,led0pwmval);       
    }       
}


可见每300个就换相,也就是600次为一周期。而程序明显看出每一次延4MS
这样就是2.4秒,那么手机秒杀的也差不多。

以下是运行的视频:
http://v.youku.com/v_show/id_XMzg5MTg3MzIxNg==.html?spm=a2h3j.8428770.3416059.1
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: MM32F031开发板评测6:PWM呼吸灯