文章目录
【HAL库STM32学习】
GPIO操作
GPIO口设置
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //翻转电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET); //设置引脚电平高低
GPIO口中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* 判断哪个引脚触发了中断 */
switch(GPIO_Pin)
{
case GPIO_PIN_2:
/* 处理GPIO2发生的中断 */
//点亮LED
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
break;
case GPIO_PIN_3:
/* 处理GPIO3发生的中断 */
//熄灭LED
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
}
UART串口
串口查询模式
UART_HandleTypeDef huart1; //设置句柄
if(HAL_OK == HAL_UART_Receive(&huart1, (uint8_t*)recv_buf, 12,
0xFFFF))
{
//将接收到的数据发送
HAL_UART_Transmit(&huart1, (uint8_t*)recv_buf, 12,
0xFFFF);
}
串口中断模式
HAL_UART_RxCpltCallback//串口中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* 判断是哪个串口触发的中断 */
if(huart ->Instance == USART1)
{
//将接收到的数据发送
HAL_UART_Transmit_IT(huart, (uint8_t*)recv_buf, 13);
//重新使能串口接收中断
HAL_UART_Receive_IT(huart, (uint8_t*)recv_buf, 13);
}
}
UART_DMA模式
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)dat, sizeof(dat));
//使用DMA发送数据(配置TX)
HAL_UART_Receive_DMA(&huart1, recv_buf, 13);
//使用DMA接收数据(配置RX)
注意:不能同时用DMA发送和接收数据,会报错
如果开启DMA循环模式则可以理解成使能
UART中printf
#if 1
#include <stdio.h>
int fputc(int ch, FILE *stream)
{
/* 堵塞判断串口是否发送完成 */
while((USART1->SR & 0X40) == 0);
/* 串口发送完成,将该字符发送 */
USART1->DR = (uint8_t) ch;
return ch;
}
#endif
//在usart.c文件中添加此代码即可
定时器
计算时间公式:(重装载值+1)*(预分频系数+1)/时钟频率
高级定时器TIME1,TIME8
通用定时器 TIME2-TIME5,TIME9-TIME14
基本定时器 TIME6 TIME7
其中高级定时器以及TIME9-TIME11的时钟是来自APB2
定时器中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance == htim2.Instance)
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}//中断回调函数,所有TIM中断都会回调这个函数
HAL_TIM_Base_Start_IT(&htim2);//在main函数中使用,开启TIM2以及中断
定时器PWM调制
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//开启定时器的pwm
HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1); //关闭定时器的pwm
__HAL_TIM_SET_COMPARE(&htim16,TIM_CHANNEL_1,1000)//设置占空比,一般情况下要重新包装一个函数才能使用
定时器输入捕获
TIM通道设为捕获,设下拉电平,开启NVIC
https://blog.csdn.net/as480133937/article/details/99407485
__HAL_TIM_SET_COUNTER(&htim1,0);//设置计数寄存器的值变为0
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1,
TIM_INPUTCHANNELPOLARITY_RISING);//设置TIM上升沿捕获
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING); //设置TIM下降沿捕获
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);//在中断模式下启动TIM输入捕获测量
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_3);//停止捕获
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(TIM5 == htim->Instance)
{
……
}
}//定时器输入捕获的中断回调函数
HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_3);//读取捕获值
__HAL_TIM_GET_COUNTER(&htim2)//读取计数器的值
__HAL_TIM_CLEAR_IT(&htim2)//清楚中断标志位
ADC读取
HAL_ADC_Start(&hadc1); //启动ADC单次转换
HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成
smoke_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
DAC实验
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);//开启DAC通道
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048)
IIC的使用
硬件IIC
HAL_I2C_Master_Transmit(&hi2c1, 0x78, buf, 2, 0xFFFF);// 在阻塞模式中以主模式传输大量的数据
HAL_I2C_Master_Receive(&hi2c1, 0x78, buf, 2, 0xFFFF);// 在阻塞模式中以主模式接收大量的数据
HAL_I2C_Mem_Read(&hi2c1, 0x78,0x01,1,buf, 2, 0xFFFF);
HAL_I2C_Mem_Write(&hi2c1, 0x78,0x01,1,buf, 2, 0xFFFF);
模拟IIC
void IIC_Delay(void); //MPU IIC延时函数
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd);//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节 ack=1回应
u8 IIC_Wait_Ack(void); //IIC等待ACK信号,1为失败
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
//已经封装好
unsigned char IIC_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
uint8_t IIC_ReadBytes(u8 dev, u8 reg, u8 length, u8 *data)
unsigned char IIC_WriteOneByte(unsigned char dev, unsigned char reg, unsigned char data)
uint8_t IIC_WriteBytes(u8 dev, u8 reg, u8 length, u8* data)
uint8_t IICwriteBits(uint8_t dev,uint8_t reg,uint8_t bitStart,uint8_t length,uint8_t data)
uint8_t IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
SPI的使用
HAL_SPI_Transmit(&hspi2,&mData,1,0xFFFF);
i = HAL_SPI_Receive(&hspi2,&i,1,0xFFFF);
HAL_SPI_TransmitReceive(&hspi2, send_buf, recv_buf, size, 100);
mpu6050的使用
主函数代码:
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
MPU_Init();
while(mpu_dmp_init())//MPU DMP初始化
{
printf("MPU6050 Error!!!\r\n");
HAL_Delay(500);
}
printf("MPU6050 OK\r\n");
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
temp=MPU_Get_Temperature();
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);//陀螺仪
MPU_Get_Accelerometer(&aacx,&aacy,&aacz);//加速度计
printf("%f %f %f \n",pitch,roll,yaw);
HAL_Delay(500);
}