在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753018
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32035
- 最后登录
- 2024-4-26
|
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:
pwm_init函数参数
pwm_duty函数参数
pwm_freq函数参数 PWM使用示例
PWM输出信号
- #include "headfile.h"
-
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU时钟 调试串口
- //初始化PWM1 MODULE3 的通道B 引脚为D1 频率50hz
- //占空比为 百分之100*5000/PWM_DUTY_MAX
- //PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000
- //每一个通道只能有一个引脚输出PWM
- pwm_init(PWM1_MODULE3_CHB_D1 , 50, 5000);
-
- EnableGlobalIRQ(0);
-
- //使用示波器查看波形,D1引脚输出频率为50HZ,占空比为4%
-
- while(1)
- {
- //更改占空比为 百分之100*2000/PWM_DUTY_MAX
- //PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000
- pwm_duty(PWM1_MODULE3_CHB_D1,2000);
-
- systick_delay_ms(100);
- }
- }
复制代码 编程要点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:
以下函数位于fsl_cache.c和fsl_cache.h:
L1CACHE_InvalidateDCacheByRange函数参数
L1CACHE_CleanDCacheByRange函数参数
L1CACHE_CleanInvalidateDCacheByRange函数参数
CACHE使用示例
CACHE基本操作
- #include "headfile.h"
-
- #define NUM 50
- uint8 tset[NUM]; //定义一个测试数组
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU时钟 调试串口
- L1CACHE_EnableICache(); //使能指令缓存
- SCB_EnableICache(); //使能指令缓存 与上面功能一样
- L1CACHE_DisableICache(); //禁用指令缓存
- SCB_DisableICache(); //禁用指令缓存 与上面功能一样
- L1CACHE_EnableDCache(); //使能数据缓存
- SCB_EnableDCache(); //使能数据缓存 与上面功能一样
- L1CACHE_DisableDCache(); //禁用数据缓存
- SCB_DisableDCache(); //禁用数据缓存 与上面功能一样
- L1CACHE_InvalidateICache();//使指令缓存数据无效
- L1CACHE_InvalidateDCache();//使数据缓存数据无效
- L1CACHE_CleanDCache(); //清除数据缓存
- L1CACHE_CleanInvalidateDCache();//清除并无效数据缓存
- L1CACHE_InvalidateDCacheByRange(tset,NUM);//无效test数组在缓存中的数据
- L1CACHE_CleanDCacheByRange(tset,NUM); //清除test数组在缓存中的数据
- L1CACHE_CleanInvalidateDCacheByRange(tset,NUM);//清除并无效test数组在缓存中的数据
- EnableGlobalIRQ(0);
- while(1)
- {
- systick_delay_ms(100);
- }
- }
复制代码 编程要点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加油站
|
|