ADC采集
- CubeMX配置
比如题目要求使用R37来调节输出的占空比(14th省赛),那就需要用到ADC采集。
- 代码
double getADC(ADC_HandleTypeDef *hadc)
{
unsigned int value = 0;
//开启转换ADC并且获取值
HAL_ADC_Start(hadc);
value = HAL_ADC_GetValue(hadc);
//ADC值的转换 3.3V是电压 4096是ADC的精度为12位也就是2^12=4096
return value*3.3/4096;
}
ADC的hal库函数在 stm32g4xx_hal_adc.h
拉到最后。
输入捕获
- CubeMX配置
开启定时器某一个通道的“输入直接比较”模式。
- 代码
比如题目要求“通过PA7来测量输入信号的频率”(14th省赛)。
/* 定时器回调函数*/
uint16_t f = 0;
// 保存TIMx_CCR的值
uint32_t cclValue = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// // 保存TIMx_CCR的值
// uint32_t cclValue = 0;
// 定时器3时执行该段
if(htim->Instance == TIM3)
{
cclValue = __HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SetCounter(&htim3, 0);
f = 1000000 / cclValue;
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2); // 这里使用中断,而非轮询方法
}
}
- 定时功能
插播一下,比如题目要求“保持时间超过2s的输入信号才纳入统计”,那需要定时器来实现2s定时。
使用刚才那个定时器3,把它的内部时钟源打开。
在stm32g4xx_it.c 中找到 tim3的句柄。
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
if(sysCount[2] < 2000) // 既然tim3已经配置好了是1Hz,那就计数2k次来表示2s
sysCount[2]++;
/* USER CODE END TIM3_IRQn 1 */
}
eeprom读写(IIC通信)
EEPROM可以简单理解为是一个掉电不丢失的存储模块,相对于g431,它是一个从机,所以呢,需要用软件IIC来进行主从机的通信。
- CubeMX配置
先将官方资源包里的“i2c - hal.c”和“i2c - hal.h”复制到我们的工程目录下,可以看到里面已经对 PB6 和PB7 做好了初始化,那就将PB6、PB7配置为输出(相当于IIC通信中的SCL和SDA线)。
另外,题目要求“电压参数写入E2PROM内部地址0,频率参数写入E2PROM内部地址1”(13th国赛),根据E2PROM手册对每一位对应解读,其bit0为R/W,bit3-1为从机地址。 - 代码
/***************************************
* 函数功能:读取eeprom相应位置的值
* 函数参数:unsigned char ucAddr:读取的地址
* 函数返回值:ucRes:读取到的值
***************************************/