下面开始详细说说
听哥的,就记住我在等就行,等什么?等上面的执行完
void Example_Blocking() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 打开 LED
HAL_Delay(1000); // 等待 1 秒(阻塞)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 关闭 LED
}
非阻塞模式是指代码在执行某个操作时,不会等待操作完成,而是立即返回,程序可以继续执行其他任务。太利索了,有活就干不拖拉。
操作发起后立即返回,程序可以并行处理其他任务。
需要依赖中断、定时器或状态机来检测操作完成状态。
适合实时性要求高或多任务并行的场景。
中断处理:通过中断处理器完成特定操作。
DMA 传输:启动数据传输后,继续执行其他任务,传输完成时触发中断。
事件驱动程序:通过状态机或轮询处理多任务。
volatile uint8_t uart_rx_flag = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
uart_rx_flag = 1; // 设置标志,表示接收完成
}
void Example_NonBlocking() {
uint8_t rx_data[10];
HAL_UART_Receive_IT(&huart1, rx_data, sizeof(rx_data)); // 非阻塞接收
while (1) {
if (uart_rx_flag) { // 检查是否接收完成
uart_rx_flag = 0;
// 处理接收到的数据
}
// 其他任务
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(100); // 模拟其他任务的执行
}
}
在tim.c里面,这些都是weak,自己写!
但是真正的实现其实是在ex.c里面,不知道咋想的
每个外设都有这样的回调
这个所有
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)
HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)
HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)
HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim)
HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim)
实现周期性任务(比如 LED 闪烁):
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim == &htim3) { // 判断是哪个定时器
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 切换 LED 状态
}
}
捕获外部信号脉宽:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim == &htim2) {
uint32_t pulse_width = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 读取捕获值
// 处理捕获的脉宽数据
}
}
建议还是多写多看文档。