• XBAR复用输出呼吸灯


    这个RT1052最让我感觉有特色有两个部分,一个是 FlexIO ,另一个就是今天的主角 XBAR 了。
    这个 XBAR 是一个网络式的连接线路。首先可以让我们的引脚配置更加灵活多变,另一方面,可以拿它来玩很多很秀的操作。可以把它理解为一根导线,可以自由的连接各个模块的输入和输出
    先来个框图

    <ignore_js_op>

    先上一个简单的程序
    引脚初始化部分
    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;就比较有意思了

    <ignore_js_op>

    由图可以看到配置第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(部分)
    <ignore_js_op>
    xbar_output_signal_t(部分)


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

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

            

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

          

    接下来,上呼吸灯的程序
    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

    <ignore_js_op>

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

     
    这里,就可以设置TRIG0_1的来源与产生方式,这次要用的就是利用PWMA通道去映射到IO16,所以,我们只需要把PWAOT0置1就好了。(还能设置PWMB或者自己配置比较输出,就不提了)
    PWM1->SM[3].TCTRL |= PWM_TCTRL_PWAOT0_MASK; 就好了。

    在用FLEXPWM2映射到PWMX上时,注意

    PWM2->SM[3].VAL0 = (PWM2->SM[3].VAL1)/4;
    PWM2->OUTEN |= ((uint16_t)1U << 3);

    这两句话

  • 相关阅读:
    C# HTTP系列9 GET与POST示例
    [译]Android Studio 3.6 新特性概览
    mysql error 1290 hy000:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statemen' 解决方案
    mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案
    Windows+Apache2.4.10+PHP7.0+MySQL5.6.21安装
    php版本的选择
    PHP,Mysql根据经纬度计算距离并排序
    windows无法启动MySQL服务 错误1067
    PHP MYSQL 搜索周边坐标,并计算两个点之间的距离
    html5获取用户当前的地理位置,即经纬度。
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/16379783.html
Copyright © 2020-2023  润新知