该文章主要是我用来记录一些容易遗忘的函数,如有错误,望指教。
1.
sprintf((char*)accelX_buff,"AccelX:%-.3f ",ax);
OLED_ShowString(0,0,accelX_buff,8);//我自己函数库中的函数
sprintf
是一个标准的 C 语言库函数,用于将格式化的数据写入字符串。它的原型定义在 <stdio.h>
头文件中,如下所示:
int sprintf(char *str, const char *format, ...);
char *str
:指向目标字符串的指针,这个字符串将被sprintf
函数填充格式化后的数据。const char *format
:一个格式化字符串,它控制如何将后续的参数插入到str
中。格式化字符串中的特殊格式说明符(如%d
,%f
,%s
等)指定了后续参数的类型和格式。...
:可变参数列表,包含了要格式化并写入str
的一个或多个值。
sprintf
函数的返回值是写入目标字符串的字符数(不包括终止的空字符 \0
)。如果发生错误,返回值可能是负数。
2.
// 函数功能: 重定向c库函数printf到DEBUG_USARTx
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
// 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
这段代码定义了一个名为 fgetc
的函数,其目的是从串口(通过 HAL_UART_Receive
函数)读取一个字符。然而,这个函数并不符合标准库中 fgetc
函数的预期行为。标准的 fgetc
函数是用来从文件流中读取一个字符的,而这里的实现是直接从 UART 硬件接口读取数据。
函数的参数是 FILE *f
,但在函数体内部并没有使用这个参数。相反,它使用了一个全局或静态定义的 huart1
UART 句柄和一个局部变量 ch
来存储接收到的字符。
HAL_UART_Receive
函数是来自 STM32 HAL (硬件抽象层) 库的一个函数,用于接收 UART 数据。该函数的参数解释如下:
&huart1
:指向 UART 句柄的指针,代表要操作的 UART 硬件接口。
&ch
:指向要接收数据的变量的指针,这里是一个uint8_t
类型的变量。
1
:指定要接收的数据数量,这里是 1 个字节。
0xffff
:指定接收操作的超时时间,以毫秒为单位。这里设置的是一个很大的值,意味着几乎不会超时,等待直到接收到数据。
函数的返回值是 ch
,即接收到的字符。
需要注意的几点:
- 由于
HAL_UART_Receive
是非阻塞的,如果没有数据可读,它会立即返回,此时ch
的值将保持为 0。- 这个函数没有考虑错误处理,如果
HAL_UART_Receive
失败,它不会返回任何错误信息。f
参数没有被使用,因此这个函数并不依赖于任何特定的FILE
流,而是直接操作 UART。- 由于直接操作了硬件,这个函数的使用应该局限于特定的上下文中,不能替代标准库中的
fgetc
函数。
3.
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,speed);
__HAL_TIM_SetCompare
是一个宏,用于设置定时器通道的比较值,它是 STM32 HAL (硬件抽象层) 库的一部分。此宏的作用是修改定时器的捕获/比较寄存器的值,这个值通常用于PWM(脉冲宽度调制)信号的生成或者定时器的其他功能。
宏的参数如下:
&htim1
:指向定时器句柄的指针。htim1
是一个TIM_HandleTypeDef
类型的实例,它包含了定时器的配置信息和状态。TIM_CHANNEL_2
:指定要设置比较值的通道。STM32 定时器通常具有多个通道(例如,TIM1 有4个通道:TIM_CHANNEL_1, TIM_CHANNEL_2, TIM_CHANNEL_3, TIM_CHANNEL_4),每个通道可以独立配置。speed
:要设置的比较值。这个值决定了PWM信号的占空比,进而控制连接到该定时器通道的外设,如电机速度。
当调用 __HAL_TIM_SetCompare
宏时,它会将 speed
参数的值写入定时器的捕获/比较寄存器中。这个操作会立即影响到定时器产生的PWM信号的脉宽,因此常用于实时控制如电机速度等应用。
4.
HAL_Init()
Delay
: 此函数用于初始化整个HAL库。
5.
HAL_Delay(uint32_t Delay)
Delay
: 要延迟的毫秒数。
6.
HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
GPIOx
: 要操作的GPIO端口寄存器的指针,例如GPIOA
、GPIOB
等。GPIO_Pin
: 要操作的GPIO引脚掩码,例如GPIO_PIN_5
。PinState
: 要设置的引脚状态,可以是GPIO_PIN_SET
或GPIO_PIN_RESET
。
7.
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
GPIOx
: 要读取的GPIO端口寄存器的指针。GPIO_Pin
: 要读取的GPIO引脚掩码。
8.
HAL_UART_Transmit(UART_HandleTypeDef* huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
9.
huart
: UART句柄的指针,包含了UART的配置信息。pData
: 指向要发送的数据缓冲区的指针。Size
: 要发送的数据的长度(字节数)。Timeout
: 等待传输完成的超时时间(毫秒)。
10.
HAL_UART_Receive(UART_HandleTypeDef* huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
huart
: UART句柄的指针。pData
: 指向接收数据缓冲区的指针。Size
: 要接收的数据的长度。Timeout
: 等待接收完成的超时时间。
11.
HAL_TIM_PWM_Start(TIM_HandleTypeDef* htim, uint32_t Channel)
htim
: 定时器句柄的指针,包含了定时器的配置信息。Channel
: PWM通道,例如TIM_CHANNEL_1
。
12.
HAL_TIM_PWM_Stop(TIM_HandleTypeDef* htim, uint32_t Channel)
htim
: 定时器句柄的指针。Channel
: PWM通道。
13.
HAL_TIM_Base_Start(TIM_HandleTypeDef* htim)
htim
: 定时器句柄的指针。
14.
HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim)
htim
: 定时器句柄的指针。
15.
HAL_ADC_Start(ADC_HandleTypeDef* hadc)
hadc
: ADC句柄的指针,包含了ADC的配置信息。
16.
HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
hadc
: ADC句柄的指针。
17.
HAL_DAC_SetChannel1Data(DAC_HandleTypeDef* hadc, uint32_t Align, uint16_t OutputData)
hadc
: DAC句柄的指针。Align
: 数据对齐方式,可以是DAC_ALIGN_8B_R
或DAC_ALIGN_10B_R
。OutputData
: 要输出的数据。
18.
HAL_DAC_Start(DAC_HandleTypeDef* hadc, uint32_t Channel)
hadc
: DAC句柄的指针。Channel
: DAC通道,例如DAC_CHANNEL_1
。
19.
HAL_I2C_Master_Transmit(I2C_HandleTypeDef* hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
hi2c
: I2C句柄的指针,包含了I2C的配置信息。DevAddress
: I2C从设备的地址。pData
: 指向要发送的数据缓冲区的指针。Size
: 要发送的数据的长度。Timeout
: 等待传输完成的超时时间。
20.
HAL_I2C_Master_Receive(I2C_HandleTypeDef* hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
hi2c
: I2C句柄的指针。DevAddress
: I2C从设备的地址。pData
: 指向接收数据缓冲区的指针。Size
: 要接收的数据的长度。Timeout
: 等待接收完成的超时时间。