查看: 5884|回复: 2

RT1052——11.XBAR复用输出呼吸灯

[复制链接]
  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1111

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7576

    热心会员

    最后登录
    2024-4-17
    发表于 2018-11-4 18:49:07 | 显示全部楼层 |阅读模式
    这个RT1052最让我感觉有特色有两个部分,一个是 FlexIO ,另一个就是今天的主角 XBAR 了。
    这个 XBAR 是一个网络式的连接线路。首先可以让我们的引脚配置更加灵活多变,另一方面,可以拿它来玩很多很秀的操作。可以把它理解为一根导线,可以自由的连接各个模块的输入和输出
    先来个框图

    QQ截图20181104165558.png

    先上一个简单的程序
    引脚初始化部分
    1. IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_02_XBAR1_INOUT16,0);         //复用为XBAR功能
    2. IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_02_XBAR1_INOUT16, IOMUXC_SW_PAD_CTL_PAD_SRE(0)  //转换速率慢
    3.                                                         |IOMUXC_SW_PAD_CTL_PAD_DSE(6)    //驱动强度R0/6
    4.                                                         |IOMUXC_SW_PAD_CTL_PAD_SPEED(2)  //速度100MHz
    5.                                                         |IOMUXC_SW_PAD_CTL_PAD_ODE(0)    //关闭开漏
    6.                                                         |IOMUXC_SW_PAD_CTL_PAD_PKE(1)    //拉/保持器开启
    7.                                                         |IOMUXC_SW_PAD_CTL_PAD_PUE(0)    //选择为保持
    8.                                                         |IOMUXC_SW_PAD_CTL_PAD_PUS(0)    //100K下拉
    9.                                                         |IOMUXC_SW_PAD_CTL_PAD_HYS(0));  //关闭滞回        
    复制代码
    主程序部分
    1. #include "fsl_device_registers.h"
    2. #include "fsl_debug_console.h"
    3. #include "board.h"

    4. #include "pin_mux.h"
    5. #include "clock_config.h"

    6. #include "fsl_lpuart.h"
    7. #include "fsl_pwm.h"
    8. #include "fsl_xbara.h"

    9. #include "delay.h"

    10. #define DISPLAY_CLK(name) (PRINTF("%s:%d\r\n",#name,CLOCK_GetFreq(name)))    //打印对应时钟

    11. int main(void)
    12. {
    13.     BOARD_ConfigMPU();
    14.     BOARD_InitPins();
    15.     BOARD_BootClockRUN();
    16.     BOARD_InitDebugConsole();        
    17.         
    18.     XBARA_Init(XBARA1);      //初始化XBARA1
    19.     IOMUXC_GPR->GPR6|=1<<28; //设置IO16为输出模式
    20.     XBARA_SetSignalsConnection(XBARA1,kXBARA1_InputLogicLow,kXBARA1_OutputIomuxXbarInout16);        

    21.     while (1)
    22.     {
    23.     }
    24. }
    复制代码

    引脚初始化部分,把底板上小灯的引脚配置为了 IOMUXC_GPIO_AD_B0_02_XBAR1_INOUT16 功能(小灯引脚位置可见飞凌RT1052——4.GPIO与外部中断https://www.nxpic.org.cn/module/foru ... 161&fromuid=3469866(出处: 恩智浦技术社区))

    然后主程序,先配置XBARA_Init(XBARA1);没啥好说的,XBAR一共XBARA1、XBARB2、XBARB3三块,这里只用到了XBARA1

    然后IOMUXC_GPR->GPR6|=1<<28;就比较有意思了

    QQ截图20181104175936.png

    由图可以看到配置第28位为1的话,就能使IOMUXC_XBAR_DIR_SEL_16为输出模式(只有4—19一共16个IOMUXC_XBAR(我还找了好久的0 1 2 3,发现并没有。。))。

    最后看一下XBARA_SetSignalsConnection函数
    void XBARA_SetSignalsConnection(XBARA_Type *base, xbar_input_signal_t input, xbar_output_signal_t output);

    一共由三个参数,第一个是模块名,第二个是输入的信号,第三个是输出的信号
    xbar_input_signal_t(部分)
    QQ截图20181104180124.png
    xbar_output_signal_t(部分)
    QQ截图20181104180144.png

    这次选择的输入为kXBARA1_InputLogicLow(低电平信号,就是相当于接了个低电平进去),输出是 kXBARA1_OutputIomuxXbarInout16 引脚。

    实验结果,可以看到小灯亮了(该灯为反逻辑)

    IMG20181104182205.jpg

    然后修改一下程序
    XBARA_SetSignalsConnection(XBARA1,kXBARA1_InputLogicHigh,kXBARA1_OutputIomuxXbarInout16);        
    输入一个高电平
    实验结果,可以看到小灯灭了

    IMG20181104182257.jpg

    接下来,上呼吸灯的程序
    1. #include "fsl_device_registers.h"
    2. #include "fsl_debug_console.h"
    3. #include "board.h"

    4. #include "pin_mux.h"
    5. #include "clock_config.h"

    6. #include "fsl_lpuart.h"
    7. #include "fsl_pwm.h"
    8. #include "fsl_xbara.h"

    9. #include "delay.h"

    10. #define DISPLAY_CLK(name) (PRINTF("%s:%d\r\n",#name,CLOCK_GetFreq(name)))    //打印对应时钟

    11. int main(void)
    12. {
    13.     uint8_t pwmVal = 0;        
    14.     pwm_signal_param_t pwmSignal[1];
    15.     pwm_config_t pwmConfig;

    16.     BOARD_ConfigMPU();
    17.     BOARD_InitPins();
    18.     BOARD_BootClockRUN();
    19.     BOARD_InitDebugConsole();
    20.     delay_init();     //初始化延时
    21.         
    22.         
    23.     DISPLAY_CLK(kCLOCK_AhbClk);
    24.     DISPLAY_CLK(kCLOCK_IpgClk);        
    25.         
    26.         
    27.     XBARA_Init(XBARA1);      //初始化XBARA1
    28.     IOMUXC_GPR->GPR6|=1<<28; //设置IO16为输出模式
    29.     /* PWM1PWM4OUTTrig01作为输入,IO16作为输出 */
    30.     XBARA_SetSignalsConnection(XBARA1,kXBARA1_InputFlexpwm1Pwm4OutTrig01,kXBARA1_OutputIomuxXbarInout16);
    31.     PWM1->SM[3].TCTRL |= PWM_TCTRL_PWAOT0_MASK; //配置PWM1通道3PWMA映射到Flexpwm1Pwm4OutTrig01
    32.         
    33.         
    34.     PWM1->SM[3].DISMAP[0]=0;
    35.     PWM_GetDefaultConfig(&pwmConfig);                     //快速配置
    36.     pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; //全周期更新
    37.     pwmConfig.pairOperation = kPWM_Independent;      //PWMA,PWMB各自独立输出
    38.     PWM_Init(PWM1, kPWM_Module_3, &pwmConfig);       //初始化PWM1的通道3
    39.     pwmSignal[0].pwmChannel = kPWM_PwmA;             //配置PWMA
    40.     pwmSignal[0].level = kPWM_HighTrue;              //有效电平为高
    41.     pwmSignal[0].dutyCyclePercent = 50;              //占空比50%        
    42.     /*配置PWM1 通道3 有符号中心对齐 PWM信号频率为1000Hz*/
    43.     PWM_SetupPwm(PWM1, kPWM_Module_3, pwmSignal, 1, kPWM_SignedCenterAligned, 1000, CLOCK_GetFreq(kCLOCK_IpgClk));        
    44.     PWM_SetPwmLdok(PWM1, kPWM_Control_Module_3, true);    //更新有关设置
    45.     PWM_StartTimer(PWM1, kPWM_Control_Module_3);              //开始计数
    46.         

    47.     while (1)
    48.     {
    49.         delay_ms(10);
    50.         pwmVal = pwmVal + 1;
    51.         if (pwmVal >= 200)
    52.         {
    53.             pwmVal = 0;
    54.         }
    55.                
    56.         PWM_UpdatePwmDutycycle(PWM1,kPWM_Module_3, kPWM_PwmA, kPWM_SignedCenterAligned, ((pwmVal>100)?(200-pwmVal):pwmVal)); //更新占空比               
    57.         PWM_SetPwmLdok(PWM1, kPWM_Control_Module_3, true);    //更新有关设置
    58.     }
    59. }
    复制代码
    关键就是
            XBARA_SetSignalsConnection(XBARA1,kXBARA1_InputFlexpwm1Pwm4OutTrig01,kXBARA1_OutputIomuxXbarInout16);
            PWM1->SM[3].TCTRL |= PWM_TCTRL_PWAOT0_MASK; //配置PWM1通道3PWMA映射到Flexpwm1Pwm4OutTrig01

    这两句,其他和刚才提到的和上一个贴子(飞凌RT1052——10.FlexPWM输出https://www.nxpic.org.cn/module/foru ... 263&fromuid=3469866(出处: 恩智浦技术社区))程序一模一样(其实在输出部分也有一定的改动,见while(1)里面,不过寄存器的配置没有改动,就不提了,有兴趣可以看一下)

    首先是kXBARA1_InputFlexpwm1Pwm4OutTrig01

    QQ截图20181104182913.png

    可以看出来这是 FLEXPWM1_PWM4_OUT_TRIG0_1(吐槽,之前标注通道的方式是0~3,到这里突然变成1~4了,害我懵逼了好久)
    很好理解这是PWM1模块的通道3,可这TRIG0_1是个什么玩意,我们知道,PWM的一个通道又分为PWMA、PWMB、PWMX三个输出的。
    查了一下,发现了一个这玩意

    QQ截图20181104183800.png

    这里,就可以设置TRIG0_1的来源与产生方式,这次要用的就是利用PWMA通道去映射到IO16,所以,我们只需要把PWAOT0置1就好了。(还能设置PWMB或者自己配置比较输出,就不提了)
    PWM1->SM[3].TCTRL |= PWM_TCTRL_PWAOT0_MASK; 就好了。实验效果见附件吧(话说每次发视频都好麻烦,有没有简单一点的办法。。。。。。再吐槽一次,那个绿灯真是太亮了)

    最后附上工程和效果
      MDK版本:5.22
      pack:NXP.MIMXRT1052_DFP.10.0.1.pack
      下载算法:飞凌嵌入式提供的 MIMXRT_QSPIFLASH.FLM
      启动方式:spi flash启动  
      下载方式:STlink


    11.xbar.zip (1.46 MB, 下载次数: 43)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-7 10:12
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    5

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    2019-1-23
    发表于 2019-1-3 16:13:27 | 显示全部楼层
    感谢分享,学习啦
    垃圾啊熟练度附近啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    14
    最后登录
    2021-8-18
    发表于 2021-8-18 13:36:54 | 显示全部楼层
    写的很详细, 但是偶还是看不懂
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-19 16:28 , Processed in 0.137501 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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