STM32底层LL库TIMPWM输入测量LL篇11
配置TIM
- 和HAL库配置一样
- 在高级设置里为TIM8选择
LL
库
- 生成代码
代码移植
修改定时器中断
1
2
3
| extern __IO uint8_t IC_State;
extern __IO float DutyCycle;
extern __IO float Frequency;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| /**
* @brief This function handles TIM8 capture compare interrupt.
*/
void TIM8_CC_IRQHandler(void)
{
/* USER CODE BEGIN TIM8_CC_IRQn 0 */
if(LL_TIM_IsActiveFlag_CC1(TIM8))
{
LL_TIM_ClearFlag_CC1(TIM8);
/* 获取输入捕获值 */
uint16_t IC1Value = LL_TIM_IC_GetCaptureCH1(TIM8);
uint16_t IC2Value = LL_TIM_IC_GetCaptureCH2(TIM8);
// 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1
if (IC1Value != 0)
{
/* 占空比计算 */
DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
/* 频率计算 */
Frequency = (72000000/(71+1))/(float)(IC1Value+1);
IC_State=1;
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
/* USER CODE END TIM8_CC_IRQn 0 */
/* USER CODE BEGIN TIM8_CC_IRQn 1 */
/* USER CODE END TIM8_CC_IRQn 1 */
}
|
开始捕获
1
2
3
| __IO uint8_t IC_State;
__IO float DutyCycle;
__IO float Frequency;
|
1
2
3
| LL_TIM_EnableCounter(TIM8);//使能定时器
LL_TIM_CC_EnableChannel(TIM8,LL_TIM_CHANNEL_CH1|LL_TIM_CHANNEL_CH2);//使能通道1和通道2
LL_TIM_EnableIT_CC1(TIM8);//使能捕获中断
|
1
2
3
4
5
| if(IC_State)
{
IC_State=0;
printf("DUTY:%0.2f%% FREQ:%0.2fHz\n",DutyCycle,Frequency);
}
|
下载调试
- 编译之后下载到开发板
- 连接PC6到PA6
- 连接开发板串口
- 打开串口助手
- 可以看到频率和占空比和示波器看到的一样
- 和HAL库结果一致