Funny thing · 5 天前

灵动Mini-F5375-OB开发板评测(一)MindSwitch使用

  1. 新建工程:在官网下载安装好MM32F5370的MDK芯片pack包,如果用Jlink烧录调试记得也安装一下J-link packimage.png接下来建立工程,复制官方例程的Device文件夹image.png添加HAL库文件和启动文件image.pngimage.png接下来添加头文件路径image.png添加宏定义USE_STDPERIPH_DRIVER,CUSTOM_HSE_VALimage.png添加.sct文件image.png
  2. 编写代码:试用一下灵动微的特色外设MindSwitch, MindSwitch 是一个外设到外设的连接和触发矩阵,支持多个输入和输出通道,实现了灵活可配的外设间硬件互联。连接到 MindSwitch 上的典型外设包括定时器、EXTI、GPIOs、软件触发源、ADC、DAC 和比较器等。MDS像一个桥梁一样连接各个外设,接下来配置MDS连接定时器和ADC,实现定时器触发ADC采样,即TIM->MDS->ADC

    void TIM_Configure(void)
    {
    
    
     TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStruct;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    
     TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
     TIM_TimeBaseInitStruct.TIM_Prescaler         = TIM_GetTIMxClock(TIM1) / 10000 - 1;
     TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;
     TIM_TimeBaseInitStruct.TIM_Period            = 1 - 1;
     TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_Div1;
     TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00;
     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
    
     TIM_SelectOutputTrigger(TIM1, TIM_TRIGSource_Update);
     TIM_Cmd(TIM1, ENABLE);
    }
    
    void Adc_Configure()
    {
        GPIO_InitTypeDef          GPIO_InitStruct;
       RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
     GPIO_StructInit(&GPIO_InitStruct);
     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_1  | GPIO_Pin_5;
     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AIN;
     GPIO_Init(GPIOA, &GPIO_InitStruct);
     
     ADC_InitTypeDef           ADC_InitStruct;
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
       ADC_CalibrationConfig(ADC1, 0x1FE);
     ADC_StructInit(&ADC_InitStruct);
     ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
     ADC_InitStruct.ADC_Prescaler  = ADC_Prescaler_16;
     ADC_InitStruct.ADC_Mode       = ADC_Mode_Scan; //扫描每个通道进行一次转换
     ADC_InitStruct.ADC_DataAlign  = ADC_DataAlign_Right;
     ADC_Init(ADC1, &ADC_InitStruct);
    
     ADC_SampleTimeConfig(ADC1, ADC_Channel_1, ADC_SampleTime_240_5);
     ADC_SampleTimeConfig(ADC1, ADC_Channel_5, ADC_SampleTime_240_5);
    
     ADC_ChannelCmd(ADC1, ADC_Channel_1, ENABLE);
     ADC_ChannelCmd(ADC1, ADC_Channel_5, ENABLE);
    
     ADC_ExternalTrigSourceConfig(ADC1, ADC_ExtTrig_Edge_Up, ADC_ExtTrig_Shift_16); //选择外部触发源
     ADC_ExternalTrigConvCmd(ADC1, ENABLE);
     
         ADC_ClearFlag(ADC1, ADC_FLAG_EOS);
     ADC_ITConfig(ADC1, ADC_IT_EOS, ENABLE);
         
         
         NVIC_InitTypeDef                  NVIC_InitStruct;        
         NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;
     NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStruct);
         
     ADC_Cmd(ADC1, ENABLE);
     
    }
    void    MDS_Configure()
    {
     MDS_TriggerNotCLU_TypeDef MDS_TriggerNotCLU;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_MDS, ENABLE);
         
     MDS_TriggerNotCluStructInit(&MDS_TriggerNotCLU);
     MDS_TriggerNotCLU.MDS_Channel     = MDS_TriggerOutput_ADC1_EXT_TRIGGER;
     MDS_TriggerNotCLU.MDS_InputEdge   = MDS_InputEdge_Both;
     MDS_TriggerNotCLU.MDS_InputSource = MDS_TriggerSource_TIM1_TRGOUT;
     MDS_TriggerNotCluInit(&MDS_TriggerNotCLU);
     
    }
    
    void DAC_Configure(void)
    {
     DAC_InitTypeDef  DAC_InitStruct;
     GPIO_InitTypeDef GPIO_InitStruct;
    
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    
     DAC_StructInit(&DAC_InitStruct);
     DAC_InitStruct.DAC_WaveGeneration               = DAC_WaveGeneration_None;
     DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1;
     DAC_InitStruct.DAC_OutputBuffer                 = DAC_OutputBuffer_Enable;
     DAC_Init(DAC_Channel_1, &DAC_InitStruct);
    
     DAC_SetChannel1Data(DAC_Align_12b_R, 0);
     DAC_OutputCmd(DAC_Channel_1, ENABLE);
    
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    
     GPIO_StructInit(&GPIO_InitStruct);
     GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_4;
     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
     GPIO_Init(GPIOA, &GPIO_InitStruct);
    
     DAC_Cmd(DAC_Channel_1, ENABLE);
    }
    int main(void)
    {
         uint16_t Value = 0;
     PLATFORM_Init();
         TIM_Configure();
         MDS_Configure();
         Adc_Configure();
         DAC_Configure();
     while (1)
     {
               DAC_SetChannel1Data(DAC_Align_12b_R, Value);
         Value = (Value + 255) % 4096;
                 //printf("dac:%hu\n" , Value);
         PLATFORM_DelayMS(10);
     }
    }
    

    连接ADC采样脚PA1与DAC输出脚PA4,打开串口上位机查看,实现TIM定时触发ADC采样image.pngIMG_20250703_145628.jpg

推荐阅读
关注数
803
内容数
32
搭载安谋科技自研“星辰”STAR-MC1处理器,基于Armv8-M架构,专为电机控制、数字能源等实时控制应用打造
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息