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:
NVIC_SetPriorityGrouping函数参数
NVIC_GetPriorityGrouping函数返回值
NVIC_EnableIRQ函数参数
NVIC_GetEnableIRQ函数参数
NVIC_DisableIRQ函数参数
NVIC_GetPendingIRQ函数参数
NVIC_SetPendingIRQ函数参数
NVIC_ClearPendingIRQ函数参数
NVIC_GetActive函数参数
NVIC_SetPriority函数参数
NVIC使用示例
IIC优先级设置
- #include "headfile.h"
- int main(void)
- {
- DisableGlobalIRQ();
- board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口
- //本例程主要展示如何设置各个中断的优先级
- //本库设置的优先级分组为3(在board_init函数中进行的设置) 全为抢占式。
- //设置DMA中断优先级位1 范围0-15 越小优先级越高
- NVIC_SetPriority(DMA0_DMA16_IRQn,1);
-
- //设置PIT中断的优先级为3 范围0-15 越小优先级越高
- NVIC_SetPriority(PIT_IRQn,3);
-
- //设置C0-C15 GPIO中断的优先级为4 范围0-15 越小优先级越高
- NVIC_SetPriority(GPIO2_Combined_0_15_IRQn,4);
-
- //设置C16-C31 GPIO中断的优先级为4 范围0-15 越小优先级越高
- NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,4);
-
- //其他中断优先级设置都是使用这个函数,对于函数的第一个参数填写,
- //可以通过任意选中一个NVIC_SetPriority后面的第一个参数,然后go to过去查看,其他的IRQ号
- //所有的IRQ都定义在 MIMXRT1064.h IRQn_Type枚举中
-
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
-
-
- }
- }
复制代码 编程要点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:
OCOTP_Init函数参数
OCOTP_Deinit函数参数
OCOTP_CheckBusyStatus函数参数与返回值
OCOTP_CheckErrorStatus函数参数与返回值
OCOTP_ClearErrorStatus函数参数
OCOTP_ReloadShadowRegister函数参数
OCOTP_ReadFuseShadowRegister函数参数
OCOTP_WriteFuseShadowRegister函数参数与返回值
OCOTP_GetVersion函数参数与返回值
EFUSE使用示例
EFUSE烧写示例
- #include "headfile.h"
- #include "fsl_ocotp.h"
-
- #define EXAMPLE_OCOTP_FREQ_HZ (CLOCK_GetFreq(kCLOCK_IpgClk))
- #define EXAMPLE_OCOTP_FUSE_MAP_ADDRESS 0x06
- #define EXAMPLE_OCOTP_FUSE_WRITE_VALUE 0x18
-
- uint8 burn_success;
- uint32 fuse_value;
-
- //本例程使用须知 必看 必看 必看
-
- //注意这是不可恢复的操作,请谨慎决定
- //注意这是不可恢复的操作,请谨慎决定
- //注意这是不可恢复的操作,请谨慎决定
-
-
- //使用本例程可以直接烧写RT1064的片内保险丝
- //通过烧写保险丝之后,核心板启动时不需要使用外部的boot_cfg引脚,直接使用片内的保险丝状态来进行配置
- //通过这样的方法,避免出现因为使用了boot_cfg引脚,导致出现内核启动时配置了错误的参数导致不启动的问题。
-
- //可以通过串口助手查看提示信息以此判断是否操作成功
- //或者运行后查看burn_success变量 1:烧写成功 0:烧写失败
-
- //烧写失败的原因可能是因为已经烧写过了
-
- int main(void)
- {
- uint32 version;
-
- DisableGlobalIRQ();
- board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口
- //此处编写用户代码(例如:外设初始化代码等)
- OCOTP_Init(OCOTP, EXAMPLE_OCOTP_FREQ_HZ);
-
- version = OCOTP_GetVersion(OCOTP);
-
- PRINTF("%x\r\n",version);
-
- fuse_value = OCOTP_ReadFuseShadowRegister(OCOTP, 0x00);//读取当前保险丝的状态
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- //此处编写需要循环执行的代码
- if (0x00U == (OCOTP_LOCK_BOOT_CFG_MASK & OCOTP_ReadFuseShadowRegister(OCOTP, 0x00)))
- {
- if (kStatus_Success == OCOTP_WriteFuseShadowRegister(OCOTP, EXAMPLE_OCOTP_FUSE_MAP_ADDRESS, EXAMPLE_OCOTP_FUSE_WRITE_VALUE))
- {
- PRINTF("OCOTP Write operation success!\r\n");
- burn_success = 1;//烧写成功
- }
- else
- {
- PRINTF("OCOTP write operation failed. Access deny!\r\n");
- burn_success = 0;//烧写失败
- }
- }
- while(1);
- }
- }
复制代码 编程要点1:efuse只能将0编程为1,编程为1之后不可在修改为0。假设efuse中某一个地址的数据为0x1000,现在我们想将bit0设置为1,则我们应该写入数据0x1001而不是0x0001。
使用注意事项1:需要特别注意这是不可恢复的操作,所以请谨慎下载运行。
使用注意事项2:请勿使用本示例中的参数给非RT1064芯片的EFUSE进行编程。
本期逐飞科技“基于RT1064的智能车应用入门指导”之“NVIC模块详解与使用示例”&“EFUSE模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足及建议请及时联系“逐飞科技”:
逐飞科技__智能车③部:824575535;
AI电磁组交流群--逐飞科技:1077051054;
我们将尽快完善。感谢关注“逐飞科技”,下期再见!
文章出处:恩智浦MCU加油站
|