STM8S系列定时器TIME 库函数使用,咱们继续点灯(渝兴未到工作室) 很简单小白也可以跟着学。
今天给大家介绍关于STM8S系列的定时器基础使用,今天咱们继续点灯(←_←)。
上一章节的GPIO我这里还是给个传送门吧:
GPIO的控制输出
https://blog.csdn.net/weixin_42714281/article/details/105705144
首先我还是把项目给配置一下吧!! 大家可以参考我上面👆的传送门。或者看我前两期的博客(配置教程)。 我这用的是STM8S105k4T6的单片机作为例子开发,因为便宜.。。。。。
懒的话我这里就直接个传送门:
链接:https://pan.baidu.com/s/1_UCfQ4BqZHmq8HIMbP5SaA
提取码:nx5y
复制这段内容后打开百度网盘手机App,操作更方便哦
下面这张图片就工程环境配置完成后的样子👇。如果导入我的工程报错请务必查看一下我GPIO那个博客,以后在实际开发中也会遇到这种错误!!
然后配置完成后我们就开始来写一个定时器计时点亮一个灯的教程,比较简单
首先我们还是来配置时钟,在Main.c里面 插入以下代码。具体意思大家可以参考ST官方的api数据手册 我也有给了相应的文档注释
小青蛙工具:链接:https://pan.baidu.com/s/1R_j0ZXGBr_aKoADPQjJnrA
提取码:6fd8
//-------------------- 初始化系统时钟---------------------------
void DriveM_InitSystemclock(void)
{
CLK_DeInit(); // 重置时钟恢复默认值
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 配置内部高速时钟HSI分频 1分频
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); // 配置系统时钟分频
CLK_HSICmd(ENABLE); // 打开内部高速时钟 HSI
}
然后接下来我们开始配置就是输出口,就是确定哪个引脚拿来点灯 今天我们用PD7作为输出口
//-------------------- 配置端口 ---------------------------------
void DriveM_InitGpio(void)
{
GPIO_DeInit(GPIOD); //重置端口GPIOD (包括PD0~7)
GPIO_Init(GPIOD, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_SLOW); //配置端口GPIOD PD7,低速推挽输出
}
上面的代码在我给的GPIO 的博客里面应该是一样的,下面我们开始配置Timer定时器
大家可以通过查看自己使用的单片机数据手册上面查看到的资源来确定 timer .
这里设置分频,我们这里timer设置的16分频
//-------------------- TIMER 2端口 ---------------------------------
void DriveM_InitTimer(void)
{
//enable timer2 and iic clk
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); //使能Timer2 打开定时器
/*timer2 init*/
TIM2_DeInit(); //Timer2 恢复默认值
/*timer2 base init 1Mhz -> interrupt 1ms */
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000); //Timer2 初始化设置16分频 16M/16=1MhZ, 后面那个值是定时计数值 1000 ~= 1ms
//enable IT
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); //这是中断更新设置,就是计时完成后在中断处理计时(一般项目用法)
//enable timer2
TIM2_Cmd(ENABLE); //打开Time定时器。。。。。 开始工作
}
以上就是基础的系统时钟,GPIO输出和定时器设置, 是不是比较简单啊!!!
我们继续 接下来就是要完成我们的灯的闪烁好现在 我们把这些配置函数导入main 函数里面,让程序一运行就初始化
这里一定要注意**要打开全局中断不然中断没法使用**
要加入 _asm(“rim”); 这句代码
就像这样 然后定时器就开始计时咯!!!我们就需要等待它计时到然后处理就行了
因为我们设置的中断更新然后 为了方便我就再中断里面处理了这种处理方式真实开发不推荐
上面的就 定时器计时到位的中断处理的位置!! 再stm8s_it.c里面的(中断函数处理都在这里的) INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
然后
下面就是定时器处理灯的状态!! 实现一亮一灭的效果
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
static uint16_t tiemr2_cnt =0; //创建一个静态变量用于计数
//clear update falg
TIM2_ClearFlag(TIM2_FLAG_UPDATE); //清除Time2标志位,计时到了的标志
//clear interrupt updata flag
TIM2_ClearITPendingBit(TIM2_IT_UPDATE); //清除进入中断更新标志
tiemr2_cnt ++; //每次进入中断tiemr2_cnt ++
if((tiemr2_cnt % 2000) == 0) //timer2 1s
{
GPIO_WriteReverse(GPIOD, GPIO_PIN_7); //灯的状态改变
tiemr2_cnt =0;
}
}
然后下面我就上电调试一下
运行正常的画就可以看到 灯 2s闪烁一次 这是用的 定时器实现点灯效果
以上就是简单的实现通过定时器控制的点灯效果(临时用到的开发板)
整体来讲的话还是简单
大家可以加入我们的交流群:764284134
后面我还是会接着弄着走,有什么不懂得大家也可以在论坛上面评论,有需要开发板的也可以联系我!!或者加我们的群
后面我还是把项目放到GitHub上面! ! !