【无标题】

【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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hy4A8t7C-1660896772889)(en-resource://database/4128:1)]

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的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlK71pPF-1660896772890)(en-resource://database/4130:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPov7Dlj-1660896772891)(en-resource://database/4138:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxCSFTtH-1660896772891)(en-resource://database/4134:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgI1gtRC-1660896772891)(en-resource://database/4136:1)]

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的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpO2yTp5-1660896772891)(en-resource://database/4140:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBpoYNY4-1660896772892)(en-resource://database/4142:1)]

主函数代码:

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);

      }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值