我使用STM8L151F2,使用16MHz的内部高速时钟HSI,没有分频;然后对TIM4使用了128分频,填充值为125,我本来想它会1ms中断一次,然后再中断程序中每计数500次(0.5秒)切换一下指示灯。 但在开发板上却发现要增加100倍才达到我想要的效果,对照参考手册翻来覆去都实在找不到问题出在那里,请帮忙看看是哪里搞错了,谢谢! void Init_TIM4(void) { CLK_ICKCR |=0x01; //打开内部高速时钟HSI(16MHz); CLK_SWR =0x01; //系统时钟源使用内部高速时钟HSI;0x01=HSI,0x02=LSI,0x04=HSE,0x08=LSE其余保留 CLK_CKDIVR=0x00; //系统不分频,使之工作在16MHz的频率下(0=1,1=2,2=4,3=8,4=16) CLK_PCKENR1 |= 0x04; //让TIM4链接上系统时钟。 //定时器TIM4的初始化,首先将TIM4相关的寄存器全部复位 TIM4_CR1 = 0x00; //控制寄存器1 TIM4_CR2 = 0x00; //控制寄存器2 TIM4_SMCR = 0x00; //从模式控制寄存器 TIM4_IER = 0x00; //中断使能寄存器 TIM4_CNTR = 0x00; //计数寄存器 TIM4_PSCR = 0x00; //分频值寄存器 TIM4_ARR = 0xFF; //重装填值寄存器,手册上写的复位值是0xFF, TIM4_SR1 = 0x00; //状态寄存器 //对TIM4进行设置 TIM4_PSCR = 0x07; //对系统时钟进行128分频,当前系统使用16MHz,经128分频后得128KHz(8us/触发) TIM4_ARR = 125; //125次触发×8us=1000us=1ms。就是说1ms产生1次中断 TIM4_EGR = 0x01; //TG =0,UG =1; 选择中断类型 TIM4_IER |= 0x01; //打开中断 TIM4_CR1 |= 0x01; //打开定时器; } #pragma vector=TIM4_UIF_vector //TIM4的中断函数 __interrupt void TIM4_UIF(void) { TIM4_count ++; // if(TIM4_count >= 500){ //一开始以为会1ms中断一次,500次中断得500ms,但实际效果是指示灯常亮 if(TIM4_count >= 50000){ //现在改为五万次中断动作1次,才实现0.5秒指示灯动作一次。 PB_ODR ^=0x02; //指示灯的引脚反相,实现开关灯。 TIM4_count =0; } TIM4_SR1 = 0x01; //清除TIM4的中断标志,以防重复进入 } 谢谢! |
测试标签123
IAR FOR ARM和IAR FOR STM8无法共存,
STM8L052,液晶内部电源怎么用?
STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。
STM8S105C6T6 UART2串口,能接收数据,不能发送数据
STM8S105K4 串口2 无奇偶校验,也能接收 偶校验的 数据
在STM8S的IAP使用中断和APP使用中断问题
STM8L151 SMBUS设计
STM8S103F复位异常
STM8L的LCD调试时不亮
现象是这样的:
CLK_PCKENR1 |= 0x04; //让TIM4链接上系统时钟。我加上这行代码后,TIM4有中断,指示灯能闪,但USART1不工作。
如果我屏蔽这行代码,串口能工作,TIM4就不工作了,指示灯不闪。不知道有没有碰到过这个问题?
评分
查看全部评分
预分频寄存器 (TIMx_PSCR)
傻傻分不清楚
评分
查看全部评分
对于你的usart,如果你时钟频率不对了,肯定时串口输出乱码或者不输出。
评分
查看全部评分