
关于STM8定时器4的问题,无论怎么设置初值,计时器好像没有什么反应。
定时器初始化程序voidTIMER_Init(void){//系统定时器初始化TIM4_IER=0x00;//禁止中断TIM4_PSCR=0x01;//计数时钟=主时钟的...
定时器初始化程序
void TIMER_Init(void)
{
//系统定时器初始化
TIM4_IER = 0x00; //禁止中断
TIM4_PSCR = 0x01; //计数时钟=主时钟的2分频,即1MHZ
TIM4_ARR = 0x9C; //自动重装值156,约每100微秒产生一次中断
TIM4_CNTR = 0x9C; //
TIM4_IER = 0x01; //计数器中断开启
TIM4_EGR = 0x01; //允许产生更新事件
TIM4_CR1 = 0x81; //开启计数器
return;
}
定时中断
@far @interrupt void Timer4IRQHandler(void)
{
TIM4_SR =0x00; //清除更新标志
i++;
if(i<10000)
return;
i=0;
PD_ODR = PD_ODR ^ 0x08; //端口设置
return;
}
系统时钟使用内部RC振荡器,16M,默认8分频为2M,
请教 大侠,无论我怎么改变TIM4_ARR = 0x9C后面的数字,
LED闪烁变化不大,约为亮0.4秒,灭0.4秒
将
if(i<10000)
为
if(i<60000)
LED闪烁速度变化相当大,亮约2.6秒,灭约2.6秒
而按手册所讲,为60000时,应该亮6秒,灭6秒。
请问一下,我的问题出在哪,
不动脑筋的复制粘贴党滚远点! 展开
void TIMER_Init(void)
{
//系统定时器初始化
TIM4_IER = 0x00; //禁止中断
TIM4_PSCR = 0x01; //计数时钟=主时钟的2分频,即1MHZ
TIM4_ARR = 0x9C; //自动重装值156,约每100微秒产生一次中断
TIM4_CNTR = 0x9C; //
TIM4_IER = 0x01; //计数器中断开启
TIM4_EGR = 0x01; //允许产生更新事件
TIM4_CR1 = 0x81; //开启计数器
return;
}
定时中断
@far @interrupt void Timer4IRQHandler(void)
{
TIM4_SR =0x00; //清除更新标志
i++;
if(i<10000)
return;
i=0;
PD_ODR = PD_ODR ^ 0x08; //端口设置
return;
}
系统时钟使用内部RC振荡器,16M,默认8分频为2M,
请教 大侠,无论我怎么改变TIM4_ARR = 0x9C后面的数字,
LED闪烁变化不大,约为亮0.4秒,灭0.4秒
将
if(i<10000)
为
if(i<60000)
LED闪烁速度变化相当大,亮约2.6秒,灭约2.6秒
而按手册所讲,为60000时,应该亮6秒,灭6秒。
请问一下,我的问题出在哪,
不动脑筋的复制粘贴党滚远点! 展开
2个回答
展开全部
1、总中断开了吧~~~ enableInterrupts();开总中断(我用的是ST的编译器,不是IAR)
2、TIM4_SR寄存器是否应该是TIM4_SR1
3、把初始化程序这样改一下试试,不用计数器
TIM4_ARR = 0x9c; //定时0.1ms
TIM4->IER = 0x01; //使能溢出中断
TIM4->PSCR= 0x01; //2分频
TIM4->CR1 = 0x01; //enable Timer4
2、TIM4_SR寄存器是否应该是TIM4_SR1
3、把初始化程序这样改一下试试,不用计数器
TIM4_ARR = 0x9c; //定时0.1ms
TIM4->IER = 0x01; //使能溢出中断
TIM4->PSCR= 0x01; //2分频
TIM4->CR1 = 0x01; //enable Timer4
展开全部
// TIM4测试程序,编译器为IAR,硬件为STM8S003
#include <iostm8s003f3.h>
#include <stdint.h>
uint16_t xms;
void t4_init()
{
TIM4_PSCR = 0x03; // 预分频值为8,4uS计数时间
TIM4_ARR = 0xF9; // 自动装载值,4us*(249+1)=1mS更新一次
TIM4_CNTR = 0x00; // 计数器值
TIM4_IER = 0x01; // 允许T4更新中断
TIM4_CR1 = 0x81; // 预装载T4,开计数器
}
void main( void )
{
PD_DDR = 0x08; // PD3设置为输出
PD_CR1 = 0x08; // PD3设置为推挽输出
t4_init(); // TIM4初始化
asm("rim"); // 开总中断
while(1);
}
#pragma vector=25
__interrupt void TIM4_IRQ(void)// T4中断函数,每1mS进入一次
{
TIM4_SR = 0; // 清除中断标志
++xms;
if(xms==1000) // 计数1000mS
{
xms = 0;
PD_ODR_ODR3 = !PD_ODR_ODR3; // 翻转PD3
}
}
#include <iostm8s003f3.h>
#include <stdint.h>
uint16_t xms;
void t4_init()
{
TIM4_PSCR = 0x03; // 预分频值为8,4uS计数时间
TIM4_ARR = 0xF9; // 自动装载值,4us*(249+1)=1mS更新一次
TIM4_CNTR = 0x00; // 计数器值
TIM4_IER = 0x01; // 允许T4更新中断
TIM4_CR1 = 0x81; // 预装载T4,开计数器
}
void main( void )
{
PD_DDR = 0x08; // PD3设置为输出
PD_CR1 = 0x08; // PD3设置为推挽输出
t4_init(); // TIM4初始化
asm("rim"); // 开总中断
while(1);
}
#pragma vector=25
__interrupt void TIM4_IRQ(void)// T4中断函数,每1mS进入一次
{
TIM4_SR = 0; // 清除中断标志
++xms;
if(xms==1000) // 计数1000mS
{
xms = 0;
PD_ODR_ODR3 = !PD_ODR_ODR3; // 翻转PD3
}
}

你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询