STM32 HAL库代码


前言

STM32可以实现初始化配置,但逻辑代码还是需要我们自己去写,就要使用大量hal库的函数,这里列举了hal开发常用的函数,中断回调函数,必要的结构体,中断标志,以及经常使用的代码块。

void Delay_us(uint32_t us)
{
  uint32_t sysTickReload = (HAL_RCC_GetHCLKFreq()/ 1000000) * us;
	SysTick->LOAD = sysTickReload - 1;  // 设置重载值
	SysTick->VAL = 0;                    // 清空当前计数值
	SysTick->CTRL = 0x00000007;          // 启动定时器,选择时钟源为处理器时钟
	// 等待计数到0
	while((SysTick->CTRL & 0x00010000) == 0);
	SysTick->CTRL = 0x00000000;          // 关闭定时器
	SysTick->VAL = 0;                    // 清空当前计数值
}

一、GPIO and EXTI

HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);		//写高低电平
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);						//电平翻转
HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);						//读取电平,有返回值

中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);					
__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);

二、USART

普通函数

HAL_UART_Transmit();串口发送数据,使用超时管理机制 
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送  
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收 


//重定向 c 库函数 printf 到串口 USARTx,重定向后可使用 printf 函数
int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 0xFFFF);
	return (ch);
}

//重定向 c 库函数 scanf 到串口 USARTx,重写向后可使用 scanf、getchar 等函数
int fgetc(FILE *f)
{
	int ch;
	/* 等待串口输入数据 */
	while (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) == RESET);
	HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 0xFFFF);
	return (ch);
}

HAL_UART_GetState(&huart1);

中断回调函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);	//发送完成回调函数
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);//发送完成过半
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);	//接收完成回调函数
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//接收完成过半
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);		//错误处理回调函数

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);				//使能中断
__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);				//过去中断标志位						
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); 			//中断标志位清零

中断标志位
接收缓冲区非空标志位 (USART_FLAG_RXNE)
发送缓冲区空标志位 (USART_FLAG_TXE)
发送完毕标志位 (USART_FLAG_TC)
奇偶校验错误标志位 (USART_FLAG_PE)
帧错误标志位 (USART_FLAG_FE)
噪声错误标志位 (USART_FLAG_NE)
串口空闲标志位 (USART_FLAG_IDLE)
LIN 帧标志位 (USART_FLAG_LBD)

三、TIM and PWM

普通函数
HAL_TIM_Base_Start(&htim2);
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_Base_Stop(&htim2);
HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_3);
中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);	//更新中断 ,用的最多 
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);	//输出比较  
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);		//输入捕获  
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);			//触发中断

__HAL_TIM_DISABLE_IT(&htim2,TIM_IT_CC1);						//失能中断
__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_CC1);							//使能中断
__HAL_TIM_SET_COUNTER(&htim2,0);								//设置计数值
__HAL_TIM_GET_COUNTER(&htim2);									//获取计数值
HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
//更改触发方式:
//上升沿:TIM_INPUTCHANNELPOLARITY_RISING
//下降沿TIM_INPUTCHANNELPOLARITY_FALLING
//兼具上升下降:TIM_INPUTCHANNELPOLARITY_BOTHEDGE

四、ADC

HAL_ADC_Start(&hadc1);
HAL_ADC_GetValue(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
HAL_ADCEx_Calibration_Start(&hadc1);
中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);

五、IIC and SPI

HAL_I2C_Master_Transmit(&hi2c, 0x12, "hello word", sizeof("hello world"), HAL_MAX_DELAY);
HAL_SPI_Transmit(&hspi1, cmd, 1, 1000);
HAL_SPI_Receive(&hspi1, ID, 3, 1000);

六、SDIO

HAL_SD_ReadBlocks(&hsd, rBuff, 0x0,1, 0xFFFF);	//读取一个块大小,初始地址0x0
HAL_SD_WriteBlocks(&hsd, wBuff, 0x0,1, 0xFFFF);	//写入一个块大小,初始地址0x0
HAL_SD_ReadBlocks_DMA(&hsd, rBuff, 0x0,1);	//读取一个块大小,初始地址0x0
HAL_SD_WriteBlocks_DMA(&hsd, wBuff, 0x0,1);	//写入一个块大小,初始地址0x0
HAL_SD_GetCardstate(&hsd);					//返回值为hsd工作状态

七、flash

结构体
typedef struct
{
  uint32_t TypeErase;  		
  //擦除类型
  // FLASH_TYPEERASE_SECTORS   擦除某一个块,
  //FLASH_TYPEERASE_MASSERASE  全部擦除
  uint32_t Banks; 			//块名称    
  uint32_t Sector;   		//扇区号  
  uint32_t NbSectors;  		//要擦除的扇区数量 
  uint32_t VoltageRange;	//指定擦除操作的电压范围
} FLASH_EraseInitTypeDef;
FLASH_EraseInitTypeDef flash_def;

HAL_FLASH_Unlock();												//解锁
HAL_FLASH_Lock();												//上锁
HAL_FLASHEx_Erase(&flash_def, NULL);				 	        //擦除
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);	    //编程

八、CAN

结构体
typedef struct
{
  uint32_t StdId;    //标准ID
  uint32_t ExtId;    //扩展ID
  uint32_t IDE;      //用来决定报文是使用标准ID还是扩准ID
  uint32_t RTR;      //用来决定报文是数据帧要是遥控帧
  uint32_t DLC;      //数据长度,取值为0-8
  FunctionalState TransmitGlobalTime; 
//最后这个是时间触发模式用的,开启后会自动把时间戳添加到最后两字节的数据中。目前没有用到,选择 DISABLE 
} CAN_TxHeaderTypeDef;

