在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753015
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32032
- 最后登录
- 2024-4-26
|
为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
i.MX RT1064核心板
在分享主题之前,先说说继上次发布的开源库之后,逐飞科技RT1064开源库又更新了哪些东西。本次开源库更新了如下4部分内容:
1、fuse烧写例程
经常会有用户遇到上电后没法执行程序,查看内核指示灯又是没有问题的。对于这个问题我们首先要知道RT上电后是会根据boot_config_pin进行参数配置,如果boot_config_pin电平设置不对会导致参数配置不正确,那么在我们使用了boot_config_pin相关引脚之后,或者外部添加了上拉都有可能会导致出现这个问题,那么我们又想使用boot_config_pin又不想遇到这样的问题,该怎么办呢?这个时候就可以通过烧写efuse使得RT上电之后参数配置通过fuse来进行配置,从而彻底避免了这个问题。不过需要注意的事,烧写fuse之后,就不能再更改回去了。
2、USB CDC例程
大家经常反映串口速度太慢了,那么是否有更好的数据传输方式呢?当然是有的,RT单片机支持高速USB,我们可以将USB虚拟成串口来进行使用,在PC端的使用和普通的串口无异,非常简单,硬件连接也非常简单,使用逐飞RT1064核心板的用户可直接使用板载的TypeC接口和PC端的USB口连接即可,优点是连线通用性高,且速度极快(初步测试可稳定到10MB/s)。
3、FATFS文件系统例程
对于需要存储较大数据的用户,经常会需要用到SD卡,本次更新也带来了SD相关的例程,方便用户直接使用。
4、解决PIT定时器通道1无法使用的问题
上次开源库中,PIT通道1无法正常使用,经过仔细查找,发现是因为RT1064上电之后默认将通道1的级联位设置为1,从而导致无法使用,解决办法是在初始化时将级联位设置为0即可,这个问题可能是单片机内部ROM API使用了这个定时器之后没有对其进行复位造成的。
以上更新已发布到码云,链接如下:
http://gitee.com/seekfree/RT1064_Library
接下来进入本次分享的主题:
GPIO模块详解与使用示例 GPIO功能
GPIO (General-purpose input/output)是通用输入输出端口,主要功能如下:
输出模式:可以通过程序控制端口的电平状态(低电平或者高电平),以实现控制外部模块或者传递信息。
输入模式:可以获取端口状态,用于接收外部模块发送的数字信息。
中断模式:可以对引脚上的上升沿、下降沿、低电平、高电平、上升沿和下降沿,这五种情况进行中断响应。
GPIO库函数
操作GPIO的函数列表如下:
gpio_init()函数参数:
gpio_set()函数参数:
gpio_get()函数参数:
gpio_dir()函数参数:
gpio_toggle()函数参数:
gpio_interrupt_init()函数参数:
gpio_interrupt_init()函数参数:
GET_GPIO_FLAG宏函数参数:
CLEAR_GPIO_FLAG宏函数参数:
GPIO使用示例
GPIO输出模式(核心板LED闪烁)
#include "headfile.h" //包含头文件
int main(void)
{
DisableGlobalIRQ();
board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
//初始化B9端口 输出模式 初始化之后输出低电平 使用默认引脚配置GPIO_PIN_CONFIG
gpio_init(B9,GPO,0,GPIO_PIN_CONFIG);
EnableGlobalIRQ(0);
while(1)
{
gpio_set(B9,1); //熄灭核心板LED
systick_delay_ms(100); //延时100ms
gpio_set(B9,0); //点亮核心板LED
systick_delay_ms(100); //延时100ms
}
}
编程要点1:在使用GPIO时,务必在while(1)之前对端口进行初始化,然后再进行其他的操作。
编程要点2:在初始化GPIO时,最后一个参数可以直接使用GPIO_PIN_CONFIG宏定义参数,不需要自己去选择很多个配置参数然后相或,提高易用性。
GPIO输入模式
#include "headfile.h" // 包含头文件
uint8 pin_status;
int main(void)
{
DisableGlobalIRQ();
board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
//初始化D0端口 输入模式 使用默认引脚配置GPIO_PIN_CONFIG
gpio_init(D0,GPI,0,GPIO_PIN_CONFIG);
EnableGlobalIRQ(0);
while(1)
{
pin_status = gpio_get(D0);//获取D0端口电平状态
//可以直接通过IAR或者MDK的在线调试窗口查看pin_status变量的值
//0:低电平 1:高电平
//D0端口接地时为低电平
//D0端口内部设置了上拉电阻,因此悬空时为高电平
}
}
编程要点:与上一个示例相同。
GPIO中断模式
#include "headfile.h" //包含头文件
uint32 gpio_interrup_test;
void GPIO3_Combined_0_15_IRQHandler(void)//D0-D15端口中断函数
{
if(GET_GPIO_FLAG(D0)) //判断是否为D0引脚触发中断
{
CLEAR_GPIO_FLAG(D0); //清除D0触发的中断标志位
gpio_interrup_test++; //测试变量
}
}
int main(void)
{
DisableGlobalIRQ();
board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
//D0端口初始化为中断模式 上升沿中断 使用宏定义的引脚配置参数
gpio_interrupt_init(D0,RISING,GPIO_INT_CONFIG);
//D0端口初始化为输出模式 初始化之后为低电平 使用宏定义的引脚配置参数
gpio_init(D1,GPO,0,GPIO_PIN_CONFIG);
EnableGlobalIRQ(0); //打开总中断
while(1)
{
gpio_toggle(D1); //D1端口电平翻转
systick_delay_ms(500);
//D1引脚每0.5S翻转一次电平
//因此D1引脚每1S会产生一个上升沿信号
//将D0 D1使用杜邦线连接起来之后
//gpio_interrup_test变量一秒钟加一次
}
}
编程要点1:在使用GPIO中断时,务必在while(1)之前对端口进行初始化。
编程要点2:在初始化GPIO中断时,最后一个参数可以直接使用GPIO_INT_CONFIG宏定义参数,不需要自己去选择很多个配置参数然后相或,提高易用性。请注意这里与GPIO输出、输入的宏定义不一样。
编程要点3:进入中断之后我们应该使用GET_GPIO_FLAG函数判断中断是哪个引脚触发的,然后在使用CLEAR_GPIO_FLAG函数清除对应中断标志位,如果不清除标志位则会反复进入中断。
编程要点4:中断函数名称定义,D0引脚的中断函数为GPIO3_Combined_0_15_IRQHandler,其中GPIO3表示的是D端口,0_15表示的是D0-D15端口所请求的中断都是执行的GPIO3_Combined_0_15_IRQHandler中断函数。详细对应关系如下表:
编程要点5:对于刚接触单片机不久的童鞋来说,对于中断可能有一个疑问,我程序里面并没有调用,为啥中断函数会被运行,中断函数会被运行的原因是因为,当中断被触发之后,由MCU内部硬件从中断向量表中加载函数地址到PC指针,从而跳转到中断函数,因此中断函数得以运行,这一切都是硬件自动的在工作,因此不需要用户调用中断函数。
本期“逐飞科技RT1064开源库之GPIO详解”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足、或对库有什么建议请及时联系逐飞科技!我们将尽快完善。
PS:通过QQ群联系我们更方便,也方便大家讨论交流,QQ群技术交流平台(逐飞科技__智能车③部:824575535),也可与管理员私信,保障该开源库有问题时可以及时得到解决。然后再分享给各位使用,形成良性循环。
接下来我们会分章节详细介绍,分享多个模块的使用。感谢关注“逐飞科技”,我们将持续更新“基于RT1064的智能车应用入门指导”的开发分享,下期再见!
作者:范兵@逐飞科技 文章出处:恩智浦MCU加油站
|
-
|