一、RTC
1、配置RTC(实时时钟)
2、获取实时时钟
/* 两个存放时间的结构体 */
RTC_DateTypeDef Y_M_D_Date;
RTC_TimeTypeDef H_M_S_Time;
/* 获取时间的函数(以二进制数据) */
if(HAL_RTC_GetDate(&hrtc,&Y_M_D_Date,RTC_FORMAT_BIN)){}
if(HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_FORMAT_BIN)){}
HAL_RTC_GetDate、HAL_RTC_GetTime 函数返回HAL_OK
RTC_TimeTypeDef、RTC_DateTypeDef 系统定义
二、ADC
1、ADC采集模块的硬件设计
G431拥有2
个
ADC
转换器,
ADC1
有
14
的外部通道
+4
个内部通道,
ADC2
有
16
个外部通道
+2
个内部通
道,转换精度
12
位
ADC1
的通道
11
通过
PB12
与电位器
R38
相连,检测范围
0~3.3V
ADC2
的通道
15
通过
PB15
与电位器
R37
相连,检测范围
0~3.3V
2、配置
IN15/IN11为single-ended:选择通道
ContinuousConvMode = ENABLE;
保证持续输出
DMAContinuousRequests = ENABLE;
ADC
转换是一件比较耗时的任务,实际开发中还是使用
DMA
方式比较好
DMA设置circular,传输设为word
DMA中断和ADC中断;勾选ADC中断,同等优先级
3、数模转换代码
ADC工作原理:逐次逼近法,目的是计算待测模拟电压的数字编码。
G431的ADC存在12位的输入通道,可以得出ADC的分辨率为12位,可以量化的范围为0~4095。
通过HAL_ADC_GetValue()得到待测电压的编码电压,如果用其/4095*3.3则等于原来的待测电压
(1)、普通获取
float get_adc2 ( void ){uint32_t temp = 0 ;//采样 10 次for ( uint8_t i = 0 ; i < 10 ; i ++ ){HAL_ADC_Start ( & hadc2 );if ( HAL_ADC_PollForConversion ( & hadc2 , 100 ) == HAL_OK ){temp += HAL_ADC_GetValue ( & hadc2 );}}temp = temp / 10 ; // 取平均值return temp * 3.3 / 4095 ;}
(2)、DMA直接获取
uint32_t ADC1_value[30];//存放编码电压值
主函数中
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC1_value,30);//开启ADC中断
主循环中调用
//ADC转换函数
void get_adc1(void)
{
uint32_t temp=0;
//采样30次
for(uint8_t i=0;i<30;i++)
{
temp += ADC1_value[i];
}
sprintf((char *)text," adc1= %1.4f ",
(double)temp/30*3.3/4096);//取平均值,转为模拟电压
LCD_DisplayStringLine(Line2, (uint8_t *)text);
}