定时器2由f(master)二分频,即为2MHZ/2=1MHZ,你都说了f(master) = 2MHZ了。一个反转指令在C语言上就是一句话,到汇编上了就是几条指令。
/*******************************************************************************
* 名称: Sysclock_Init
* 功能: 设置系统时钟频率
* 形参: 无
* 返回: 无
* 说明: 时钟选择
如果选择外部24MHz主时钟的,外部不是24M的话
把#define HSE_24M HSE_VALUE注释掉即可,
如果不需要切换到外部时钟,把#define __HSE_VALUE HSE_VALUE
注释掉即可
******************************************************************************/
void SystemClock_Init(void)
{
CLK_HSICmd(ENABLE);//启用内部高速时钟
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//配置HSI时钟分频系数为1,16MHZ供给CPU
/* CLK_HSECmd(ENABLE); //外部时钟使能
CLK_HSICmd(ENABLE);//开启内部高速时钟 16MHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//时钟分频设置系统时钟16M不分频
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); */
}
这是我的时钟配置,我Main里取了个反,还有其他任务执行……,我测I/O的频率是99.20Khz~
while(1)
{
// Led_SystemRun();//系统指示灯
GPIO_WriteReverse(LED_OUT, LED_OUT1_PIN);
//Beep_Load();//蜂鸣器负载刷新
//Relay_Load();//继电器负载刷新
UartDriver(); //调用串口驱动
IWDG_ReloadCounter();//喂狗
/************ 5min调试光敏时间,时间到关闭外部中断 *********/
if( dog_time == 0 )
{
GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);
GPIO_WriteHigh(LED_OUT, LED_OUT1_PIN);
}
}
如果不是要求时间间隔非常小的话,我建议还是尽量定时器配置的中断时间久一些。
/*******************************************************************************
* 名称: Time4_Init
* 功能: 定时器4初始化
* 形参: 无
* 返回: 无
* 说明: 定时器4用来一个1MS的时间基准
******************************************************************************/
void Time4_Init(void)
{
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);//理论定时中断时间8us*125=1MS
TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE);
TIM4_ARRPreloadConfig(ENABLE);
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
TIM4_Cmd(ENABLE);
}
我用的定时器4,配置的是1ms |