typedef struct
{
  uint32_t FilterIdHigh;          //CAN_FiR1寄存器的高16位
  uint32_t FilterIdLow;           //CAN_FiR1寄存器的低16位
  uint32_t FilterMaskIdHigh;      //CAN_FiR2寄存器的高16位
  uint32_t FilterMaskIdLow;       //CAN_FiR2寄存器的低16位
  uint32_t FilterFIFOAssignment;  //通过筛选器的报文存在FIFO0还是FIFO1中
  uint32_t FilterBank;            //此次配置用的是哪个筛选器。用单CAN的取值为0-13
  uint32_t FilterMode;            //掩码模式或列表模式
  uint32_t FilterScale;           //32位或16位
  uint32_t FilterActivation;      //使能或失能
  uint32_t SlaveStartFilterBank;  //CAN1和CAN2一起用的时候,为CAN2分配筛选器的个数
} CAN_FilterTypeDef;


函数
HAL_CAN_Start(&hcan1);
HAL_CAN_AddTxMessage(&hcan1, &can_Tx, sendBuf, &box);
HAL_CAN_ConfigFilter(&hcan1, &can_Filter);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &can_Rx, recvBuf);

中断
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)

总结

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用STM32HAL库代码控制舵机,可以按照以下步骤进行操作: 1. 导入STM32CubeMX工程:首先,在STM32CubeMX中创建一个新工程,选择对应的芯片型号,并配置相应的时钟和引脚设置。然后保存并生成工程。 2. 打开工程:将生成的工程导入到开发环境中,例如IAR Embedded Workbench或Keil MDK。 3. 配置相应的引脚:根据舵机控制引脚的连接方式,配置相应的引脚作为PWM输出。 4. 配置定时器:舵机控制一般使用定时器生成PWM脉冲信号。在STM32HAL库中,可以选择合适的定时器,并通过HAL_TIM_PWM_Init()来初始化定时器。 5. 配置PWM输出通道:使用HAL_TIM_PWM_ConfigChannel()函数对定时器的PWM输出通道进行配置,使其与舵机控制引脚相连接。 6. 设置PWM周期和占空比:使用HAL_TIM_PWM_ConfigChannel()函数对PWM参数进行设置,包括PWM周期和占空比。可以通过调整占空比来控制舵机的角度。 7. 启动PWM输出:使用HAL_TIM_PWM_Start()函数启动所选择的定时器。 8. 控制舵机角度:通过改变PWM的占空比,可以控制舵机的角度。根据舵机的工作特性,合适的占空比范围应根据舵机的规格手册制定。 9. 停止PWM输出:当不需要控制舵机时,可以使用HAL_TIM_PWM_Stop()函数停止PWM输出。 通过以上步骤,我们可以通过STM32HAL库代码来控制舵机。具体的代码编写和调试可以参考STM32HAL库的相关文档和例程。 ### 回答2: 在STM32HAL库中,控制舵机需要使用PWM(脉冲宽度调制)输出模式。以下是使用STM32HAL库控制舵机的步骤: 1. 配置PWM输出引脚:选择一个定时器和对应的通道,将其设置为PWM输出模式,并将引脚连接到舵机信号线。 2. 初始化PWM定时器:在芯片的初始化代码中配置定时器的时钟源、分频系数等参数,并启用定时器。 3. 配置PWM的周期和占空比:设置定时器的自动重装载值,以确定PWM的周期长度。同时,设置定时器的比较值,以决定占空比的大小。 4. 启动舵机:将舵机指定的角度转换为对应的脉冲宽度,计算出比较值,并使用HAL库提供的函数将比较值写入定时器的比较寄存器。 5. 反馈控制:如果需要进行舵机的闭环控制,可以通过读取舵机的位置反馈信号,然后进行比较和修正,以达到期望的角度控制效果。 需要注意的是,使用STM32HAL库控制舵机需要考虑一些硬件相关的参数,如PWM频率、定时器时钟源、定时器分频系数等。同时还需要根据具体舵机的规格和特性,合理设置占空比范围和角度范围,以确保舵机的正常转动。 以上是使用STM32HAL库控制舵机的一般步骤,具体的代码实现还需要根据具体的舵机型号和硬件平台进行相应的调整和优化。 ### 回答3: 要使用STM32 HAL库控制舵机,可以按照以下步骤进行编程: 1. 配置引脚:首先,需要将引脚配置为输出模式,以控制舵机的信号线。使用HAL库的GPIO_Init函数来配置引脚,将引脚设置为GPIO_MODE_OUTPUT_PP(推挽输出)模式。 2. 配置定时器:舵机通常使用PWM信号进行控制,因此需要配置一个定时器来生成PWM信号。使用HAL库的TIM_Base_SetConfig函数来配置定时器的基本参数,如定时器的时钟频率、预分频等。 3. 配置PWM信号:使用HAL库的TIM_OC_Init函数来配置PWM信号的参数,如PWM的工作模式、占空比等。选择适当的工作模式,如PWM模式1或PWM模式2,这取决于具体的舵机。 4. 设置舵机位置:通过调整PWM信号的占空比来控制舵机的位置。占空比是指PWM信号高电平持续的时间与一个周期的比例。通过修改占空比的数值,可以改变舵机的位置。使用HAL库的TIM_SetCompare函数来设置占空比的数值。 5. 启动定时器:完成上述步骤后,启动定时器开始生成PWM信号,控制舵机的位置。 注意事项: - 确保舵机的信号线和GND(地)线正确连接到STM32的引脚。 - 根据舵机的要求,设置正确的PWM频率和占空比范围。 - 如果使用多个舵机,可以通过配置不同的定时器和引脚来控制它们。 以上是基本的步骤,具体的实现会根据舵机型号和具体的硬件连接方式而有所不同。可根据芯片手册和舵机规格书提供的信息进行进一步的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值