
我使用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的中断标志,以防重复进入 } 谢谢! |
STM8S003无法检测到引脚电平
STM8 @svlreg 问题
STM8AF62XX+L99PM62GXP LIN通讯的电路原理图有吗?官网提供了一套软件,没找到对应的原理图,请大家指教一下
求一个STM8S207例程
初次接触STM8,请问在STVD中,为什么这个Struct会报错
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
现象是这样的:
CLK_PCKENR1 |= 0x04; //让TIM4链接上系统时钟。我加上这行代码后,TIM4有中断,指示灯能闪,但USART1不工作。
如果我屏蔽这行代码,串口能工作,TIM4就不工作了,指示灯不闪。不知道有没有碰到过这个问题?
评分
查看全部评分
预分频寄存器 (TIMx_PSCR)
傻傻分不清楚
评分
查看全部评分
对于你的usart,如果你时钟频率不对了,肯定时串口输出乱码或者不输出。
评分
查看全部评分
2. 你确定你能从你的中断函数中退出么? “TIM4_SR1 = 0x01; //清除TIM4的中断标志,以防重复进入”,清除中断标志不是写'1',仔细看手册
评分
查看全部评分