通过活动获得了一块CH32V307EVT开发板,最高主频为 120Mhz,该开发板芯片为 CH32V307VCT6。 主板 - CH32V307EVT 1.主控MCU :CH32V307VCT6 2.SDI&UART 接口 :用于下载、仿真调试,需跳线选择是否使用板载WCH-Link 3.LED :通过J3 插针连接主控MCU的IO口进行控制 4.WCH-Link MCU :实现WCH-Link 功能的MCU 5.按键 S1 :复位按键,用于外部手动复位主控MCU 6.开关 S3 :用于切断或连接外部5V 供电或USB供电 7.USB type-C接口P7 :连接主芯片USB2.0全速通信接口 8.USB接口P6:连接主芯片USB2.0高速通信接口 9.稳压芯片U1 :用于实现将5V 电压转成芯片可用的3.3V 电源电压 10.Download 接口J1 :当J1跳线短接时,可用于实现WCH-Link固件更新 11.WCH-Link 接口 :用于连接PC 和WCH-Link功能模块 12.MCU I/O 口 : 主控MCU 的I/O 引出接口 13.USER 按键S2 :通过J3 插针连接主控 MCU的IO口进行按键控制 14.WCH-Link 指示灯:包括D1、D2和D3三个LED灯,指示WCH-Link运行状态 15.网口:主芯片的网络通讯接口 16.ARDUINO 接口:方便连接ARDUINO接口的开发板 板载的资源还是很丰富的,常见的外设这上边都有,板上自带了一个温度传感器,可以用于监视板上的运行温度。 通过产看手册可以知道,温度传感器连接在ADC_IN16通道上。
使用片上温度传感器检测芯片运行温度的流程如下: ADC外设初始化和校正代码如下: void ADC_Function_Init(void){ ADC_InitTypeDef ADC_InitStructure={0}; GPIO_InitTypeDef GPIO_InitStructure={0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); RCC_ADCCLKConfig(RCC_PCLK2_Div8); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_BufferCmd(ADC1, DISABLE); //disable buffer ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); Calibrattion_Val = Get_CalibrationValue(ADC1); ADC_BufferCmd(ADC1, ENABLE); //enable buffer ADC_TempSensorVrefintCmd(ENABLE);}获取ADC值得代码如下, u16 Get_ADC_Val(u8 ch){ u16 val; ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); val = ADC_GetConversionValue(ADC1); return val;}转换为温度值的代码如下: u16 Get_ConversionVal(s16 val){ if((val+Calibrattion_Val)<0) return 0; if((Calibrattion_Val+val)>4095||val==4095) return 4095; return (val+Calibrattion_Val);}通过串口打印ADC采样值和温度值的代码如下: int main(void){ u16 ADC_val; s32 val_mv; SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() ); ADC_Function_Init(); printf("CalibrattionValue:%d\n", Calibrattion_Val); while(1) { ADC_val = Get_ADC_Average( ADC_Channel_TempSensor, 10 ); Delay_Ms(500); ADC_val = Get_ConversionVal(ADC_val); printf( "ADC-Val:%04d\r\n", ADC_val); val_mv = (ADC_val*3300/4096); printf("mv-T-%d,%0d\n",val_mv ,TempSensor_Volt_To_Temper(val_mv)); Delay_Ms(2); }}运行效果如图所示
|