用C写一个支持国民技术的N32G452VBL7的程序,功能描述如下:基准电压2.5V;PA2是USB3的输出电压采样,有效值0-45V;PA3是USB3电流采样,有效值是0-100A;
时间: 2023-05-29 11:05:20 浏览: 112
#include "N32G452xx.h"
#define VREF 2.5
#define VMAX 45
#define IMAX 100
int main(void)
{
// 初始化PA2和PA3为模拟输入
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk;
// 使能ADC时钟
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
// ADC初始化
ADC1->CR = ADC_CR_ADEN; // 使能ADC
while(!(ADC1->ISR & ADC_ISR_ADRDY)); // 等待ADC准备好
ADC1->CFGR1 |= ADC_CFGR1_RES_1; // 设置ADC分辨率为12位
ADC1->SMPR |= ADC_SMPR_SMP_0 | ADC_SMPR_SMP_1 | ADC_SMPR_SMP_2; // 设置采样时间为239.5个ADC时钟周期
while(1)
{
// 读取PA2的电压值
ADC1->CHSELR = ADC_CHSELR_CHSEL2; // 选择通道2
ADC1->CR |= ADC_CR_ADSTART; // 启动ADC转换
while(!(ADC1->ISR & ADC_ISR_EOC)); // 等待转换完成
uint16_t voltage = ADC1->DR; // 读取转换结果
float v = voltage * VREF / 4096; // 将ADC值转换为电压值
if(v > VMAX) v = VMAX; // 限制电压最大值
// 输出电压值
printf("USB3 output voltage: %.2fV\n", v);
// 读取PA3的电流值
ADC1->CHSELR = ADC_CHSELR_CHSEL3; // 选择通道3
ADC1->CR |= ADC_CR_ADSTART; // 启动ADC转换
while(!(ADC1->ISR & ADC_ISR_EOC)); // 等待转换完成
uint16_t current = ADC1->DR; // 读取转换结果
float i = current * VREF / 4096 / 0.01; // 将ADC值转换为电流值
if(i > IMAX) i = IMAX; // 限制电流最大值
// 输出电流值
printf("USB3 current: %.2fA\n", i);
}
}