1462|0

6802

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

TMS320F28335——IO控制/定时计操作 [复制链接]

一、实现GPIO控制

1.硬件连接

 

  

从电路原理图上看来,LED灯是接在GPIO34 上的。

2.IO设置

  2.1设置功能

  GPXMUX1/2:功能选择寄存器  

  GPXMUX1/2    每组 IO 一般有 32 个 IO 口可以配置。GPXMUX1 对应每组的低 16 个 IO 口,GPXMUX2 对应高 16 个 IO 口 。

  这里设置的是GPIO34   所以在 GPBMUX1中 

  所以向  GPBMUX1 的bit5:4  写入0设置为普通IO。(默认设置 )

  2.2:设置IO方向

  方向控制寄存器 GPXDIR:如果对应的位为 1 则配置为输出,否则则配置为输入。 

  代码如下:

  

   EALLOW;
   GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
   GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
   EDIS;
  关于  EALLOW、EDIS说明:

  DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位,在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1的C6位,来防止杂散代码或指针破坏寄存器内容。
  到此关于GPIO的配置就完成了。

3.控制IO输出电平

  置位寄存器:置位寄存器 GPXSET:如果对应的位为 1 则将对应的 IO 口拉高(输出高电平)。     GpioDataRegs.GPBSET.bit.GPIO34 = 1;//设置PGIO34 输出高电平

  清零寄存器:强制拉低管脚 GPXCLEAR:如果对应的位为 1 则将对应的 IO 口拉低(输出低电平)。 GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;//设置GPIO34输出高平

  输出翻转寄存器:输出状态翻转寄存器 GPXTOGGLE:如果 GPXTOGGLE 的某位为 1 则将相应的 IO 口输出状态进行翻转。                                                                GpioDataRegs.GPBTOGGLE.bit.GPIO34= 1;//设置PGIO34输出翻转电平

 二、使用定时器实现闪烁LED

   1.定时器设置

    关于定时器的设置  主要是设置CPUTIMER_VARS  结构体中的参数:

    

struct CPUTIMER_VARS {
   volatile struct  CPUTIMER_REGS  *RegsAddr;//定时器 相关寄存器
   Uint32    InterruptCount;    //用作定时器中断次数统计
   float   CPUFreqInMHz;       //存放频率 单位MHZ
   float   PeriodInUSec;      //中断的计数值 ,到了产生中断。
};
复制代码
struct CPUTIMER_REGS {
   union TIM_GROUP TIM;   // Timer counter register  定时器计数寄存器
   union PRD_GROUP PRD;   // Period register         定时器周期寄存器  
   union TCR_REG   TCR;   // Timer control register  定时器控制寄存器
   Uint16          rsvd1; // reserved                保留
   union TPR_REG   TPR;   // Timer pre-scale low         
   union TPRH_REG  TPRH;  // Timer pre-scale high
};
复制代码
关于定时器配置源码如下:

  

复制代码
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
    Uint32  temp;

    // Initialize timer period:
    Timer->CPUFreqInMHz = Freq;
    Timer->PeriodInUSec = Period;
    temp = (long) (Freq * Period);
    Timer->RegsAddr->PRD.all = temp;

    // Set pre-scale counter to divide by 1 (SYSCLKOUT):
    Timer->RegsAddr->TPR.all  = 0;
    Timer->RegsAddr->TPRH.all  = 0;

    // Initialize timer control register:
    Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer
    Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer
    Timer->RegsAddr->TCR.bit.SOFT = 1;
    Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run
    Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt

    // Reset interrupt counter:
    Timer->InterruptCount = 0;
}
复制代码
    用户设置:

   

  ConfigCpuTimer(&CpuTimer0, 150, 1000000);//使用定时器0  ,时钟频率为150MHZ,计数值 到1M  。也就是说这样设置是产生一个一秒的中断
    定时器中断处理函数设置:PIE_VECT_TABLE 中断向量表。在DSP2833x_PieVect.h中定义

    

PieVectTable.TINT0 = &cpu_timer0_isr;//往中断矢量表中填写一个指针。当定时时间到了就跳转到 ,当前指针指向的函数去执行代码。
  定时器0中断在中断向量表中的组1

 2.在定时器中使用GPIO翻转寄存器GPXTOGGLE  实现LED闪烁

  

 

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表