- 新建工程:在官网下载安装好MM32F5370的MDK芯片pack包,如果用Jlink烧录调试记得也安装一下J-link pack
接下来建立工程,复制官方例程的Device文件夹
添加HAL库文件和启动文件
接下来添加头文件路径
添加宏定义USE_STDPERIPH_DRIVER,CUSTOM_HSE_VAL
添加.sct文件
编写代码:试用一下灵动微的特色外设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采样