HAL_GetTick();对应标准库文件中的什么函数
时间: 2024-04-12 14:33:18 浏览: 552
`HAL_GetTick()` 函数是在 STM32 HAL(Hardware Abstraction Layer)库中定义的函数,用于获取系统的滴答计时器值。它返回自系统启动以来的毫秒数。
在 STM32 HAL 库中,滴答计时器通常使用 SysTick 定时器来实现。SysTick 定时器是一个硬件计数器,可以以固定的频率(通常为系统时钟频率)递增,并且在每次递增时会更新 SysTick 计数器。
`HAL_GetTick()` 函数内部会读取 SysTick 计数器的值,并根据系统时钟频率和 SysTick 时钟分频系数来计算毫秒数。因此,通过调用 `HAL_GetTick()` 函数,你可以获取自系统启动以来经过的毫秒数。
需要注意的是,`HAL_GetTick()` 函数的具体实现可能因不同的 STM32 系列和 HAL 库版本而有所差异。你可以在 HAL 库的源代码中查找 `HAL_GetTick()` 函数的实现细节。
相关问题
标准库中CAN_TransmitStatus在HAL库相对应的函数
标准库中没有与HAL库中的`CAN_TransmitStatus`函数相对应的函数,但是可以通过使用标准库中的`CAN_Transmit`函数来实现相同的功能。下面是使用标准库中的`CAN_Transmit`函数来获取CAN消息发送状态的示例代码:
```c
CAN_TxStatusTypeDef CAN_TransmitStatus(CAN_HandleTypeDef* hcan, uint32_t Timeout)
{
uint32_t tickstart = HAL_GetTick(); // 获取当前时间
uint32_t TransmitMailbox;
CAN_TxStatusTypeDef status = CAN_TXSTATUS_PENDING;
// 等待发送邮箱可用
while((hcan->Instance->TSR & CAN_TSR_TME) == 0)
{
if((Timeout == 0) || ((HAL_GetTick() - tickstart) >= Timeout))
{
status = CAN_TXSTATUS_TIMEOUT;
break;
}
}
if(status == CAN_TXSTATUS_PENDING)
{
// 获取可用发送邮箱号
if((hcan->Instance->TSR & CAN_TSR_TME0) != 0)
{
TransmitMailbox = CAN_TX_MAILBOX0;
}
else if((hcan->Instance->TSR & CAN_TSR_TME1) != 0)
{
TransmitMailbox = CAN_TX_MAILBOX1;
}
else if((hcan->Instance->TSR & CAN_TSR_TME2) != 0)
{
TransmitMailbox = CAN_TX_MAILBOX2;
}
else
{
status = CAN_TXSTATUS_FAILED;
}
}
if(status == CAN_TXSTATUS_PENDING)
{
// 发送CAN消息
if(HAL_CAN_AddTxMessage(hcan, &TxHeader, TxData, &TransmitMailbox) != HAL_OK)
{
status = CAN_TXSTATUS_FAILED;
}
else
{
// 等待发送完成
while((hcan->Instance->TSR & (CAN_TSR_TME0 << TransmitMailbox)) == 0)
{
if((Timeout == 0) || ((HAL_GetTick() - tickstart) >= Timeout))
{
status = CAN_TXSTATUS_TIMEOUT;
break;
}
}
// 检查发送状态
if(status == CAN_TXSTATUS_PENDING)
{
if((hcan->Instance->TSR & (CAN_TSR_RQCP0 << TransmitMailbox)) != 0)
{
status = CAN_TXSTATUS_OK;
}
else
{
status = CAN_TXSTATUS_FAILED;
}
}
}
}
return status;
}
```
此代码中,我们使用了标准库中的`CAN_Transmit`函数来发送CAN消息,并在函数中添加了一些额外的代码来获取发送状态。具体来说,我们首先等待发送邮箱可用,然后获取可用的发送邮箱号进行发送。在发送完成后,我们等待发送完成,并检查发送状态。最终,返回发送状态。
STM32c8t6的定时器2的初始化和中断,且有延时函数1ms,使用标准库,不适用hal库
STM32C8T6处理器的定时器2是一个高级定时器,用于精确的时间控制。以下是定时器2的基本初始化步骤以及如何设置1ms的延时,并利用C标准库处理:
1. **初始化定时器2**:
首先,你需要配置定时器2的工作模式和预分频器。假设你想要使用PWM模式并且使用系统的时钟频率作为时钟源。在`stm32f4xx_hal_tim.h`文件中找不到对应的宏,所以我们需要手动操作寄存器。
```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitTypeDef timerInit;
timerInit.TIM_Period = 0x7FF; // 设置周期为2^15 - 1,因为1ms等于系统时钟频率除以1000,减去1微秒误差
timerInit.TIM_Prescaler = SystemCoreClock / (1000 * (clockDividerValue + 1)); // 根据实际系统时钟计算正确的预分频值
timerInit.TIM_ClockDivision = 0;
timerInit.TIM_RepetitionCounter = 0;
TIM_Init(TIM2, &timerInit);
TIM_Cmd(TIM2, ENABLE); // 启动定时器
```
2. **启用计数器和外部中断**:
对于1ms的延时,我们可以使用定时器溢出中断(TIMIER_TIIE)。首先,配置溢出中断并使能它:
```c
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启用更新中断
NVIC_EnableIRQ(TIM2_IRQn); // 开启定时器2中断
```
3. **编写延时函数**:
使用中断服务函数(ISR)实现1ms的延时,这里假设我们有一个全局标志`delayFlag`来检查是否到达了预定时间:
```c
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (!delayFlag) { // 如果延时未完成,再次进入等待
delayFlag = TRUE;
} else {
delayFlag = FALSE; // 延时结束,关闭中断
TIM_Cmd(TIM2, DISABLE); // 关闭定时器
}
}
}
// 延时函数
void delay_ms(uint16_t ms)
{
uint16_t startTick = HAL_GetTick();
while (HAL_GetTick() - startTick < ms * 1000) {} // 循环直到达到指定时间
TIM2_IRQHandler(); // 触发中断完成延时
}
阅读全文