目录
使用DMA获取ADC数值(创建volatile uint16_t adc_value[4];数组)
GPIO
写入电平
- void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
- 例如:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
读取电平
- HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 例如:HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_2);
电平设置
- GPIO_PIN_RESET 0
- GPIO_PIN_SET 1
翻转IO口电平
- void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 例如:HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
NVIC
中断回调函数
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {}
switch选择中断线
switch(GPIO_Pin)
{
case GPIO_PIN_2:
//内容1
break;
case GPIO_PIN_3:
//内容2
break;
case GPIO_PIN_13:
//内容3
break;
}
定时器中断回调函数
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {}
UART中断回调函数
发送中断回调
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {}
接收中断回调
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {}
ADC中断回调函数
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {}
Timers
定时器开关函数
开启定时器及中断
- HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
- 例如:HAL_TIM_Base_Start_IT(&htim2);
关闭定时器及中断
- HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
- 例如:HAL_TIM_Base_Stop_IT(&htim2);
开启定时器
- HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
- 例如:HAL_TIM_Base_Start(&htim2);
关闭定时器
- HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
- 例如:HAL_TIM_Base_Stop(&htim2);
PWM开启定时器
- HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
- 例如:HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
PWM关闭定时器
- HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
- 例如:HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3);
读写定时器相关值的函数
设置比较值
- __HAL_TIM_SetCompare (__HANDLE__, __CHANNEL__, __COMPARE__)
- 例如:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,1000);
获取当前比较值
- __HAL_TIM_GetCompare (__HANDLE__, __CHANNEL__)
- 例如:__HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_3);
设置重载数值
- __HAL_TIM_SetAutoreload (__HANDLE__, __AUTORELOAD__)
- 例如:__HAL_TIM_SetAutoreload(&htim3,1000);
获取重载数值
- __HAL_TIM_GetAutoreload (__HANDLE__)
- 例如:__HAL_TIM_GetAutoreload(&htim3);
设置计数值
- __HAL_TIM_SetCounter (__HANDLE__,__COUNTER__)
- 例如:__HAL_TIM_SetCounter(&htim3,1000);
获取计数值
- __HAL_TIM_GetCounter (__HANDLE__)
- 例如:__HAL_TIM_GetCounter(&htim3);
微秒级延时函数(放在tim.c中)
开启定时器,并修改htimx
void delay_us(uint16_t us)
{
uint16_t differ = 0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim7,differ); //设定TIM7计数器起始值
HAL_TIM_Base_Start(&htim7); //启动定时器
while(differ < 0xffff-5)
{ //判断
differ = __HAL_TIM_GET_COUNTER(&htim7); //查询计数器的计数值
}
HAL_TIM_Base_Stop(&htim7);
}
UART
串口发送数据函数
- HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout)
- 例如:HAL_UART_Transmit(&huart1,(uint8_t*)"wangzenb",8,0xFFFFF);
printf格式化输出
改写printf调用的fputc函数(放在main函数前)
int fputc(int c,FILE *stream)
{
uint8_t ch[1]={c};
HAL_UART_Transmit(&huart1,ch,1,0xFFFFF);
return c;
}
调用printf
- 例如:printf("wangzenb%d\n\r",123);
串口接收数据函数
- HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- 例如:HAL_UART_Receive(&huart1,buf,3,0xFFFF);
scanf接收数据
改写scanf调用的fgetc函数(放在main函数前)
int fgetc(FILE *stream)
{
uint8_t ch[1];
HAL_UART_Receive(&huart1,ch,1,0xFFFF);
return ch[0];
}
调用scanf
- 例如:scanf("%d",&val);
利用中断的串口发送数据函数
- HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)
- 例如:HAL_UART_Transmit_IT(&huart1,(uint8_t*)"wangzenb",8);
利用中断的串口接收数据函数(使用数组应用全局变量)
- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- 例如:HAL_UART_Receive_IT(&huart1,buf,3);
ADC
ADC启动函数
- HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
- 例如:HAL_ADC_Start(&hadc1);
ADC关闭函数
- HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
- 例如:HAL_ADC_Stop(&hadc1);
ADC启动函数并打开中断
- HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc)
- 例如:HAL_ADC_Start_IT(&hadc1);
ADC关闭函数并关闭中断
- HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc)
- 例如:HAL_ADC_Stop_IT(&hadc1);
查询ADC转化完成标志(等待转换)
- HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc,uint32_t Timeout)
- HAL_ADC_PollForConversion(&hadc1,50);
获取ADC数值
- uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
- 例如:HAL_ADC_GetValue(&hadc1);
使用DMA获取ADC数值(创建volatile uint16_t adc_value[4];数组)
- HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
- 例如:HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_value,8);
RTC
读取系统时间(时分秒)
- HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
- 例如:HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
读取系统日期(年月日)
- HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
- 例如:HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
获取日期时间结构体声明
- RTC_DateTypeDef GetData; //获取日期结构体
- RTC_TimeTypeDef GetTime; //获取时间结构体
打印范例
- printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
- printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
掉电恢复解决方案
rtc.c中声明函数
- void user_CheckRtcBkup()
- {
- HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 1);
- }
修改void MX_RTC_Init(void)函数
- /* USER CODE BEGIN Check_RTC_BKUP */
- if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1)==1)
- {
- return;
- }
- /* USER CODE END Check_RTC_BKUP */