STM32F103VBT6
内部时钟源RCC
如果使用RTOS
使用了RTOS,默认使用SysTick;所以HAL库的时基就要用其他的定时器。 当用了RTOS,就要设置HAL的timebase为其他Timer,因为Systick会被操作系统设置为最低优先级中断,以及HAL使用了weak定义timebase的ISR中断函数,大家用同一个,会被RTOS的版本重载。 HAL时基不要选的和 RTOS的一样,RTOS默认是使用SysTick的中断来调度任务的,但是 HAL库也需要一个周期性的中断,它就建议你这两个周期性的中断不要用一个定时器。 另外HAL库本身一些函数的操作是需要始终节拍的,所以把这两个时钟节拍独立开来。 |
外部时钟源
其中BYPASS Clock Source表示旁路时钟源,也就是外部时钟,只需要外部提供时钟接入OSC_IN引脚,OSC_OUT引脚悬空,对应选择为BYPASS Clock Source;
Crystal/Ceramic Resonator表示晶体/陶瓷晶振,谐振器即相当于石英/陶瓷 晶振,OSC_IN 与 OSC_OUT引脚都要连接,对应选择为Crystal/Ceramic Resonator。
设置定时器
设置为内部时钟源
-
通用16bit定时器:2、3、4
-
高级16bit定时器:1
-
2个看门狗
-
1个sysTick定时器
1选择TIM4
2定时器时钟选择内部时钟
Clock Source(时钟来源)
计数器设置:
- Prtscaler (定时器预分频系数) : 0 [0~65535]
- Counter Mode(计数模式) : Up(向上计数模式)
- Counter Period(自动重装载值) : 65535 [0~65535]
- CKD(时钟分频因子) : No Division 不分频 (可以选择二分频和四分频 )
- auto-reload-preload(自动重装载) : Enable 使能
定时器的定时周期
T = (psc+1)(arr+1)/Tclk
- psc 为定时器预分频系数 [0~65535]
- arr为自动重装载值 [0~65535]
- Tclk为系统时钟频率 64MHZ = 64us
常用配置数值,通过计算
T=(3699+1)(9999+1)/64us=1000 000us=1000ms=1s
T=(3699+1)(999+1)/64us=100 000us=100ms=0.1s
T=(639+1)(999+1)/64us=10 000us=10ms=0.01s
T=(63+1)(999+1)/64us=1 000us=1ms
由这个图可见,这里配置的是定时器产生中断的频率,然后再跟据频率与时间的关系推出定时的时间。
所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 72 /1000 = 1000Hz;
定时时间T = 1 / f 则: 1s / 1000Hz = 1000 000us / 1000Hz = 1000us =1ms。
最后使用定时器中断跟关闭定时器中断以及回调函数即可, 使用中断的时候注意要先开启中断
HAL_TIM_Base_Start_IT(&htim1); //使用定时器的时候调用这个函数启动
HAL_TIM_Base_Stop_IT(&htim1); //停止定时器的时候调用这个函数关闭
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
//编写回调逻辑,即定时器1定时1MS后的逻辑
}
}
FREERTOS配置
内存分配/总分配大小/内存管理方式
串口配置
这里选择异步通信,并指定波特率。
GPIO配置
PULLUP&PULLDOWN针对输入模式,比如我们一个单片机的I / O脚接一个按键的左端,按键的右端接正电源,那么我们就要设置I / O脚为下拉模式,因为这样才能使得按键按下去的时候,能把I / O脚拉高,不然设置上拉模式的话,即按键的功能等于摆设。同理,如果按键另一端接地,我们就要设置为上拉模式了。