星期天了有时间了,想搞个呼吸灯的程序试试。可是没有想到,例程里就有。
那么我就看了一下分析了一下:
首先开发板在一上电时就调用了SYSINIT
而其中的一个#define 定义了工作在48MHZ的选项:
- //#define SYSCLK_FREQ_HSE HSE_VALUE
- //#define SYSCLK_FREQ_24MHz 24000000
- //#define SYSCLK_FREQ_36MHz 36000000
- #define SYSCLK_FREQ_48MHz 48000000
- //#define SYSCLK_HSI_24MHz 24000000
- //#define SYSCLK_HSI_36MHz 36000000
- //#define SYSCLK_HSI_48MHz 48000000
复制代码
而在设为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_XMz ... j.8428770.3416059.1