和定时器时钟关联的有总线APB1或APB2等时钟,定时器外设挂载在这个总线上使用的就是这个总线时钟,然后定时器配置时有个预分频值prescale可以设置分频,还有个时钟分割,这两个可以控制定时器计数的快慢。例如总线频率为72M,预分频值为71(自动+1,实际为72),那么现在的计数频率就是1M赫兹,也就是1微秒计一个数。假设时钟周期设置为1000,那么在1000个计数后(1ms时间)就会使溢出标志置位。
stm32软件下载程序闪存超时的原因是,没有将程序的内存扩展。因为stm32软件下载时需要大量的带宽,会消耗很多内存,所以会闪存超时
有的
void i2c1_err_isr()
{
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_AF))
{
if (check_begin)
I2C_GenerateSTART(I2C1, ENABLE);
else if (I2C1-SR2 0x01)
{
I2C_GenerateSTOP(I2C1, ENABLE);
i2c_comm_state = COMM_EXIT;
PV_flag_1 = 0;
}
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
}
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_BERR))
{
if (I2C1-SR2 0x01)
{
I2C_GenerateSTOP(I2C1, ENABLE);
i2c_comm_state = COMM_EXIT;
PV_flag_1 = 0;
}
I2C_ClearFlag(I2C1, I2C_FLAG_BERR);
}
/*以下超时错误处理代码为自行添加*/
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_TIMEOUT))
{
//主模式下设置该位,硬件发出停止条件
I2C1-SR1 |= 0x4000;
I2C_ClearFlag(I2C1, I2C_FLAG_TIMEOUT);
}
}
本文标签:stm32帧超时