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]