查看: 3665|回复: 0

i.MX RT1064函数库:PWM和CACHE模块的使用

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32035
    最后登录
    2024-4-26
    发表于 2020-7-13 13:09:07 | 显示全部楼层 |阅读模式
    i.MX RT1064函数库:PWM和CACHE模块的使用为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
    本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
    点此回顾往期内容:
    GPIO详解
    FAST GPIO模块详解与使用示例
    ADC模块和QTIMER模块
    PIT模块详解与使用示例
    UART模块详解与使用示例


    各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来啦!今天分享PWM和CACHE模块的使用,感谢来自恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。接下来进入我们今天分享的主题----“PWM模块详解与使用示例”&“CACHE模块详解与使用示例”:
    PWM模块详解
    与使用示例


    1. PWM功能


    PWM(Pulse Width Modulator)主要的功能是可以输出指定频率以及宽度的脉冲信号。通常PWM信号我们可用于控制舵机、电机转速、LED亮度等场合。


    2. PWM库函数



    以下函数均位于zf_pwm.c和zf_pwm.h:
    1.png
    pwm_init函数参数
    2.png
    pwm_duty函数参数
    3.png
    pwm_freq函数参数
    PWM使用示例


    PWM输出信号
    1. #include "headfile.h"
    2.   
    3. int main(void)
    4. {
    5.     DisableGlobalIRQ();
    6.     board_init();   //务必保留,本函数用于初始化MPU时钟 调试串口

    7.     //初始化PWM1 MODULE3 的通道B 引脚为D1 频率50hz
    8.     //占空比为 百分之100*5000/PWM_DUTY_MAX
    9.     //PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000
    10.     //每一个通道只能有一个引脚输出PWM
    11.     pwm_init(PWM1_MODULE3_CHB_D1 , 50, 5000);
    12.   
    13.     EnableGlobalIRQ(0);
    14.       
    15.     //使用示波器查看波形,D1引脚输出频率为50HZ,占空比为4%  
    16.   
    17.     while(1)
    18.     {
    19.         //更改占空比为  百分之100*2000/PWM_DUTY_MAX
    20.         //PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000  
    21.         pwm_duty(PWM1_MODULE3_CHB_D1,2000);
    22.          
    23.         systick_delay_ms(100);
    24.     }
    25. }
    复制代码
    编程要点1:PWM_DUTY_MAX为最大占空比值的宏定义,在fsl_pwm.h文件中,默认为50000,可以根据自己的需求进行更改。当PWM_DUTY_MAX的值定义超过65535之后,并不会提高PWM占空比设置的精度。因为PWM计数的寄存器是16位的。
    编程要点2:RT1064有四个PWM模块,每个模块有四个子模块,每个子模块有2个通道,每个通道只能有一个引脚输出PWM,在初始化时根据选择的引脚确定。
    CACHE模块详解
    与使用示例


    1. CACHE功能


    CACHE(缓存)主要作用是减少CPU读取主存时等待的时间。


    缓存的存在主要原因是因为CPU与主存储器之间速度差异巨大,如果没有缓存的存在,CPU直接访问速度很慢的主存储器,则会导致等待时间较长,从而导致整体执行效率下降。不把主存储器做成与缓存一样的速度,是因为那样价格可能会非常的昂贵。所以采用一个容量较小但是速度极高的缓存来提前加载数据,以减少CPU等待时间,并且价格相比没有缓存也贵不了多少。


    i.MX RT1064有32KB DCACHE和32KB ICACHE,ICACHE 是指令缓存,当CPU加载指令时会首先从ICACHE中加载,如果ICACHE中没有所需指令再从ROM中去读取指令。DCACHE是数据缓存,当我们读取变量的数据时,首先会尝试从DCACHE中获取数据,如果DCACHE中有该变量则直接从DCACHE中读取,如果DCACHE中没有再从RAM中去读取数据。


    2. CACHE库函数


    以下函数位于core_cm7.c和core_cm7.h:
    4.png
    以下函数位于fsl_cache.c和fsl_cache.h:
    5.png
    L1CACHE_InvalidateDCacheByRange函数参数
    6.png
    L1CACHE_CleanDCacheByRange函数参数
    7.png

    L1CACHE_CleanInvalidateDCacheByRange函数参数
    8.png
    CACHE使用示例



    CACHE基本操作
    1. #include "headfile.h"
    2.   
    3. #define NUM 50
    4. uint8 tset[NUM];    //定义一个测试数组  
    5. int main(void)
    6. {
    7.     DisableGlobalIRQ();
    8.     board_init();   //务必保留,本函数用于初始化MPU时钟 调试串口  

    9.     L1CACHE_EnableICache();    //使能指令缓存  
    10.     SCB_EnableICache();        //使能指令缓存 与上面功能一样  

    11.     L1CACHE_DisableICache();   //禁用指令缓存  
    12.     SCB_DisableICache();       //禁用指令缓存 与上面功能一样  

    13.     L1CACHE_EnableDCache();    //使能数据缓存  
    14.     SCB_EnableDCache();        //使能数据缓存 与上面功能一样  

    15.     L1CACHE_DisableDCache();   //禁用数据缓存  
    16.     SCB_DisableDCache();       //禁用数据缓存 与上面功能一样  

    17.     L1CACHE_InvalidateICache();//使指令缓存数据无效  

    18.     L1CACHE_InvalidateDCache();//使数据缓存数据无效  
    19.     L1CACHE_CleanDCache();     //清除数据缓存  
    20.     L1CACHE_CleanInvalidateDCache();//清除并无效数据缓存  
    21.     L1CACHE_InvalidateDCacheByRange(tset,NUM);//无效test数组在缓存中的数据  
    22.     L1CACHE_CleanDCacheByRange(tset,NUM);     //清除test数组在缓存中的数据  
    23.     L1CACHE_CleanInvalidateDCacheByRange(tset,NUM);//清除并无效test数组在缓存中的数据  

    24.     EnableGlobalIRQ(0);

    25.     while(1)
    26.     {
    27.         systick_delay_ms(100);
    28.     }
    29. }
    复制代码
    编程要点1:L1CACHE开头的函数与SCB开头的函数仅仅是来自不同文件,SCB来自内核文件,L1CACHE来自SDK的底层文件,功能是一样的。
    编程要点2:通常我们都不需要操作CACHE,在这里仅举例一个比较典型的使用案例,需要了解更多可以查找关于CACHE一致性问题。当在使用DMA将数据传输到RAM时,必然会发生CACHE中的数据与RAM中的数据是不一致的,数据写入动作是由DMA完成的,因此CPU并不知道RAM中的数据已经改变,如果我们程序直接访问数据则会读取到CACHE中旧的数据,导致后续的计算结果出现错误。笔者的处理方法是在DMA完成中断里面添加L1CACHE_CleanInvalidateDCacheByRange函数清理指定地址与范围的缓存即可。例如逐飞RT1064开源库里面的总钻风摄像头与凌瞳摄像头的中断函数都有添加。

    本期逐飞科技“基于RT1064的智能车应用入门指导”之“PWM模块详解与使用示例”&“CACHE模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足及建议请及时联系“逐飞科技”:
    逐飞科技__智能车③部:824575535;
    AI电磁组交流群--逐飞科技:1077051054;
    我们将尽快完善。感谢关注“逐飞科技”,下期再见!




    文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-28 05:29 , Processed in 0.115155 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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