380 字
1 分钟
stm32 学习
用 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);
仍然有中断,在接收/发送完成时触发一次。函数同理。
部分信息可能已经过时