温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录
重点提炼:
根据手册内容,输出比较模式(output Compare CHx)的功能主要需要由以下参数决定:
- 通过设置 Counter Period 来设置周期
- 通过设置 Mode 来设置输出比较模式
- 通过设置 Puls 来设置脉冲宽度(不可大于周期宽度)
- 通过设置 CH Polarity 来设置通道极性(使用有效电平或无效电平模式时配置,本示例是翻转模式,与该参数无关)
理论知识:
输出比较(output compare)用于控制输出波形,或指示经过了某一段时间。它的工作原理是:用捕获/比较寄存器的值CCR与计数器值CNT比较,如果两个寄存器的值匹配,产生输出比较结果OCyREF,这个值由比较模式和输出极性决定,这个比较结果可以输出到通道的引脚。比较匹配时,可以产生中断或DMA请求,可以引起输出引脚发生如下几种变化。
- 冻结(Frozen),即保持其电平。
- 有效电平(Active level),有效电平由设置的通道极性决定。
- 无效电平(Inactive Level)。
- 翻转(Toggle)。
现设计一个示例,来演示这一功能的使用流程。
使用TIM16_CH1的输出比较功能控制LED灯反转输出。为了充分利用开发板上的资源,这里将TIM16_CH1的输出当作一个开关信号,开控制板子上的LED。
一、需求分析
1、需要的外设资源分析:
- 选择TIM16的CH1通道来进行输出比较,TIM16只有一个通道对应PA6引脚。
- 板子上的8个LED,只需要开全部灯和关全部灯的功能,选择一种驱动方法即可。
2、外设具体分析:
查看原理图,和手册。
根据手册内容,输出比较模式(output Compare CHx)的功能主要需要由以下参数决定:
- 通过设置 Counter Period 来设置周期
- 通过设置 Mode 来设置输出比较模式
- 通过设置 Puls 来设置脉冲宽度(不可大于周期宽度)
- 通过设置 CH Polarity 来设置通道极性(使用有效电平或无效电平模式时配置,本示例是翻转模式,与该参数无关)
3、软件分析:
启动TIM_CH1的输出比较功能,以轮询方式检查TIM_CH1引脚的输出状态,如果为高电平那么就使8个LED灯熄灭,如果为低电平就点亮8个LED灯。
二、软件配置
参考附录的内容,新建名为“OutComp_Demo”的项目。
时钟配置:将APB1 timer clocks设置为50MHz
按照分析配置TIM16:
先启用TIM16的通道1,设置为输出比较模式:
然后配置 Parameter Settings :
- 设置 Prescaler 为49999
- 设置 Counter Period 为499
- 设置 Pulse 为300
结果如图:
然后打开TIM16全局中断,设置优先级为1。
根据附录内容,配置LED引脚和驱动文件。
生成项目文件后,打开MDK。
三、代码编写
分析:
在主循环前启动TIM16,启动CH1的输出比较功能。
在主循环中轮询检测CH1的输出状态,如果为高电平那么就使8个LED灯熄灭,如果为低电平就点亮8个LED灯。
在MDK中编写代码
在 main(void) 的 WHILE代码段,编写以下代码。
/* USER CODE BEGIN WHILE */
HAL_TIM_Base_Start(&htim16);
HAL_TIM_OC_Start(&htim16,TIM_CHANNEL_1);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==GPIO_PIN_SET)
LED_change(LED_NULL);
else
LED_change(LED_ALL);
/* USER CODE END WHILE */
四、运行测试
编译、下载。
运行结果可以看到8个LED灯每秒闪烁一次。