嵌入式编程学习日记(三)——C语言篇(输入输出,HAL库版)
一、GPIO 输入 / 输出HAL 库1. 输出// 置高 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 置低 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 翻转 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);2. 输入// 读引脚电平 GPIO_PinState state HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); if(state GPIO_PIN_RESET) { // 按键按下 }二、PWM 输出HAL 库1. 启动 PWMHAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1);2. 修改占空比__HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, 500);三、ADC 采样HAL 库1. 单次采集HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 100); uint16_t val HAL_ADC_GetValue(hadc1);2. 转电压float vol val * 3.3f / 4095.0f;四、TIM 输入捕获测频率 / 测脉宽1. 启动捕获HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1);2. 读取捕获值uint32_t val HAL_TIM_ReadCapturedValue(htim2, TIM_CHANNEL_1);3. 中断回调void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM2) { // 读取、计算 } }五、定时器中断TIM 基本定时1. 启动中断HAL_TIM_Base_Start_IT(htim2);2. 中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM2) { // 定时任务 1ms/10ms... } }六、UART 串口HAL 库1. 发送uint8_t buf[] Hello HAL\r\n; HAL_UART_Transmit(huart1, buf, sizeof(buf), 100);2. 接收阻塞uint8_t dat; HAL_UART_Receive(huart1, dat, 1, 100);3. 中断接收HAL_UART_Receive_IT(huart1, dat, 1); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 收到数据 dat }七、CAN 总线HAL 库1. 发送uint8_t buf[8] {1,2,3,4,5,6,7,8}; CAN_TxHeaderTypeDef TxHeader; TxHeader.StdId 0x123; TxHeader.RTR CAN_RTR_DATA; TxHeader.IDE CAN_ID_STD; TxHeader.DLC 8; uint32_t mailbox; HAL_CAN_AddTxMessage(hcan, TxHeader, buf, mailbox);2. 接收中断void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef RxHeader; uint8_t buf[8]; HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, RxHeader, buf); // 处理数据 }八、I2CHAL 库// 写 HAL_I2C_Mem_Write(hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 100); // 读 HAL_I2C_Mem_Read(hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 100);九、SPIHAL 库// 写 HAL_SPI_Transmit(hspi1, buf, len, 100); // 读 HAL_SPI_Receive(hspi1, buf, len, 100); //全双工 HAL_SPI_TransmitReceive(hspi1, tx_buf, rx_buf, len, 100);十、DAC 输出HAL 库1. 启动 DAC// 通道1 PA4 HAL_DAC_Start(hdac, DAC_CHANNEL_1);2. 设置输出电压12 位0~4095// 输出值 0~4095 HAL_DAC_SetValue(hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);3. 输出对应电压// 2048 → 1.65V // 4095 → 3.3V4. DAC DMA 输出播放波形uint16_t dac_buf[100]; HAL_DAC_Start_DMA(hdac, DAC_CHANNEL_1, (uint32_t*)dac_buf, 100, DAC_ALIGN_12B_R);十一、DMA 通用调用方法所有外设 DMA 通用1. 启动 DMAHAL_ADC_Start_DMA(hadc1, adc_buf, 10); // ADCDMA HAL_UART_Transmit_DMA(huart1, buf, 10); // UART TXDMA HAL_UART_Receive_DMA(huart1, buf, 10); // UART RXDMA HAL_DAC_Start_DMA(hdac, DAC_CHANNEL_1, buf, 100, DAC_ALIGN_12B_R);2. DMA 完成回调void HAL_DMA_ConvCpltCallback(DMA_HandleTypeDef *hdma) { // DMA 传输完成 }十二、USART 串口HAL 库 最全1. 阻塞发送uint8_t buf[] Hello USART\r\n; HAL_UART_Transmit(huart1, buf, sizeof(buf), 100);2. 阻塞接收uint8_t dat; HAL_UART_Receive(huart1, dat, 1, 100);3. 中断发送HAL_UART_Transmit_IT(huart1, buf, len);4. 中断接收最常用uint8_t rx_buf[1]; // 开启接收中断 HAL_UART_Receive_IT(huart1, rx_buf, 1); // 接收完成回调 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 处理数据 rx_buf[0] // 重新开启循环接收 HAL_UART_Receive_IT(huart1, rx_buf, 1); }5. DMA 发送HAL_UART_Transmit_DMA(huart1, buf, len);6. DMA 接收HAL_UART_Receive_DMA(huart1, buf, len);十三、高级常用功能必备1. 延时HAL_Delay(100); // ms 级延时2. 系统时钟获取uint32_t tick HAL_GetTick(); // 获取系统运行时间 ms3. 独立看门狗 IWDGHAL_IWDG_Refresh(hiwdg); // 喂狗4. 窗口看门狗 WWDGHAL_WWDG_Refresh(hwwdg);5. RTC 时钟RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; HAL_RTC_GetTime(hrtc, sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(hrtc, sDate, RTC_FORMAT_BIN);6. 低功耗模式HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);