这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 【玩转TIMSPM0】课程2任务1:学习以及作业完成情况

共4条 1/1 1 跳转至

【玩转TIMSPM0】课程2任务1:学习以及作业完成情况

高工
2024-05-05 22:02:07     打赏

课程2属于进阶课程,在这里我们接触到第一个用到的数码管模块,这相当于一个显示单元。话不多或我们开始上课了。

第一部分

74HC595驱动的8位数码管模块的工作原理与驱动设计。

数码管我们可以理解为是8个LED组成的一个显示组合,可以显示一些基本的数字或者字母符号等等,上节课我们了解到LED可以是上拉也可以下拉,只要有电流通过就会发光,数码管根据这种情况分为共阴极或者共阳极两种。原理如下图:

1.png

共阴极是所有电流的流向,共阳极则是所有电流的流出。本次模块中用到的是两个共阳极的4位数码管组成,那么如何实现控制的呢?

2.png

上图是模块的一个示意图,我们看到其中一个74HC595控制这个8个数码管的共同的位码,而另一个则控制着每一个数码管的段码,由于595是串行转8位并行的锁存芯片,所以两个74HC595正好最多可以控制8个数码管。我们通过给对应段码高,给位码低,就可以点亮对应的数码管。

板卡的串行输入控制需要3个引脚实现,课程中使用了RGB用到的3个引脚进行串行数据的输入,及PA13(PCLK)、PA26(SCLK)、PA27(DIO)。

3.png

串行数据的通信基本上都要参考一定的时序要求,HC595需要满足如上的时序要求。

驱动的设计代码如下:

uint8_t Disp_DX[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x00};
void HC595_WriteData(uint8_t data){
    uint8_t i;
    for(i = 0;i<8;i++){
        if(data & 0x80){
            HC595_DAT_1;
        }
        else{
            HC595_DAT_0;
        }
        data <<= 1;

        HC595_CLK_0;
        HC595_CLK_1;
    }
}
void Display_Out(void){
    HC595_RCK_0;
    HC595_RCK_1;
}

void HC595_SEND_DATA(uint8_t dis_num,uint8_t dis_bit){
    HC595_WriteData(dis_num);
    HC595_WriteData(1<<dis_bit);
    Display_Out();
}
为了后续数字的显示,写了一个循环显示的函数:
void Display(uint16_t num)
{
    uint16_t num1 = 0;
    uint8_t i=0;

    num1 = num;
    if(num1 == 0)
{
        HC595_WriteData(Disp_DX[num1%10]);
        HC595_WriteData(1 << 0);

        Display_Out();

    }
    else
{
        for(i=0;!(num1 == 0);i++)
{

            HC595_WriteData(Disp_DX[num1%10]);
            HC595_WriteData(1 << i);

            Display_Out();

            num1 /= 10;

            delay_cycles(200);

        }
    }
}

第二部分

这一部分是通过课程1的按键学习与数码管的控制结合的一个展示,通过按键来循环显示数值:

if(DL_GPIO_readPins(GPIO_S2_PORT, GPIO_S2_PIN_14_PIN) == 0){
    keytmp++;
    if(keytmp > 5000){
        Dutytmp++;
        keytmp = 0;
    }
    if(Dutytmp > 9)
    Dutytmp = 0;
}
Display(Dutytmp);

通过延时采集按键状态然后修改显示的值,实现按键变化,不过这种方式的按键采集有个缺点,长时间按键会不断判断,导致显示的输不断增加,还是使用中断方式比较好。效果可以发现有连键的现象。

第三部分

定时器的使用,定时器可以说是使用非常频繁的一个功能,本次使用的TIMG通用定时器进行定时:

4.png

定时器注意的就是时钟预填装值等等,这些我们可以直接在配置文件中进行填写,而且不需要计算,直接添加定时时间就可以自动生成了:

5.png

这里需要注意,如果定时比较大,需要通过调整分频器来达到比较理想的数值。

对于定时器中断需要我们自己添加:

void TIMER_0_INST_IRQHandler(void){
    switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
        case DL_TIMER_IIDX_ZERO:
            timecnt++;
            if(timecnt >= 10){

                if(Dutytmp>0){
                    Dutytmp--;
                }
                else if(Dutytmp == 0)
                    Dutytmp = 10;

                timecnt = 0;
            }

            break;
        default:
            break;
    }
}

本部分的代码实现直接和本节课的课后作业结合实现了,10到0的循环显示,定时器定时为100ms,通过定时器进行1s间隔的实现。

通过本节课的学习主要是对数码管驱动有了全面的了解,以及定时器的使用,不过在使用的过程中发现数码管的模块存在一定的问题,通过论坛大佬们的经验传授,使用静电袋的方式实现了数码管功能的正常显示。






关键词: 玩转TIMSPM0     课程2     任务1    

专家
2024-05-06 11:23:34     打赏
2楼

参考参考!


高工
2024-05-06 14:26:19     打赏
3楼

写得好详细啊


高工
2024-05-07 15:12:51     打赏
4楼

又看了一遍!看的我都有点心动了


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]