[ARM入门] 28035通过定时器0控制LED灯

[复制链接]
 楼主| 鸡蛋鸭蛋荷包蛋 发表于 2023-3-1 15:50 | 显示全部楼层 |阅读模式
使用28035的定时器0来控制LED0亮灭。
首先,根据官方例程文件来配置GPIO3(LED).
  1. void LED_Init(void)
  2. {
  3.    EALLOW;

  4.    GpioCtrlRegs.GPAMUX1.bit.LED1 = 0; //设置为通用GPIO功能
  5.    GpioCtrlRegs.GPADIR.bit.LED1 = 1; //设置GPIO方向为输出
  6.    GpioCtrlRegs.GPAPUD.bit.LED1 = 0; //设置GPIO上拉

  7.    GpioDataRegs.GPASET.bit.LED1 = 1; //设置GPIO上拉

  8.    EDIS;
  9. }
然后根据官方例程配置TIME0,官方例程不全,需补充中断部分。
官方TIME0配置--例程内容
  1. //指向定时器0的寄存器地址
  2.         CpuTimer0.RegsAddr = &CpuTimer0Regs;
  3.         //设置定时器0的周期寄存器值
  4.         CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
  5.         //设置定时器预定标计数器值为0
  6.         CpuTimer0Regs.TPR.all  = 0;
  7.         CpuTimer0Regs.TPRH.all = 0;
  8.         //确保定时器0为停止状态
  9.         CpuTimer0Regs.TCR.bit.TSS = 1;
  10.         //重载使能
  11.         CpuTimer0Regs.TCR.bit.TRB = 1;
  12.         // Reset interrupt counters:
  13.         CpuTimer0.InterruptCount = 0;
配置完成后调用配置函数完成寄存器数据写入。
  1. ConfigCpuTimer(&CpuTimer0, Freq, Period);
补充TIME0中断部分。
根据手册可知,TIME0对应中断向量表INT0的第七个小中断,故配置如下:
  1. EALLOW;
  2.         SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
  3.         EDIS;

  4.         //设置定时器0的中断入口地址为中断向量表的INT0
  5.         EALLOW;
  6.         PieVectTable.TINT0 = &TIM0_IRQn;
  7.         EDIS;
  1. //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
  2.         IER |= M_INT1;
  3.         PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
中断配置部分和TIME0功能配置部分组合起来
  1. //定时器0初始化函数
  2. //Freq:CPU时钟频率(60MHz)
  3. //Period:定时周期值,单位us
  4. void TIM0_Init(float Freq, float Period)
  5. {
  6.         EALLOW;
  7.         SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
  8.         EDIS;

  9.         //设置定时器0的中断入口地址为中断向量表的INT0
  10.         EALLOW;
  11.         PieVectTable.TINT0 = &TIM0_IRQn;
  12.         EDIS;

  13.         //指向定时器0的寄存器地址
  14.         CpuTimer0.RegsAddr = &CpuTimer0Regs;
  15.         //设置定时器0的周期寄存器值
  16.         CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
  17.         //设置定时器预定标计数器值为0
  18.         CpuTimer0Regs.TPR.all  = 0;
  19.         CpuTimer0Regs.TPRH.all = 0;
  20.         //确保定时器0为停止状态
  21.         CpuTimer0Regs.TCR.bit.TSS = 1;
  22.         //重载使能
  23.         CpuTimer0Regs.TCR.bit.TRB = 1;
  24.         // Reset interrupt counters:
  25.         CpuTimer0.InterruptCount = 0;

  26.         ConfigCpuTimer(&CpuTimer0, Freq, Period);

  27.         //开始定时器功能
  28.         CpuTimer0Regs.TCR.bit.TSS=0;
  29.         //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
  30.         IER |= M_INT1;
  31.         PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
  32.         //使能总中断 仿真调试中断
  33.         EINT;
  34.         ERTM;
  35. }
编写TIME0中断函数
  1. interrupt void TIM0_IRQn(void)
  2. {
  3.         EALLOW;
  4.         PieCtrlRegs.PIEACK.bit.ACK1=1; //清除中断标志位
  5.         EDIS;
  6. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

[url=home.php?mod=space&uid=3530892]@happy2025[/url] :你好,我之前也是这个问题,后来发现少了一条指令,就是CpuTimer0Regs.TCR.bit.TIE=1;如果没有这个的话也是产生不了中断的  发表于 2025-3-3 16:16
你好楼主,我想请问一下在主函数中应该编写什么代码呢?我的定时器与您的相同,主函数中也调用了,但是并未实现LED闪烁,期待您的回答  发表于 2025-3-3 11:40
呐咯密密 发表于 2023-3-28 16:18 | 显示全部楼层
整的不错,继续加油
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

85

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

12

主题

85

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部