历史上的今天
返回首页

历史上的今天

今天是:2024年12月18日(星期三)

正在发生

2020年12月18日 | STM32 使用通用计时器实现微秒延时

2020-12-18 来源:eefocus

为了驱动ARF2496K这款芯片,做STM32上的移植,所以第一步需要解决的就是时序问题,很显然在STM32下类似于51的延时方法并不适用,自然想到了采用定时器进行定时来延时。目前使用的是查询方式进行延时。


环境: STM32F107主控,采用STLINK仿真


代码如下:


static void TIM5_Init_Query(CALC_TYPE type,uint32_t val)

{

TIM_TimeBaseInitTypeDef Tim5;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

Tim5.TIM_Period=1; //???

if(type==CALC_TYPE_S) //延时以S为单位时,时钟频率57600Hz,外部需要1250次计时

{

Tim5.TIM_Prescaler=57600-1; //预分频 72MHz / 57600= 1250Hz

}else if(type==CALC_TYPE_MS)

{

Tim5.TIM_Prescaler=2880-1; //25000Hz ,定时器计数25次为ms

}else if(type==CALC_TYPE_US)

{

Tim5.TIM_Prescaler=72-1; //1MHz ,计数1次为us

}else

{

Tim5.TIM_Prescaler=7200-1;

}

Tim5.TIM_ClockDivision=0;

Tim5.TIM_CounterMode=TIM_CounterMode_Down; //向下计数

TIM_TimeBaseInit(TIM5,&Tim5);

}

 

static void TIM5_S_CALC(uint32_t s)

{

    u16 counter=(s*1250)&0xFFFF; //前提定时器时钟为1250Hz

    TIM_Cmd(TIM5,ENABLE);

    TIM_SetCounter(TIM5,counter); //设置计数值

    

    while(counter>1)

    {

        counter=TIM_GetCounter(TIM5);

    }

    TIM_Cmd(TIM5,DISABLE);

}

 

static void TIM5_MS_CALC(uint32_t ms)

{

    u16 counter=(ms*25)&0xFFFF; 

    TIM_Cmd(TIM5,ENABLE);

    TIM_SetCounter(TIM5,counter); //设置计数值

    

    while(counter>1)

    {

        counter=TIM_GetCounter(TIM5);

    }

    TIM_Cmd(TIM5,DISABLE);

}

 

static void TIM5_US_CALC(uint32_t us)

{

    u16 counter=us&0xffff;

    TIM_Cmd(TIM5,ENABLE);

    TIM_SetCounter(TIM5,counter); //设置计数值

 

    while(counter>1)

    {

        counter=TIM_GetCounter(TIM5);

    }

    TIM_Cmd(TIM5,DISABLE);

}

 

int main()

{

    SystemInit(); //库函数 初始化系统时钟源选择,PLL等  

 

#ifdef _DEBUG

    Init_PD11();

#endif

    TIM5_Init_Query(CALC_TYPE_US);

 

    while(1)

    {

        PD11_U; //产生方波

        TIM5_US_CALC(1);   //TIM5_MS_CALC(1); 毫秒延时, TIM5_S_CALC(1); 秒级别延时 

        PD11_D;

        TIM5_US_CALC(1);

    }

}


实验数据:


延时1微秒时,略有出入,下图:

(延时1us,并不精准,这与while循环中的语句有关)

延时20微秒时,比较准确,下图:


延时1毫秒时,下图:

(差了0.2ms,也就是才延时0.9ms,可以将分频系数降低,然后延时值加大些进行改善)

延时20毫秒时,下图:


延时1秒时,下图:

毫秒延时那里修改成下面代码,基本上能精准。


Tim5.TIM_Prescaler=720-1; //100KHz ,定时器计数100次为1ms

static void TIM5_MS_CALC(uint32_t ms)

{

    u16 counter=(ms*100)&0xFFFF; //前提定时器时钟为100KHz

    TIM_Cmd(TIM5,ENABLE);

    TIM_SetCounter(TIM5,counter); //设置计数值

    

    while(counter>1)

    {

        counter=TIM_GetCounter(TIM5);

    }

    TIM_Cmd(TIM5,DISABLE);

}

推荐阅读

史海拾趣

Catalyst公司的发展小趣事

为了进一步扩大市场份额,Catalyst公司积极实施国际化战略。公司通过与国外知名企业的合作与交流,引进先进的技术和管理经验,不断提升自身的竞争力。同时,Catalyst还积极参加国际电子展会和论坛,展示公司的最新产品和技术成果,吸引了众多国际客户的关注。通过国际化战略的拓展,Catalyst成功打开了海外市场的大门,为公司的长远发展奠定了坚实的基础。

Hitachi Chemical Co America Ltd公司的发展小趣事

Catalyst公司深知品质是企业生存和发展的根本。因此,公司始终将品质管理放在首位,从原材料采购到生产加工、产品检验等各个环节都进行严格把控。公司还建立了完善的售后服务体系,确保客户在使用过程中能够得到及时、专业的技术支持。这些举措不仅提升了Catalyst产品的品质水平,也赢得了客户的信任和好评。

