请选择 进入手机版 | 继续访问电脑版
查看: 2966|回复: 0

i.MX RT1064函数库:NVIC模块和EFUSE模块

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
    发表于 2020-9-17 10:10:40 | 显示全部楼层 |阅读模式
    i.MX RT1064函数库:NVIC模块和EFUSE模块


    为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
    本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
    点此回顾往期内容:
    GPIO详解
    FAST GPIO模块详解与使用示例
    ADC模块和QTIMER模块
    PIT模块详解与使用示例
    UART模块详解与使用示例

    PWM和CACHE模块的使用

    I2C模块和SPI模块的使用




    各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天分享NVIC和EFUSE两个模块的使用,主要讲解如何通过逐飞RT1064函数库来便捷的实现使用这两个模块进行通信。感谢恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。接下来进入我们今天分享的主题----“NVIC模块详解与使用示例”&“EFUSE模块详解与使用示例”:

    NVIC模块详解与使用示例


    1. NVIC功能
    NVIC(Nested Vectored Interrupt Controller)是嵌套向量中断控制器,可以设置中断优先级分组、中断开关、中断优先级、挂起中断的设置与清除等。


    2. NVIC库函数
    以下函数均位于com_cm7.c和com_cm7.h:
    1.png
    NVIC_SetPriorityGrouping函数参数
    2.png
    NVIC_GetPriorityGrouping函数返回值
    3.png
    NVIC_EnableIRQ函数参数
    4.png
    NVIC_GetEnableIRQ函数参数
    5.png
    NVIC_DisableIRQ函数参数
    6.png
    NVIC_GetPendingIRQ函数参数
    7.png
    NVIC_SetPendingIRQ函数参数
    8.png
    NVIC_ClearPendingIRQ函数参数
    9.png
    NVIC_GetActive函数参数
    10.png
    NVIC_SetPriority函数参数
    11.png
    NVIC使用示例



    IIC优先级设置
    1. #include "headfile.h"

    2. int main(void)
    3. {
    4.     DisableGlobalIRQ();
    5.     board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口

    6.     //本例程主要展示如何设置各个中断的优先级
    7.     //本库设置的优先级分组为3(在board_init函数中进行的设置) 全为抢占式。

    8.     //设置DMA中断优先级位1   范围0-15 越小优先级越高  
    9.     NVIC_SetPriority(DMA0_DMA16_IRQn,1);
    10.       
    11.     //设置PIT中断的优先级为3 范围0-15 越小优先级越高
    12.     NVIC_SetPriority(PIT_IRQn,3);
    13.       
    14.     //设置C0-C15  GPIO中断的优先级为4 范围0-15 越小优先级越高
    15.     NVIC_SetPriority(GPIO2_Combined_0_15_IRQn,4);
    16.       
    17.     //设置C16-C31 GPIO中断的优先级为4 范围0-15 越小优先级越高
    18.     NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,4);
    19.       
    20.     //其他中断优先级设置都是使用这个函数,对于函数的第一个参数填写,
    21.     //可以通过任意选中一个NVIC_SetPriority后面的第一个参数,然后go to过去查看,其他的IRQ号
    22.     //所有的IRQ都定义在 MIMXRT1064.h IRQn_Type枚举中
    23.       
    24.     //总中断最后开启
    25.     EnableGlobalIRQ(0);
    26.     while (1)
    27.     {
    28.          
    29.          
    30.     }
    31. }
    复制代码
    编程要点1:库默认将中断优先级分组设置为3,全为抢占式。
    编程要点2:查看其他中断编号可以将程序编译后,任意选中一个IRQ编号右击并跳转过去即可查看。

    EFUSE模块详解与使用示例


    1. EFUSE功能


    EFUSE是一次性编程的存储器,使用I.MX RT片内的OCOTP(On-Chip OTP Controller)进行编程,需要特别注意的是每一位只能被编程一次(从0变为1),编程之后不可恢复但可以被多次访问。在I.MX RT启动的过程中需要配置一些参数,默认的情况下次上电的过程中读取boot_cfg_pin相关引脚的状态来配置参数,但是在实际使用时经常会遇到boot_cfg_pin连接了外设导致引脚电平变化从而出现配置错误导致无法运行程序,我们可以通过编程EFUSE模块,使得单片机上电时直接从EFUSE读取配置信息,通过这样的方式我们可以彻底解除boot_cfg_pin相关引脚的使用限制。


    2. EFUSE库函数


    以下函数位于fsl_ocotp.c和fsl_ocotp.h:
    14.png
    OCOTP_Init函数参数
    15.png
    OCOTP_Deinit函数参数
    16.png
    OCOTP_CheckBusyStatus函数参数与返回值
    17.png
    OCOTP_CheckErrorStatus函数参数与返回值
    18.png
    OCOTP_ClearErrorStatus函数参数
    19.png
    OCOTP_ReloadShadowRegister函数参数
    20.png
    OCOTP_ReadFuseShadowRegister函数参数
    21.png
    OCOTP_WriteFuseShadowRegister函数参数与返回值
    22.png
    OCOTP_GetVersion函数参数与返回值
    23.png
    EFUSE使用示例



    EFUSE烧写示例
    1. #include "headfile.h"
    2. #include "fsl_ocotp.h"
    3.   
    4. #define EXAMPLE_OCOTP_FREQ_HZ (CLOCK_GetFreq(kCLOCK_IpgClk))
    5. #define EXAMPLE_OCOTP_FUSE_MAP_ADDRESS 0x06
    6. #define EXAMPLE_OCOTP_FUSE_WRITE_VALUE 0x18
    7.   
    8. uint8  burn_success;
    9. uint32 fuse_value;
    10.   
    11. //本例程使用须知   必看  必看  必看
    12.   
    13. //注意这是不可恢复的操作,请谨慎决定
    14. //注意这是不可恢复的操作,请谨慎决定
    15. //注意这是不可恢复的操作,请谨慎决定
    16.   
    17.   
    18. //使用本例程可以直接烧写RT1064的片内保险丝
    19. //通过烧写保险丝之后,核心板启动时不需要使用外部的boot_cfg引脚,直接使用片内的保险丝状态来进行配置
    20. //通过这样的方法,避免出现因为使用了boot_cfg引脚,导致出现内核启动时配置了错误的参数导致不启动的问题。
    21.   
    22. //可以通过串口助手查看提示信息以此判断是否操作成功
    23. //或者运行后查看burn_success变量     1:烧写成功   0:烧写失败
    24.   
    25. //烧写失败的原因可能是因为已经烧写过了
    26.   
    27. int main(void)
    28. {
    29.     uint32 version;
    30.       
    31.     DisableGlobalIRQ();
    32.     board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口

    33.     //此处编写用户代码(例如:外设初始化代码等)
    34.     OCOTP_Init(OCOTP, EXAMPLE_OCOTP_FREQ_HZ);
    35.       
    36.     version = OCOTP_GetVersion(OCOTP);
    37.       
    38.     PRINTF("%x\r\n",version);
    39.       
    40.     fuse_value = OCOTP_ReadFuseShadowRegister(OCOTP, 0x00);//读取当前保险丝的状态
    41.     //总中断最后开启
    42.     EnableGlobalIRQ(0);
    43.     while (1)
    44.     {
    45.         //此处编写需要循环执行的代码
    46.         if (0x00U == (OCOTP_LOCK_BOOT_CFG_MASK & OCOTP_ReadFuseShadowRegister(OCOTP, 0x00)))
    47.         {
    48.             if (kStatus_Success == OCOTP_WriteFuseShadowRegister(OCOTP, EXAMPLE_OCOTP_FUSE_MAP_ADDRESS, EXAMPLE_OCOTP_FUSE_WRITE_VALUE))
    49.             {
    50.                 PRINTF("OCOTP Write operation success!\r\n");
    51.                 burn_success = 1;//烧写成功
    52.             }
    53.             else
    54.             {
    55.                 PRINTF("OCOTP write operation failed. Access deny!\r\n");
    56.                 burn_success = 0;//烧写失败
    57.             }
    58.         }
    59.         while(1);
    60.     }
    61. }
    复制代码
    编程要点1:efuse只能将0编程为1,编程为1之后不可在修改为0。假设efuse中某一个地址的数据为0x1000,现在我们想将bit0设置为1,则我们应该写入数据0x1001而不是0x0001。
    使用注意事项1:需要特别注意这是不可恢复的操作,所以请谨慎下载运行。
    使用注意事项2:请勿使用本示例中的参数给非RT1064芯片的EFUSE进行编程。

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


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

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-3-29 07:20 , Processed in 0.133537 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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