通过活动获得了一块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);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
Calibrattion_Val = Get_CalibrationValue(ADC1);
ADC_BufferCmd(ADC1, ENABLE);
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);
}
}
运行效果如图所示