Equator Technologies公司的发展小趣事

随着智能手机市场的迅速崛起,Equator敏锐地捕捉到了这一市场机会。从XX年代后期开始,公司逐渐将业务重心转向手机图像处理领域。通过与手机厂商的合作,Equator成功地将其先进的视频处理技术应用于智能手机中,显著提升了手机的显示效果和用户体验。这一转型不仅为Equator带来了丰厚的回报,也进一步巩固了其在电子行业的地位。

FINTEK公司的发展小趣事

随着ASP芯片市场的成功,FINTEK公司意识到单一产品线的局限性。为了保持竞争优势并开拓新市场,公司开始多元化拓展产品线。经过市场调研和技术储备,FINTEK相继推出了数字信号处理器(DSP)、微控制器(MCU)以及射频前端模块(RF FEM)等一系列新产品。这些产品的推出不仅丰富了公司的产品线,也进一步巩固了FINTEK在半导体领域的市场地位。

Allianc公司的发展小趣事

随着公司规模的不断扩大和市场份额的增加,Allianc公司开始关注社会责任和可持续发展。公司积极参与公益事业和环保活动,努力为社会做出贡献。同时,公司还加强了对产品环保性能的研发和改进,推出了多款符合环保标准的产品。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了电子行业中一个成功公司可能经历的一些关键阶段和挑战。希望这些故事能够满足您的需求,并为您了解电子行业提供一定的参考。

台湾凯励(Carli)公司的发展小趣事

随着技术的不断成熟和市场的不断拓展,凯励公司开始在全球范围内布局。1997年,公司在广东省东莞市设立“东莞凯励电子有限公司”,进一步扩大生产规模。2002年,又在浙江省嘉兴市设立“浙江嘉兴凯励电子有限公司”,进一步完善了公司的产业布局。这些举措不仅提升了凯励公司的产能和效率,也使其能够更好地满足全球客户的需求。

问答坊 | AI 解惑

求助51转DSP

有51单片机基础的人,学习DSP应该注意什么问题? 学习DSP有哪些关键点需要注意?…

查看全部问答>

电容降压式电源

将交流市电转换为低压直流的常规方法是采用变压器降压后再整流滤波,当受体积和成本等因素的限制时,最简单实用的方法就是采用电容降压式电源。 一、电路原理 二、器件选择 1.电路设计时,应先测定负载电流的准确值,然后参考示例来选择降 ...…

查看全部问答>

传感器:与IC趋于集成MEMS遍及高端

汽车电子控制系统的“正常运转”离不开传感器的保驾护航,通过传感器可将各种诸如压力、流量、位置、高度、距离、速度、转速、温度等信号传递到动力系统、安全系统等控制单元,达到汽车正常驾驶的目的。正因为需要各种不同的信号,因而汽车传感器种 ...…

查看全部问答>

求助:这个程序,ORG有错?

这个程序,用软件调试, 显示第五行的  “org     000bh           ;定时器T0中断入口地址”这一段  ORG错~~~~  请教一下各位,该怎么修改? org&nb ...…

查看全部问答>

开关电源原理

开关电源工作原理 通过高频开关技术将输入的较高的交流电压(AC)转换为PC电脑工作所需要的较低的直流电压(DC) 开关电源的中心思想:用提高工作频率等手段来提高电源的功率密度,进而达到减少变压器的体积和重量的目的。采用开关变换的显著优点是 ...…

查看全部问答>

2.0.3版固件里面的SDIO例程,4BIT方式有朋友试验成功的吗?

    刚刚开始玩VE的芯片,跑SDIO的那个例程,SD卡都可以正常初始化并设置成4BIT方式,可是读的时候始终返回SD_RX_OVERRUN,怎么试都是一样的结果。    例程是直接拿来用的,都没有改过,连线的接法也 ...…

查看全部问答>

请教stm8的eeprom数据初始化问题

大家好!      弱弱想问一下,我在EEPROM中定义了(volatile uchar Total_Distance[3] @ 0x004000;)在主程序中也能进行读写,但是我不知道怎么初始化Total_Distance[3]为一个固定的数,麻烦各位大侠赐教!…

查看全部问答>

TPD16-B有人知道什么东东么?求高人解答。

TPD16-B有人知道什么东东么?求高人解答。网上找了很长时间不知道是什么东西。求高手指点一下。…

查看全部问答>

谁有 这个 430Boost_CapTouchMediaPad.exe lunchpad 这个程序

430Boost_CapTouchMediaPad.exe   我下了一个  好像没用  谁有   共享一个给我用一个啊    win7用不了吗?谁家解答一下   帮个忙    感激不尽!!!…

查看全部问答>

基于单片机的红外遥控接收电路设计

我想做一个基于单片机的红外遥控器的接收电路;求大侠思路啊!!…

查看全部问答>