历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | 【ARM裸板】定时器中断示例与分析

2020-03-06 来源:eefocus

1.定时器结构分析

 1.每来一个CLK,TCNTn减1

 2.当TCNTn == TCMPn时,(可以把对应的PWM引脚翻转)

TCNTn与TCMPn的值来自寄存器TCNPBn与TCMTBn

 3.TCNTn继续减1,当TCNTn == 0时,可以产生中断(PWM引脚再次翻转)

 4.TCNTn == 0时,可自动加载初值

在这里插入图片描述

2.初始化

1.设置时钟源

2.设置初值

3.加载初值,启动Timer

4.设置为自动加载

5.中断相关

在这里插入图片描述

需要设置:1.Prescaler,2.MUX(Divider),3.TCMPB0(不是PWM测试,因此该不需要设置),4.TCNTB0,5.TCON0

在这里插入图片描述

2.1 设置时钟源

在这里插入图片描述

由上公式:

 设置Prescaler

 设置MUX

/* 1.设置timer0的时钟

* Timer CLK = PCLK / {prescaler value+1} / {divider value}

*               50000000/(99+1)/(16) = 31250

*/

TCFG0 = 99;    //Prescaler = 99,用于timer0,timer1

TCFG1 &= ~0xFF;

TCFG1 |= 3;    //MUX0=1/16(即是 divider value)


2.2 设置初值

//2.设置timer0的初值

TCNTB0 = 15625;  //0.5s中断一次(15625/31250=0.5s)

在这里插入图片描述

2.3 手动加载初值

手动加载初值至TCNT0与TCMT0,启动timer0

置1

TCON |= (1<<1);//Update from (TCNTB0 & TCMPB0) to (TCNT0 & TCMT0)

在这里插入图片描述

2.4 清除手动加载

清零

TCON &= ~(1<<1);


2.5 设置自动重装载并启动

TCON |= (1<<0) | (1<<3);//bit0:start,  bit3:auto reload

在这里插入图片描述

3. 构造函数指针

把每一个中断的处理函数放置在指针数组中,当发生中断时,通过判断中断号,调用对应的函数即可

3.1 定义

定义函数指针,指针的变量名为irq_func

    typedef void (*irq_func)(int);


    irq_func irq_array[32];//定义存放函数指针数组(即:数组中存放的是函数指针)


typedef void(*Func)(void)的用途,先来看下其基本用法

typedef void (*func)(void);  

void myfunc(void);  

func pfun = myfunc;/*赋值*/  

pfun();/*调用*/  


3.2 由来

typedef void(*Func)(void);的由来

其实这样的形式声明函数指针是有"问题"的。如果仿照变量类型声明,声明函数指针似乎应该这样:

typedef void(*)()  variable;


但是c标准的创建者没有这样做,不知道为什么,而选择了这样的声明:


typedef void(*variable)();


C编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。


3.4 注册函数

/* 注册中断

 * param:1.中断号,2.中断服务函数

*/

void register_irq(int irq,irq_func fp)

