找回密码
 立即注册
查看: 25|回复: 1

打卡第七集

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-28 08:56:43
已绑定手机

6

主题

4

回帖

68

积分

注册会员

积分
68
发表于 7 天前 | 显示全部楼层 |阅读模式
擎天柱学习  第七集


代码书写:

void Timer0_Init(void)                //500毫秒@24.000MHz
{
        TM0PS = 0x0F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xDC;                                //设置定时初始值
        TH0 = 0x0B;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void Timer0_Isr(void) interrupt 1                //3秒执行一次
{
        state = !state;               
       
        P20 = state;
        P21 = !state;
}

微信截图_20250415141252.png

遇到一些问题,不知道怎么去论坛也咨询了一下
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 7 天前 | 显示全部楼层
在第七集的“擎天柱学习”中,您分享了一段关于定时器初始化和中断服务程序的代码。这段代码的主要功能是通过定时器0实现一个周期性的状态切换,并控制两个IO口(P20和P21)的输出状态。以下是对代码的详细分析以及可能遇到的问题的解答。

代码分析

1. 定时器初始化函数 Timer0Init:
TM0PS = 0x0F;:设置定时器0的预分频器为0x0F。预分频器的作用是将系统时钟分频,以降低定时器的计数频率。具体分频比例需要参考芯片的数据手册。
AUXR &= 0x7F;:将AUXR寄存器的第7位清零,设置定时器0为12T模式。12T模式表示定时器时钟为系统时钟的1/12。
TMOD &= 0xF0;:清除TMOD寄存器的低4位,设置定时器0为模式1(16位定时器模式)。
TL0 = 0xDC; 和 TH0 = 0x0B;:设置定时器0的初始值。通过这两个寄存器,可以控制定时器的计数起点,从而决定定时器的溢出时间。
TF0 = 0;:清除定时器0的溢出标志位。
TR0 = 1;:启动定时器0。
ET0 = 1;:使能定时器0的中断。

2. 中断服务程序 Timer0Isr:
state = !state;:每次中断发生时,切换state的状态。state是一个全局变量,用于记录当前的状态。
P20 = state; 和 P21 = !state;:根据state的值,控制P20和P21的输出状态。当state为1时,P20输出高电平,P21输出低电平;反之亦然。

可能遇到的问题

1. 定时器溢出时间计算:
定时器的溢出时间取决于系统时钟频率、预分频器设置以及定时器的初始值。在您的代码中,系统时钟频率为24MHz,预分频器设置为0x0F,定时器初始值为0x0BDC。根据这些参数,可以计算出定时器的溢出时间。
计算公式为:溢出时间 = (65536 - 初始值)  (预分频器 + 1) / 系统时钟频率。
代入您的参数:溢出时间 = (65536 - 0x0BDC)  (0x0F + 1) / 24000000 ≈ 0.5秒。

2. 中断频率与代码逻辑:
您的代码中,中断服务程序每0.5秒执行一次,但您在注释中提到“3秒执行一次”。这可能是代码逻辑与注释不符的地方。如果需要3秒执行一次,需要调整定时器的初始值或预分频器设置。

3. IO口控制:
在中断服务程序中,您通过P20 = state;和P21 = !state;控制两个IO口的输出状态。需要注意的是,IO口的输出状态可能会受到其他代码或硬件电路的影响,建议在初始化时明确设置IO口的方向(输入或输出)。

建议与改进

1. 定时器配置优化:
如果需要3秒执行一次中断,可以调整定时器的初始值或预分频器设置。例如,将预分频器设置为更大的值,或者调整初始值以延长定时器的溢出时间。

2. 代码注释与文档:
建议在代码中添加详细的注释,说明每个寄存器的功能以及代码的逻辑。这有助于他人理解和维护代码。

3. 硬件电路检查:
如果IO口的输出状态不符合预期,建议检查硬件电路,确保IO口的连接正确,并且没有其他电路干扰。

4. 调试与测试:
在代码开发过程中,建议使用调试工具(如仿真器或逻辑分析仪)进行实时调试,观察定时器的运行状态以及IO口的输出波形,确保代码逻辑正确。

总结

您的代码通过定时器0实现了周期性的状态切换,并控制了两个IO口的输出状态。在代码实现过程中,需要注意定时器的配置、中断频率的计算以及IO口的控制逻辑。通过优化定时器配置、添加详细注释以及进行硬件电路检查,可以进一步提高代码的可靠性和可维护性。如果在开发过程中遇到问题,建议参考芯片的数据手册,并在相关技术论坛上寻求帮助。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:30 , Processed in 0.143894 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表