历史上的今天
今天是:2025年02月11日(星期二)
2020年02月11日 | STM8 TIM2 定时器的问题
2020-02-11 来源:eefocus
所用的芯片为STM8S103F3P6,编译器为IAR ,程序代码如下:
// #include "iostm8s105c6.h"
#include "iostm8s103F3.h" // Very importtant
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms != 0)
{
for(i=0;i<250;i++)
{
}
for(i=0;i<75;i++)
{
}
ms--;
}
}
////GPIO口初始化
void GPIO_init(void)
{
PA_DDR = 0x08; // 配置PD端口的方向寄存器PD0输出
PA_CR1 = 0x08; // 设置PD0为推挽输出
PA_CR2 = 0x00;
PC_DDR = 0x18; // 配置PD端口的方向寄存器PD0输出
PC_CR1 = 0x18; // 设置PD0为推挽输出
PC_CR2 = 0x00;
}
void ADC_init(void)
{
CLK_PCKENR2 =0x08; // Enable the f(MASTER) Clock to ADC;
ADC_CR1 = 0x40; // ADC Clock: SPSEL[2:0]=100; fADC = f(MASTER)/8=1M; Single conversion mode ; ADON=0;
ADC_CR2 = 0x20; // Data Left alignment ;Scan mode disabled
ADC_CSR = 0x03; // Select Channel AIN3; EOC interrupt disabled ; (ECO:End of conversion)
ADC_TDRL = 0x03; // Channel AIN3 Schmitt trigger disabled
}
void TIM2_init(void)
{
CLK_PCKENR1=0x20; // Enable the f(MASTER) Clock to Time2;
TIM2_PSCR =0x03; // Time2 Clock Frequency:1M ; prescaler :8; Fck_psc/ 2^(PSC[3:0]); 0011; //Fck_psc=f(MASTER)=8M;
TIM2_EGR = 0x01; // Re-initializes the counter and generates an update of the registers
TIM2_CNTRH = 0x0; // Counter Starting Value;
TIM2_CNTRL = 0x0;
TIM2_ARRH = 0xC3; // TIM2_ARRH Must be Loaded Value First ,then to TIM2_ARRL; Auto-reload// register high (TIMx_ARRH);
TIM2_ARRL = 0x50; // 0xC350 = 50000 ;Time = 1us x 50000 = 50 ms;
TIM2_IER =0x01; // Time2 Update interrupt Enabled;
TIM2_CR1 =0x01; // Counter enable;
}
void CLK_init(void)
{
CLK_SWR = 0xE1; // 0xE1: HSI selected as master clock source ; f(HSI)RC =16M ;
CLK_CKDIVR = 0x09; // f(HSI)RC =16M ; f(HSI)=[f(HSI)RC]/2 = 8M = f(MASTER) ; f(CPU)=f(MASTER)/2= 4M ;
}
int i=0;
unsigned int ADdata;
unsigned int ADlow;
main()
{
GPIO_init();
CLK_init();
TIM2_init();
ADC_init();
asm("rim"); //Enable Global interrupt;
while(1)
{
PC_ODR = 0x00;
// PA_ODR = 0x00;
PA_ODR = 0x08;
// DelayMS(100);
if(i%20==0)
{
//PC_ODR = 0x00;
//PA_ODR = 0x08;
//DelayMS(200);
PA_ODR = 0x00;
DelayMS(50);
// i=0;
//PC_ODR = 0x08;
// DelayMS(100);
// PC_ODR = 0x10;
// DelayMS(100);
}
if(i==40)
{
// ADC_CR1 |=0x01; //启动转换
//while((ADC_CSR&0x80) == 0); // 等待ADC结束
//PC_ODR = 0x00;
PA_ODR = 0x00;
DelayMS(300);
// PA_ODR = 0x08;
//DelayMS(100);
i=0;
PC_ODR = 0x08;
DelayMS(30);
// PC_ODR = 0x10;
// DelayMS(30);
}
//for(i=0;i<10;i++)
//{
//PC_ODR = 0x08;
// DelayMS(30);
/// PC_ODR = 0x10;
// DelayMS(30);
//}
}
}
#pragma vector=TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void)
{
TIM2_SR1 = 0x00; // Clear UIF: Update interrupt flag
i++;
if(i>200) i=0;
}
上述代码为仍在调试的代码,定时器可以正常工作了,AD还在调试。现对定时器调试关键点说明如下:
1、头文件.// #include "iostm8s105c6.h" 要改为 #include "iostm8s103F3.h" // Very importtant
2、STM8S .h 文件中的#define STM8S105 注释掉,将#define STM8S103 定义,去掉注释。
下一篇:STM8 定时计数器2
史海拾趣
|
VS2005里面,我自己创建的类(没有通过类向导创建)怎么突然不能增加成员函数了(昨天还是可以的),增加成员变量是可以的,怎么回事啊?! VS2005里面,我自己创建的类(没有通过类向导创建)怎么突然不能增加成员函数了(昨天还是可以的),增加成员变量是可以的,怎么回事啊?!… 查看全部问答> |
|
我的开发板是北京一家公司搞的叫YC2440,和S3C2440差不多 我的电脑主板是昂达N61,没有串口和并口。买了一根USB转串口,一根PCI转并口 调式用的是WIGGER接JTAG,AXD,RO和RW配置应该没问题,但是程序一跑就一直RUNNING IMAGE,这是第一个问题,我 ...… 查看全部问答> |
|
请问VxWorks下网络上传的文件和直接拷贝的文件有什么不同吗? 我需要在目标机上放置大量的.DAT数据文件以供程序读取运行,将目标机硬盘接到主机上直接将这些文件拷贝到目标机硬盘上,然后恢复目标机即可正常运行,但是将这些文件直接通过网络ftp上传到目标机硬盘上后,却没能正常的读取这些文件。请问这可能是 ...… 查看全部问答> |
|
问一下 pdiusbd12中检查它的型号的时候,为什么要读取两次? U32 tmp; D12Cmd = 0xfd; tmp = D12Dat; tmp = tmp… 查看全部问答> |
|
帮我拿个主意!!我最近去了一家培训公司面试,面试的是HP的电话技术支持工程师 400多个人面试,最后通过的就六个人,其中有我一个!!! 通知我明天去复试,是HP亲自面试,各位说我去不去??? 最主要的是这家公司要岗前培训,有费用4800多元 ...… 查看全部问答> |
|
我在学校的项目和课程中接触过freescale的s12x单片机、51单片机和MSP430单片机。当初老师对我们说过,MSP430单片机是低功耗便携式设备的不二之选。但MSP430的稳定性不太好,在强磁场或高压复杂环 ...… 查看全部问答> |
|
最近申请了ti的样片,但是感觉自己做板子不划算,所以来论坛求块dsp2812开发板的空pcb 希望能外扩sram和flash,除了电源和地之外的引脚全部引出,最好是经过验证的,先谢谢了… 查看全部问答> |