{

irq_array[irq] = fp;//将fp指向的函数地址 存放在arr中


INTMSK &= (1<}


eg:

register_irq(10, timer0_irq);

1

3.5 调用函数

/* 中断处理函数

 *

*/

void handle_irq_c(void)

{

/* 1.分辨中断源 */

int bit = INTOFFSET;//判断谁在请求中断


/* 2.调用对应的处理函数 */

irq_array[bit](bit); //irq_array存放的是函数指针,加一个()即表示调用该函数


/* 3.清中断 :从源头开始清 */

SRCPND = (1< INTPND = (1<}

推荐阅读

史海拾趣

AIRPAX公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

Amphion Semiconductor Ltd公司的发展小趣事

近年来,随着数字化技术的快速发展,AIRPAX也开始积极探索数字化转型之路。公司加大了对智能化、自动化生产线的投入,提高了生产效率和质量。同时,AIRPAX还积极利用大数据、云计算等先进技术,对客户需求和市场趋势进行深入分析,以更好地满足客户需求并推动创新发展。

这些故事只是AIRPAX发展历程中的一部分,它们展示了AIRPAX如何在技术、市场、环保和创新等多个方面取得了显著成就。然而,随着电子行业的不断发展和竞争的加剧,AIRPAX仍需继续努力,以保持其在电气保护领域的领先地位。

HSMC公司的发展小趣事

HSMC的发展不仅为公司自身带来了显著的经济效益,也为当地社会和经济发展做出了重要贡献。项目全面达产后,预计可实现年产值600亿元,利税60亿元,直接带动就业人口3000人。此外,HSMC还通过技术创新和产业升级,带动了上下游产业链的发展,促进了整个电子行业的繁荣与进步。

以上五个故事共同描绘了HSMC在电子行业中的崛起与发展历程。作为一家充满活力和创新精神的企业,HSMC正以其独特的优势和不懈的努力,向着成为全球领先CIDM晶圆厂的目标不断迈进。

Fractus公司的发展小趣事

为了加速技术的商业化进程,Fractus积极寻求与全球领先企业的合作。自2000年以来,公司陆续与多家知名手机厂商、电信运营商以及设备制造商建立了战略合作关系。这些合作不仅为Fractus带来了稳定的收入来源,也促进了其技术的广泛应用和持续改进。同时,Fractus还通过签订全球许可协议和建立战略伙伴关系,进一步拓展了其业务范围和市场影响力。

Cicoil公司的发展小趣事

随着公司业务的不断拓展,Cicoil开始与大型计算机制造商IBM展开合作。他们为IBM的大型计算机提供定制的扁平电缆解决方案,以其出色的性能和可靠性赢得了IBM的信任。这一合作不仅提升了Cicoil在业界的地位,也为其带来了稳定的业务增长和更广阔的发展空间。

Beckhoff Automation GmbH公司的发展小趣事

品质是电子行业的生命线,BCD Semi公司深知这一点。因此,公司始终将品质管理放在首位,建立了完善的品质管理体系和质量控制流程。公司从原材料采购、生产制造到产品出厂,每一个环节都进行严格的质量把控,确保产品的高品质和稳定性。同时,BCD Semi还不断引进先进的生产设备和技术,优化生产流程,提高生产效率,为客户提供更优质的产品和服务。

问答坊 | AI 解惑

关于TO-220封装的可控硅引脚之间的距离的困惑

TO-220封装的可控硅,比如:BTA12,很普遍的可控硅,A1,A2两个引脚间的中心距离是2.4—2.7mm,边缘的距离大约是1.8mm,焊到PCB上后,两个焊盘的边缘的距离就更小了,可能只有1mm.当可控硅不导通的时候,两个引脚之间的电压差应该是220V,看到很多讲电气间隙和 ...…

查看全部问答>

电子密码锁 程序问题

呵呵,小弟我作毕业设计遇到难题了,附件是原理图,用protues打开就可以了, 我程序部分很很有点问题。 各位大侠就帮帮忙啊 这个4*4键盘扫描程序在下面,这个搞好了,我的毕业设计论文基本就搞好了,等待 :\'( SAOMIAO:     ...…

查看全部问答>

几种PWM控制方法i

采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦 ...…

查看全部问答>

完全安装 eVC++ 4.0 后,程序无法 Build

小弟今天完全安装了 eVC++ 4.0 ,建立了一个基于对话框的MFC工程,Build 时居然出错: ----------Configuration: SetTime - Win32 (WCE ARMV4) Debug------- Compiling resources... Error executing rc.exe. SetTime.exe - 1 error(s), 0 warn ...…

查看全部问答>

有北京准备换工作的朋友吗?

我们公司招聘 WM /WINCE C++ ,symbian开发, 请发简历xdwang@mogenesis.com …

查看全部问答>

GC.Collect()

GC.Collect()的作用…

查看全部问答>

模拟电路故障解决

模拟电路故障解决…

查看全部问答>

F2812烧写问题

F2812烧写问题 请问烧写flash时出现这样的错误是怎么回事?怎么解决?谢谢! flash api error #22 the erase operation failed the erase step first fail address=0x003f6000 程序下到RAM里可运行 四块新板子,有四块出现同样的问题,一块完 ...…

查看全部问答>

DC/DC 24V转5V

有个项目 24V 转 5V  打算用 Ti 的TPS54331  但是客户要求 这个模块要耐3kv AC , 请教这一点如何才能做的到。…

查看全部问答>

有没有做过6437连接高清网络摄像头的?

车载设备要求体积小并且要进行图像处理,不想用工控机。摄像头距离驾驶室较远,直线距离五米以上,线长估计要7~8米,计划采用IP摄像头,有没有做过这种项目的朋友?…

查看全部问答>