380 字
1 分钟
stm32 学习
2026-04-15

用 cubeIDE。

延:HAL_Delay()

GPIO 输出#

  • 推挽输出:改变 N-MOS 或 P-MOS,使输出 3.3V 或 0V。
  • 开漏输出:P-MOS 断,设置为高电平,N-MOS 断,电路短路;设置为低电平,N-MOS 连接,接地,此时外部连电源,则形成电压差,小灯亮起。

写:HAL_GPIO_WritePin(GPIOX , GPIO_PIN_X , GPIO_PIN_RESET)

翻转:HAL_GPIO_TogglePin(GPOIX , GPIO_PIN_X)

GPIO 输入#

  • 上拉输入:按下接地0V,不按3.3V。有上拉电阻。
  • 下拉输入:按下3.3V,不按接地0V。有下拉电阻。
  • 浮空输入:无上拉下拉电阻。

读:HAL_GPIO_ReadPin(同上)

注意,按键按下有抖动,可以加延时,或者加电容。

eg:

if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET){
HAL_Delay(20);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET);
HAL_Delay(20);
if(key_down == GPIO_PIN_RESET) key_down = GPIO_PIN_SET;
else key_down = GPIO_PIN_RESET;
HAL_GPIO_WritePin(GPIOA , GPIO_PIN_7 , key_down);
}

中断#

停下主线,做复线,结束后再做主线。

可以设置优先级。

EXTI 外部中断#

上升沿:低到高电平,中断。

下降沿:高到低电平,中断。

串口#

PA9:USART1_TX;PA10:USART1_RX。

轮询#

会卡住其他任务。

  • HAL_UART_Receive(&huart1, qwq, 2, HAL_MAX_DELAY);
  • HAL_UART_Transmit(&huart1, qwq, 2, 100);

中断#

不会卡。但是每接受/发生一字节就触发中断

  • HAL_UART_Receive_IT(&huart1, qwq, 2);
  • HAL_UART_Transmit_IT(&huart1, qwq, 2);

其中,在 stm32f1xx_it.c 的这个函数中写有其中断函数:

void USART1_IRQHandler(void){
HAL_UART_IRQHandler(&huart1);
}

来到 stm32f1xx_hal_uart.c 中可以看到 HAL_UART_IRQHandle 的实现。其中有回调函数,我们可以重构他们。

Rx 表示接收,Cplt 表示完成,Callback 回调。

eg:电脑控制修改闪烁小灯(关键代码):

uint8_t led_state[2];
uint16_t now_show = GPIO_PIN_6;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
HAL_UART_Transmit_IT(&huart1, led_state, 2);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
if(led_state[1] == 'R') now_show = GPIO_PIN_6;
else if(led_state[1] == 'B') now_show = GPIO_PIN_7;
HAL_UART_Receive_IT(&huart1, led_state, 2);
}
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, led_state, 2);
while (1){
HAL_GPIO_TogglePin(GPIOA, now_show);
HAL_Delay(500);
}
}

DMA#

  • HAL_UART_Transmit_DMA(&huart1, led_state, 2);
  • HAL_UART_Receive_DMA(&huart1, led_state, 2);

仍然有中断,在接收/发送完成时触发一次。函数同理。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时