用CUBEMX配置时钟树
配置时钟树注意
我配置时钟树运行不起来,到时钟配置函数这里会报错。
1.晶振不匹配(发现是这个问题,是40M的外部晶振,而不是8M的)
2.Flash Latency 这个参数HAL库有问题,需要手配,2/4 WS都试试
3.电压不稳定
4.配480M,CPU按手册最高的配置
5.看单片机是v版本还是y版本。丝印上面有
我配置时钟树运行不起来,到时钟配置函数这里会报错。
1.晶振不匹配(发现是这个问题,是40M的外部晶振,而不是8M的)
2.Flash Latency 这个参数HAL库有问题,需要手配,2/4 WS都试试
3.电压不稳定
4.配480M,CPU按手册最高的配置
5.看单片机是v版本还是y版本。丝印上面有
配置TIM2
看数据手册的时钟树,TIM2,3是APB2提供的时钟,所以我们进行分频240-1=1MHZ,1us定时器加1. 超过1000会触发中断(1ms触发一次)
开中断
TIM时钟来源
参考数据手册,定时器TIM1,TIM8是靠APB2的,他们是高级定时器
TIM2是普通定时器,是靠APB1时钟。
高级定时器和普通定时器区别
生成代码
1.
2.开定时器2中断
3.写TIM2回调函数
4.main函数里面10s调用一次
普通定时器实现us延时
Us级别延时我们不能用中断,因为太频繁了占用不必要的CPU资源。
我们用一个普通定时器来作为 us延时定时器,这个定时器不用开中断,我们只读他的计数值就ok了。
当调用 HAL_TIM_Base_Start(&htim3) 时,定时器从初始值开始计数,但启动过程本身需要一定时间(例如配置寄存器、中断处理等)。-5 是为了提前设置一个较小的初始值,抵消这部分启动延迟。不同的硬件可能有差异,建议用一个gpio
eg:逻辑分析仪设置为电平上升沿采样
gpio拉高
延时20us
gpio拉低。用逻辑分析仪读一下之间延时时间,如果不是20us,适当的调整参数值5
/*
普通定时器实现us延时
*/
void udelay(uint32_t us)
{
#deinfe HARDWARE_EXE_TIME_US 5
volatile uint16_t differ = 0xffff-nus-HARDWARE_EXE_TIME_US;
//设置定时器3的技术初始值
__HAL_TIM_SetCounter(&htim3,differ);
//开启定时器
HAL_TIM_Base_Start(&htim3);
while( differ<0xffff-HARDWARE_EXE_TIME_US)
{
differ = __HAL_TIM_GetCounter(&htim3);
};
//关闭定时器
HAL_TIM_Base_Stop(&htim3);
}