STM8 STVD TIM1 计数功能
时间:10-02
整理:3721RD
点击:
笔记亲自测试通过。
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
/* 程序实现功能 设置外部 TIM1 时钟源 计数功能,如果串口 在串口助手上看到计数值
*
**/
/*
* TIM1 工作在定时功能模式时 定时器的时钟CK_PSC 由内部分频后提供
* 如果把时钟源改为外部当外部电平发生变化 时 TIM1_CNTR 中的值 就会变化
* 这样就实现了计数功能
*
*/
#include "stm8s105c4.h"
void gpio_init(void)
{
/*
* 这个可以不用IO 口 如果如果灯效果来显示也可以设置
*/
PB_ODR = 0XFF;
PB_DDR = 0XFF;
PB_CR1 = 0XFF;
PB_CR2 =0XFF;
PC_DDR = 0X00;
PC_CR1 = 0XFF;
}
//定时器1 初始化
void tim1_init(void)
{
//输入捕获频率设置 为 fsmapling = fmaster/32 n=8
TIM1_CCMR1 |= 0X00; //滤波频率设置 或采样频率设置
//OCICE =1
// 一旦检测到 ETRF 输入高电平OC1REF = 0;
//OC1M[2:0] = 111
//pwm 模式2 向上计数 一旦TIM1_CNT <TIM1_CCR1 时通道1 为无效电平
//否则为有效电平
// 一旦TIM1_CNT>TIM1_CCR1 时 通道1 为有效电平 否则为无效电平
TIM1_CCER1 = 0X20; //选择上升下降电平
//捕获发生在TI2F 的低电平或下降沿
TIM1_SMCR |= 0X07; //选择上升还是下降 作为触发
//外部时钟模式 1 选中的触发 TRGI 的上升沿驱动计数器
TIM1_SMCR |=0X60; //选择输入端
//选择TI2 作为输入端
// 也就是 PC2
// ITM1_CH2
}
void uart2_init(void)
{
}
void main()
{
gpio_init(); //IO 口初始化
tim1_init(); //定时器1 初始化
TIM1_CR1 |= 0X11;
//ARPE =0 TIM1_ARR 寄存器没有缓存 直接写入 =1 TIM1_ARR 寄存器由预装载缓冲器缓冲
//CMS =00 边沿对齐模式 计数器依据方向位DIR 向上或向下计数
// = 01 中央对其模式1 计数器交替向上或向下计数 配置为输出的通道TIM1_CCMR 中CCIS =00 的输出比较中断标志位
//只在计数器向下计数时 计数置1
// = 10 中央对其模式2 计数器交替向上和向下计数,配置位输出通道TIM1_CCMRX 寄存器中 CCIS 输出比较中断标志位
// 只在计数器向上计数时 被置1
// 11 中央对齐模式3 计数器交替地向上和向下计数 配置为输出通道 的输出比较中断标志位 在计数器向上和向下计数时被
//置 1
//DIR
//OPM
//URS
//UDIS =0 一旦下列事件发生 产生更新UEV 事件
//计数器上溢出 或下溢出
//软件更新
//时钟触发模式控制器产生硬件复位
//=1 不产生更新事件 影子寄存器 ARR PSC CCRX 保持它的值 如果设置UG 位
//或时钟触发控制器发出一个硬件复位 则计数器和预分频器重新初始化
//CEN =0 禁止计数器 =1 使能计数器
uart2_init(); //串口初始化
while (1)
{
PB_ODR =~TIM1_CNTRL; //把数到的数 在PB 口显示出来,实验是通过 PB 口接 8个led 灯来显示的。
}
}
// 其中的串口我去掉了,加上串口可以在串口助手中看到 计数的增加
//现在 需要通过PB 口接 LED 灯来查看计数的增加
//可以改变计数方向
//可以改变捕获频率
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
/* 程序实现功能 设置外部 TIM1 时钟源 计数功能,如果串口 在串口助手上看到计数值
*
**/
/*
* TIM1 工作在定时功能模式时 定时器的时钟CK_PSC 由内部分频后提供
* 如果把时钟源改为外部当外部电平发生变化 时 TIM1_CNTR 中的值 就会变化
* 这样就实现了计数功能
*
*/
#include "stm8s105c4.h"
void gpio_init(void)
{
/*
* 这个可以不用IO 口 如果如果灯效果来显示也可以设置
*/
PB_ODR = 0XFF;
PB_DDR = 0XFF;
PB_CR1 = 0XFF;
PB_CR2 =0XFF;
PC_DDR = 0X00;
PC_CR1 = 0XFF;
}
//定时器1 初始化
void tim1_init(void)
{
//输入捕获频率设置 为 fsmapling = fmaster/32 n=8
TIM1_CCMR1 |= 0X00; //滤波频率设置 或采样频率设置
//OCICE =1
// 一旦检测到 ETRF 输入高电平OC1REF = 0;
//OC1M[2:0] = 111
//pwm 模式2 向上计数 一旦TIM1_CNT <TIM1_CCR1 时通道1 为无效电平
//否则为有效电平
// 一旦TIM1_CNT>TIM1_CCR1 时 通道1 为有效电平 否则为无效电平
TIM1_CCER1 = 0X20; //选择上升下降电平
//捕获发生在TI2F 的低电平或下降沿
TIM1_SMCR |= 0X07; //选择上升还是下降 作为触发
//外部时钟模式 1 选中的触发 TRGI 的上升沿驱动计数器
TIM1_SMCR |=0X60; //选择输入端
//选择TI2 作为输入端
// 也就是 PC2
// ITM1_CH2
}
void uart2_init(void)
{
}
void main()
{
gpio_init(); //IO 口初始化
tim1_init(); //定时器1 初始化
TIM1_CR1 |= 0X11;
//ARPE =0 TIM1_ARR 寄存器没有缓存 直接写入 =1 TIM1_ARR 寄存器由预装载缓冲器缓冲
//CMS =00 边沿对齐模式 计数器依据方向位DIR 向上或向下计数
// = 01 中央对其模式1 计数器交替向上或向下计数 配置为输出的通道TIM1_CCMR 中CCIS =00 的输出比较中断标志位
//只在计数器向下计数时 计数置1
// = 10 中央对其模式2 计数器交替向上和向下计数,配置位输出通道TIM1_CCMRX 寄存器中 CCIS 输出比较中断标志位
// 只在计数器向上计数时 被置1
// 11 中央对齐模式3 计数器交替地向上和向下计数 配置为输出通道 的输出比较中断标志位 在计数器向上和向下计数时被
//置 1
//DIR
//OPM
//URS
//UDIS =0 一旦下列事件发生 产生更新UEV 事件
//计数器上溢出 或下溢出
//软件更新
//时钟触发模式控制器产生硬件复位
//=1 不产生更新事件 影子寄存器 ARR PSC CCRX 保持它的值 如果设置UG 位
//或时钟触发控制器发出一个硬件复位 则计数器和预分频器重新初始化
//CEN =0 禁止计数器 =1 使能计数器
uart2_init(); //串口初始化
while (1)
{
PB_ODR =~TIM1_CNTRL; //把数到的数 在PB 口显示出来,实验是通过 PB 口接 8个led 灯来显示的。
}
}
// 其中的串口我去掉了,加上串口可以在串口助手中看到 计数的增加
//现在 需要通过PB 口接 LED 灯来查看计数的增加
//可以改变计数方向
//可以改变捕获频率
就不能打包分享吗