请教STM8的TIM4的配置
新人一枚,百思不得其解,跑来请教大神
/* 添加包含芯片的头文件 */
#include<iostm8s103f3.h>
/*******************************************************************************
**函数名称:void Timer4Init()
**功能描述:定时器4参数初始化
**入口参数:无
**输出:无
*******************************************************************************/
void Timer4Init()
{
TIM4_IER_bit.TIE = 0; // 禁止(触发)中断
TIM4_IER_bit.UIE = 0; // 产生
TIM4_EGR_bit.UG = 1; // 允许产生更新事件
TIM4_PSCR_bit.PSC = 7; // 计数器时钟=主时钟16MHz / 128 = 125KHz (每8us计数值加1)
TIM4_ARR = 125; //设定定时器4产生1毫秒重装载时的计数值,255是最大值
TIM4_CNTR = 0x00; // 设定计数器的初值
}
/*******************************************************************************
**函数名称:void TIM4Delayms(unsigned int ms)
**功能描述:定时器4参进行精确延时,最小为1毫秒,最大65535
**入口参数:unsigned int ms 1=< ms <= 65535
**输出:无
*******************************************************************************/
void TIM4Delayms(unsigned int ms)
{
TIM4_CNTR = 0x00; // 设定计数器的初值
TIM4_CR1_bit.CEN = 1; //启动定时器4开始计数
while(ms--)
{
while(TIM4_SR_bit.UIF == 0);//等待计数是否达到1毫秒
TIM4_SR_bit.UIF = 0; //计数完成1毫秒,清除相应的标志
}
TIM4_CR1_bit.CEN = 0; //延时全部结束,关闭定时器4
}
/*******************************************************************************
**函数名称:void LED3_Init()
**功能描述:LED3->功能引脚初始化
**入口参数:无
**输出:无
*******************************************************************************/
void LED3Init()
{
PC_DDR_bit.DDR6 = 1; //设置端口PC->6的输入输出方向寄存器为输出方向
PC_CR1_bit.C16 = 1; //PC->6为推挽输出
PC_CR2_bit.C26 = 1; //PC->6是输出速度最快为10MHz
}
/* 主函数 */
int main(void)
{
asm("sim"); //关闭系统总中断
CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1内部时钟 = 16Mhz
Timer4Init(); //调用定时器4初始化函数
LED3Init(); //调用LED3初始化函数
while(1)
{
PC_ODR ^= 0x40; //异或取反PC->6 ,控制LED3进行周期性亮灭亮灭操作
TIM4Delayms(1000); //调用定时器4进行精确延时1000毫秒,即1秒
}
}
这是一个定时器精确延时的程序(红色部分我不理解)
问题:
1.对TIM4_EGR事件产生寄存器,UG置1,会有什么变化?(是立即产生中断?还是由我设置了初值后,溢出产生中断?)
2.对UG的理解(请指正):
>>>>>>>>>UG置1,是不是会产生更新中断请求,收到请求后,硬件会将更新中断标志UIF置1,与中断使能寄存器IER的UIE无关
3.为什么溢出后IER寄存器的UIF都复位了,还需要清零?
4.为啥定时器4参进行精确延时,最大65535?(我认为是例程编写者可能说错了)
1、UG置1立即产生中断
3、UIF是硬件置位需要软件清除
4、定时器是16位的定时器,计数器最大就到65535,初始化的时候将定时器的频率设置为1ms,那么最大延时就是65535ms,如果时间不够,可以更改定时器频率,但是跨度就是65535 mylovemcu 发表于 2019-9-4 09:28
1、UG置1立即产生中断
3、UIF是硬件置位需要软件清除
感谢你的解答,我的疑问是TIM4是一个8位定时器呀 kimding 发表于 2019-9-4 21:05
感谢你的解答,我的疑问是TIM4是一个8位定时器呀
啊 不好意思看错了TIM4是8位定时器初始化以后是1ms的中断定时在延时函数里定义的int类型是16位的最大到65535如果想加大数据可以换成long型的 mylovemcu 发表于 2019-9-5 07:53
啊 不好意思看错了TIM4是8位定时器初始化以后是1ms的中断定时在延时函数里定义的int类型是16位的 ...
明白了
:)
页:
[1]