1.DMA+ADC
uint16_t ADC[4]={0};//定义变量
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)(ADC),1);//1表示1路adc
2.IC频率捕获
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
cc1_value_2 = __HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SetCounter(&htim2,0);
f40 = 1000000/cc1_value_2;
}
3.DMA+IDLE 中断接收不定长数据
定义初始化
uint8_t buffer[100]={0};
HAL_UART_Receive_DMA(&huart1,buffer,100);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
重定向
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return ch;
}
重写中断服务函数
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)//获取空闲中断标志位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1);//停止DMA
uint8_t len=100-__HAL_DMA_GET_COUNTER(huart1.hdmarx);//获取长度
for(int i=0;i<len;i++)
{
//printf("%c",buffer[i]);//向串口打印接收到的数据
}
HAL_UART_Receive_DMA(&huart1,buffer,0xff);
}
}
接收到的数据已经存入buffe[]数组
4.RTC
RTC_DateTypeDef GetData;
RTC_TimeTypeDef GetTime;
sprintf(data, " TIME:%02d:%02d:%02d ",2022 + GetData.Year, GetData.Month, GetData.Date+19);
sprintf(buf, " TIME:%02d:%02d:%02d ",GetTime.Hours+17, GetTime.Minutes+54, GetTime.Seconds);
5.PWM输出
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,500);