历史上的今天
今天是:2024年12月24日(星期二)
2019年12月24日 | STM8S定时器TIM4定时1kHz输出
2019-12-24 来源:eefocus
1.将主时钟切换到HSE;(外部晶振为8MkHz)
2.将主时钟时钟频率8分频,即计数器时钟周期为1us;
3.设置定时器250us中断一次;
4.在中断程序里判断中断次数是否到2次;
5.到2次翻转引脚电平。(逻辑分析仪检测频率)
寄存器版:
unsigned char i=255;
PE_DDR_DDR5=1;//配置PD0为输出模式
PE_CR1_C15=1;//配置PD0为推挽模式
PE_CR2_C25=0;//配置PD0输出最大为10Mhz
if(CLK_CMSR==0xE1) {//如果HSI为主时钟源(复位值),切换到HSE
CLK_SWCR_SWIEN=1;//时钟切换中断使能
CLK_SWR=0xB4;//HSE为主时钟源
asm("rim");//开启全局中断
}
while(CLK_SWCR_SWBSY)//等待忙标志复位
{
i--;
if(i==0) {
CLK_SWCR_SWBSY=0;//如果时钟切换没有成功,清除标志位SWBSY以复位当前的切换操作
break;
}
}
TIM4_CNTR=0; //初始化计数器值
TIM4_ARR=0xFA; //自动重装寄存器值250,250us
TIM4_PSCR_PSC=0x03; //预分频系数为8,8M/8=1M->1us
TIM4_EGR_UG=1; //手动产生一个更新事件,立即更新预分频器
TIM4_IER_UIE=1;//更新中断使能
TIM4_CR1_CEN=1;//使能计数器
while(1);
}
#pragma vector=CLK_SWITCH_vector
__interrupt void CLK_IRQHandler(void){
CLK_SWCR_SWIF=0;//清除中断标志
CLK_SWCR_SWEN=1;//使能时钟切换的执行
}
unsigned char t4=0;
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_IRQHandler(void){
t4++;
if(t4==2)
{
PE_ODR_ODR5=!PE_ODR_ODR5;//取反
t4=0;
}
TIM4_SR_UIF=0;
}
库函数版:
CLK_DeInit();//重置时钟相关寄存器到默认复位值
GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
enableInterrupts();//使能全局中断
ErrorStatus es;
es = CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL, CLK_SOURCE_HSE, ENABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
//手动切换;新的时钟源:HSE;启动切换中断;保持原时钟源开启
if (es == SUCCESS) //切换是否成功,SUCCESS or ERROR
{
TIM4_TimeBaseInit(TIM4_PRESCALER_8, 0xFA);//初始化时基单元,8分频,自动重载寄存器值为250
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//使能TIM4更新中断
// TIM4_PrescalerConfig(TIM4_PRESCALER_8, TIM4_PSCRELOADMODE_UPDATE);
TIM4_GenerateEvent(TIM4_EVENTSOURCE_UPDATE);//手动产生更新事件
TIM4_Cmd(ENABLE);//启动定时器
}
else{
CLK_SYSCLKEmergencyClear();//清除时钟切换标志
}
/* Infinite loop */
while (1)
中断服务程序:
INTERRUPT_HANDLER(CLK_IRQHandler, 2)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
ITStatus flags_tatus;
flags_tatus = CLK_GetITStatus(CLK_IT_SWIF);//检测时钟切换中断标志
if (flags_tatus == SET) //如果时钟切换中断标志SWIF是置位状态,SET or RESET
{
CLK_ClearITPendingBit(CLK_IT_SWIF);//清除时钟切换中断标志
CLK_ClockSwitchCmd(ENABLE);//启动时钟切换功能
};
}
unsigned char i=0;
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
i++;
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
if(i==2){
i=0;
GPIO_WriteReverse(GPIOE, GPIO_PIN_5);
}
}
频率输出:

这里建议计数器计数次数不要太少,中断服务程序里程序不宜太多,否则会造成中断服务程序未执行完,又来一个中断,造成程序执行不正确。
上一篇:STM8L之ADC
史海拾趣
|
我想对3G无线上网卡(如Huawei EC1260)进行应用开发,具体的想法是,把上网卡接到电脑上,通过开发的程序进行短信收发,拨打电话,连接上网,断开网络等。无线上网卡原来已经有驱动程序,但要进行自己的应用开发,不知道要怎么使用?在哪里可以获得 ...… 查看全部问答> |
|
板子是研杨的4310,带44pin的LCD接口,接口定义如下: 01. +12 VDC 02. +12 VDC 03. GND 04. GND 05. +5 VDC &nbs ...… 查看全部问答> |
|
第一次焊LGA封装的芯片心里有点紧张,焊上去后又看不见各个引脚是否连通。要是不连通的话,那么写程序就麻烦了,所以我就打算先确定它是否连通。 昨天晚上在基地奋战到三点多,就是为了测量MMA7455L是否焊好。我的方法是用数字示波器测量mma7455l ...… 查看全部问答> |
|
看了Cortex-M3技术参考手册后,感觉对异常处理中堆栈的操作理解还是不清晰.1.在Thread mode下,发生异常或中断,处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈,当ISR返回时,又自动将上述寄存器出栈.这个没问题.2.当抢先优先级不同时,优先 ...… 查看全部问答> |
|
一、硬件系统 原理图以TMS570LS31x Hercules USB Stick Development Kit 参考 PCB 以TMS570LS31x_USB_STICK_Gerber参考… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 04:03 编辑 这几天看2011年的B题,如果用步进电机控制平板,用平板上的陀螺仪返回角度,进行PID闭环控制,但是单摆是不断运动的,因而步进电机所需要转动的角度不断在变,PID中的DesireVaule不断在变,这时候PID ...… 查看全部问答> |




