Clion开发STM32之HAL库USART封装(基础库)

这篇具有很好参考价值的文章主要介绍了Clion开发STM32之HAL库USART封装(基础库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

引用参考:文章来源地址https://www.toymoban.com/news/detail-633593.html

  1. Clion开发STM32之HAL库GPIO宏定义封装(最新版)

头文件

/*******************************************************************************
 * Copyright (c) [scl]。保留所有权利。
 *      本文仅供个人学习和研究使用,禁止用于商业用途。
 ******************************************************************************/
#ifndef STM32_F1XX_PROJECT_BSP_SERIAL_H
#define STM32_F1XX_PROJECT_BSP_SERIAL_H

#include "bsp_include.h"


#ifndef STM32_LIB_SYS_CORE_KERNEL_H /*为了保证驱动的独立性*/
#define sys_force_static_inline      __attribute__((always_inline)) static inline
#define error_handle()
#endif
#define COM_DEFAULT_CNF {\
                .BaudRate = 115200, /*波特率*/\
                .WordLength = UART_WORDLENGTH_8B,/*数据宽度*/\
                .StopBits = UART_STOPBITS_1,/*停止位*/\
                .Parity = UART_PARITY_NONE,/*校验位*/\
                .Mode = UART_MODE_TX_RX,/*读写模式*/\
                .HwFlowCtl = UART_HWCONTROL_NONE,/*硬件控制*/\
                .OverSampling = UART_OVERSAMPLING_16,/*采样率*/\
        }

/** @brief  检查是否设置了指定的 UART 标志。
  * @param  __UART__ 具体串口实例.
  * @param  __FLAG__ 具体标志位
  *        此参数可以是以下值之一:
  *            @arg UART_FLAG_CTS:  CTS 更改标志(不适用于 UART4 和 UART5)
  *            @arg UART_FLAG_LBD:  LIN 中断检测标志
  *            @arg UART_FLAG_TXE:  传输数据寄存器空标志
  *            @arg UART_FLAG_TC:   传输完成标志
  *            @arg UART_FLAG_RXNE: 接收数据寄存器不为空标志
  *            @arg UART_FLAG_IDLE: 空闲线路检测标志
  *            @arg UART_FLAG_ORE:  溢出错误标志
  *            @arg UART_FLAG_NE:   噪声错误标志
  *            @arg UART_FLAG_FE:   帧错误标志
  *            @arg UART_FLAG_PE:   奇偶校验错误标志
  * @retval 状态(true或false).
  */
#define UART_GET_FLAG(__UART__, __FLAG__) (((__UART__)->SR & (__FLAG__)) == (__FLAG__))
#define UART_CLEAR_FLAG(__UART__, __FLAG__) ((__UART__)->SR = ~(__FLAG__))
#define UART_CLEAR_PEFLAG(__UART__)     \
  do{                                           \
    __IO uint32_t tmpreg = 0x00U;               \
    tmpreg = (__UART__)->SR;        \
    tmpreg = (__UART__)->DR;        \
    UNUSED(tmpreg);                             \
  } while(0U)

/** @brief  使能具体的中断源标志位
  * @param  __UART__ 具体串口实例
  * @param  __INTERRUPT__  中断源
  *          此参数可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 中断
  *            @arg UART_IT_LBD:  LIN中断检测中断
  *            @arg UART_IT_TXE:  发送数据寄存器空中断
  *            @arg UART_IT_TC:   传输完成中断
  *            @arg UART_IT_RXNE: 接收数据寄存器不为空中断
  *            @arg UART_IT_IDLE: 空闲线路检测中断
  *            @arg UART_IT_PE:   奇偶校验错误中断
  *            @arg UART_IT_ERR:  错误中断(帧错误, 噪声错误, 溢出错误)
  * @retval None
  */
#define UART_ENABLE_IT(__UART__, __INTERRUPT__)   ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__UART__)->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                   (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__UART__)->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                    ((__UART__)->CR3 |= ((__INTERRUPT__) & UART_IT_MASK)))

/** @brief  Disable 具体的中断源标志位.
  * @param  __UART__ 具体串口实例.
  * @param  __INTERRUPT__ 指定要禁用的 UART 中断源.
  *          此参数可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 中断
  *            @arg UART_IT_LBD:  LIN中断检测中断
  *            @arg UART_IT_TXE:  发送数据寄存器空中断
  *            @arg UART_IT_TC:   传输完成中断
  *            @arg UART_IT_RXNE: 接收数据寄存器不为空中断
  *            @arg UART_IT_IDLE: 空闲线路检测中断
  *            @arg UART_IT_PE:   奇偶校验错误中断
  *            @arg UART_IT_ERR:  错误中断(帧错误, 噪声错误, 溢出错误)
  * @retval None
  */
#define UART_DISABLE_IT(__UART__, __INTERRUPT__)  ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__UART__)->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \
                                                           (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__UART__)->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \
                                                           ((__UART__)->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK)))

/**
 * @brief 串口错误标志位判断 并清除
 */
#define UART_FAILED_FLAG_CLEAR(__UART__)     do { \
if (UART_GET_FLAG(__UART__, UART_FLAG_ORE) != RESET   || UART_GET_FLAG(__UART__, UART_FLAG_FE) != RESET \
    || UART_GET_FLAG(__UART__, UART_FLAG_PE) != RESET || UART_GET_FLAG(__UART__, UART_FLAG_NE) != RESET) { \
            UART_CLEAR_PEFLAG(__UART__); \
    } \
if (UART_GET_FLAG(__UART__, UART_FLAG_CTS) != RESET) {\
            UART_CLEAR_FLAG(__UART__, UART_FLAG_CTS);\
}\
if (UART_GET_FLAG(__UART__, UART_FLAG_TXE) != RESET) {\
            UART_CLEAR_FLAG(__UART__, UART_FLAG_TXE);\
}\
if (UART_GET_FLAG(__UART__, UART_FLAG_TC) != RESET) {\
            UART_CLEAR_FLAG(__UART__, UART_FLAG_TC);\
}\
if (UART_GET_FLAG(__UART__, UART_FLAG_RXNE) != RESET) {\
            UART_CLEAR_FLAG(__UART__, UART_FLAG_RXNE);\
    }\
} while (0)


sys_force_static_inline int com_read_data(USART_TypeDef *uart) {
    int ch = -1;

    if (UART_GET_FLAG(uart, UART_FLAG_RXNE) != RESET) {
        ch = uart->DR & 0xff;
    }
    return ch;
}

sys_force_static_inline int com_write_data(USART_TypeDef *uart, uint8_t dat) {
    UART_CLEAR_FLAG(uart, UART_FLAG_TC);
    uart->DR = dat;
    while (UART_GET_FLAG(uart, UART_FLAG_TC) == RESET);
    return 1;
}

/********************************串口1 (需要重写)**********************************************/
#define COM1_TX PA9
#define COM1_RX PA10

void com1_gpio_msp_init();

void com1_gpio_msp_de_init();

void com1_dma_tx_msp_init();/**串口DMA TX硬件初始化 @see HAL_UART_MspInit*/
void com1_dma_tx_msp_de_init();/**串口DMA TX硬件重置 @see HAL_UART_MspDeInit*/
void com1_dma_rx_msp_init();/**串口DMA RX硬件初始化 @see HAL_UART_MspInit*/
void com1_dma_rx_msp_de_init();/**串口DMA RX硬件重置 @see HAL_UART_MspDeInit*/
void com1_it_msp_init(void);/**串口中断硬件初始化 @see HAL_UART_MspInit*/
void com1_it_msp_de_init(void);/**串口中断硬件重置 @see HAL_UART_MspDeInit*/
/*-------------------------------------串口1回调-------------------------------------------------*/
extern void com1_ErrorCallback();/** @see HAL_UART_ErrorCallback*/
extern void com1_RxHalfCpltCallback();/**@see HAL_UART_RxHalfCpltCallback*/
extern void com1_RxCpltCallback();/**@see HAL_UART_RxCpltCallback*/
extern void com1_RxEventCallback(uint16_t Size);/** @see HAL_UARTEx_RxEventCallback*/
/********************************串口2 (需要重写)**********************************************/
//PA2------> USART2_TX   PA3------> USART2_RX
#define COM2_TX PA2
#define COM2_RX PA3

void com2_gpio_msp_init();

void com2_gpio_msp_de_init();

void com2_dma_tx_msp_init();/**串口DMA TX硬件初始化 @see HAL_UART_MspInit*/
void com2_dma_tx_msp_de_init();/**串口DMA TX硬件重置 @see HAL_UART_MspDeInit*/
void com2_dma_rx_msp_init();/**串口DMA RX硬件初始化 @see HAL_UART_MspInit*/
void com2_dma_rx_msp_de_init();/**串口DMA RX硬件重置 @see HAL_UART_MspDeInit*/
void com2_it_msp_init(void);/**串口中断硬件初始化 @see HAL_UART_MspInit*/
void com2_it_msp_de_init(void);/**串口中断硬件重置 @see HAL_UART_MspDeInit*/
/*-------------------------------------串口2回调-------------------------------------------------*/
extern void com2_ErrorCallback();/** @see HAL_UART_ErrorCallback*/
extern void com2_RxHalfCpltCallback();/**@see HAL_UART_RxHalfCpltCallback*/
extern void com2_RxCpltCallback();/**@see HAL_UART_RxCpltCallback*/
extern void com2_RxEventCallback(uint16_t Size);/** @see HAL_UARTEx_RxEventCallback*/
/********************************串口3 (需要重写)**********************************************/
#define COM3_TX PB10
#define COM3_RX PB11

void com3_gpio_msp_init();

void com3_gpio_msp_de_init();

void com3_dma_tx_msp_init();/**串口DMA TX硬件初始化 @see HAL_UART_MspInit*/
void com3_dma_tx_msp_de_init();/**串口DMA TX硬件重置 @see HAL_UART_MspDeInit*/
void com3_dma_rx_msp_init();/**串口DMA RX硬件初始化 @see HAL_UART_MspInit*/
void com3_dma_rx_msp_de_init();/**串口DMA RX硬件重置 @see HAL_UART_MspDeInit*/
void com3_it_msp_init(void);/**串口中断硬件初始化 @see HAL_UART_MspInit*/
void com3_it_msp_de_init(void);/**串口中断硬件重置 @see HAL_UART_MspDeInit*/
/*-------------------------------------串口3回调-------------------------------------------------*/
extern void com3_ErrorCallback();/** @see HAL_UART_ErrorCallback*/
extern void com3_RxHalfCpltCallback();/**@see HAL_UART_RxHalfCpltCallback*/
extern void com3_RxCpltCallback();/**@see HAL_UART_RxCpltCallback*/
extern void com3_RxEventCallback(uint16_t Size);/** @see HAL_UARTEx_RxEventCallback*/
/********************************串口4 中断**********************************************/
void bsp_SerialHandleInit(UART_HandleTypeDef *handle, uint32_t baud);


#endif //STM32_F1XX_PROJECT_BSP_SERIAL_H

源文件

#include "bsp_serial.h"

void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle) {
    USART_TypeDef *uart = uartHandle->Instance;
    if (uart == USART1) {
        /* USART1 clock enable */
        __HAL_RCC_USART1_CLK_ENABLE();
        /* io init */
        com1_gpio_msp_init();
        /*com1 dma rx 初始化*/
        com1_dma_rx_msp_init();
        /*com1 dma tx 初始化*/
        com1_dma_tx_msp_init();
        /*com1 it 初始化*/
        com1_it_msp_init();
    } else if (uart == USART2) {
        /*  clock enable */
        __HAL_RCC_USART2_CLK_ENABLE();
        /* io init */
        com2_gpio_msp_init();

        /*com2 dma rx 初始化*/
        com2_dma_rx_msp_init();
        /*com2 dma tx 初始化*/
        com2_dma_tx_msp_init();
        /*com2 it 初始化*/
        com2_it_msp_init();
    } else if (uart == USART3) {
        /* USART3 clock enable */
        __HAL_RCC_USART3_CLK_ENABLE();
        /* io init */
        com3_gpio_msp_init();

        /*com3 dma rx 初始化*/
        com3_dma_rx_msp_init();
        /*com3 dma tx 初始化*/
        com3_dma_tx_msp_init();
        /*com3 it 初始化*/
        com3_it_msp_init();
    } else if (uart == UART4) {
    } else {
        error_handle();
    }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle) {
    USART_TypeDef *uart = uartHandle->Instance;
    if (uart == USART1) {
        /* clock disable */
        __HAL_RCC_USART1_CLK_DISABLE();
        /* io deinit */
        com1_gpio_msp_de_init();

        com1_dma_rx_msp_de_init();
        com1_dma_tx_msp_de_init();
        com1_it_msp_de_init();
    } else if (uart == USART2) {
        /* clock disable */
        __HAL_RCC_USART2_CLK_DISABLE();

        com2_gpio_msp_de_init();
        com2_dma_rx_msp_de_init();
        com2_dma_tx_msp_de_init();
        com2_it_msp_de_init();
    } else if (uart == USART3) {
        /* Peripheral clock disable */
        __HAL_RCC_USART3_CLK_DISABLE();
        /* io init */
        com3_gpio_msp_de_init();

        com3_dma_rx_msp_de_init();
        com3_dma_tx_msp_de_init();
        com3_it_msp_de_init();
    } else if (uart == UART4) {
    } else {
        error_handle();
    }

}


void bsp_SerialInit(device_id_type com, uint32_t baud) {
    UART_HandleTypeDef *ptr = conv_uart_handle_ptr(handle_get_by_id(com));
    if (ptr == NULL) {
        error_handle();
    } else {
        ptr->Init.BaudRate = baud;
        if (HAL_UART_Init(ptr) != HAL_OK) {
            error_handle();
        }
    }

}

void bsp_SerialHandleInit(UART_HandleTypeDef *handle, uint32_t baud) {
    if (handle == NULL) {
        error_handle();
    } else {
        handle->Init.BaudRate = baud;
        if (HAL_UART_Init(handle) != HAL_OK) {
            error_handle();
        }
    }
}




void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *handle, uint16_t Size) {
    USART_TypeDef *uart = handle->Instance;
    if (uart == USART1) {
        com1_RxEventCallback(Size);
    } else if (uart == USART2) {
        com2_RxEventCallback(Size);
    } else if (uart == USART3) {
        com3_RxEventCallback(Size);

    } else if (uart == UART4) {
    } else {
        error_handle();
    }
}


void HAL_UART_ErrorCallback(UART_HandleTypeDef *handle) {
    switch (handle->ErrorCode) {
        case HAL_UART_ERROR_PE:
            __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_PE);
            break;
        case HAL_UART_ERROR_NE:
            __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_NE);
            break;
        case HAL_UART_ERROR_FE:
            __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_FE);
            break;
        case HAL_UART_ERROR_ORE:
            __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_ORE);
            break;
        case HAL_UART_ERROR_DMA:
            __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_IDLE);
            break;
        default:
            __HAL_UART_CLEAR_FEFLAG(handle);
            break;
    }
    USART_TypeDef *uart = handle->Instance;
    if (uart == USART1) {
        com1_ErrorCallback();
    } else if (uart == USART2) {
        com2_ErrorCallback();
    } else if (uart == USART3) {
        com3_ErrorCallback();

    } else if (uart == UART4) {
    } else {
        error_handle();
    }
}

void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *handle) {
    USART_TypeDef *uart = handle->Instance;
    if (uart == USART1) {
        com1_RxHalfCpltCallback();
    } else if (uart == USART2) {
        com2_RxHalfCpltCallback();
    } else if (uart == USART3) {
        com3_RxHalfCpltCallback();

    } else if (uart == UART4) {
    } else {
        error_handle();
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *handle) {
    USART_TypeDef *uart = handle->Instance;
    if (uart == USART1) {
        com1_RxCpltCallback();
    } else if (uart == USART2) {
        com2_RxCpltCallback();
    } else if (uart == USART3) {
        com3_RxCpltCallback();
    } else if (uart == UART4) {
    } else {
        error_handle();
    }

}
/*-*****************************************串口1弱引用**********************************************-*/
__weak void com1_gpio_msp_init() {

    stm32_pin_define_mode_set(stm_get_pin(COM1_TX), pin_mode_af_pp);
    stm32_pin_define_mode_set(stm_get_pin(COM1_RX), pin_mode_input);
}

__weak void com1_gpio_msp_de_init() {
    //PA9------> USART1_TX   PA10------> USART1_RX
    stm32_pin_define_reset(stm_get_pin(COM1_TX));
    stm32_pin_define_reset(stm_get_pin(COM1_RX));
}

__weak void com1_it_msp_init(void) {
    //  @note 框架不实现,需要重新定义此方法
    //    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    //    HAL_NVIC_EnableIRQ(USART1_IRQn);
}

__weak void com1_it_msp_de_init(void) {
    /* USART1 interrupt Deinit */
    //  @note 框架不实现,需要重新定义此方法
    //    HAL_NVIC_DisableIRQ(USART1_IRQn);
}/*com1*/
__weak void com1_dma_tx_msp_init(void) {}

__weak void com1_dma_tx_msp_de_init(void) {}/*com1*/
__weak void com1_dma_rx_msp_init(void) {}/*com1*/
__weak void com1_dma_rx_msp_de_init(void) {}/*com1*/
__weak void com1_ErrorCallback() {}/*com1*/
__weak void com1_RxHalfCpltCallback() {}/*com1*/
__weak void com1_RxCpltCallback() {}/*com1*/
__weak void com1_RxEventCallback(uint16_t Size) {}/*com1*/
/*-*****************************************串口2弱引用**********************************************-*/
__weak void com2_gpio_msp_init() {
    /* io init */
    stm32_pin_define_mode_set(stm_get_pin(COM2_TX), pin_mode_af_pp);
    stm32_pin_define_mode_set(stm_get_pin(COM2_RX), pin_mode_input);

}

__weak void com2_gpio_msp_de_init() {
    stm32_pin_define_reset(stm_get_pin(COM2_TX));
    stm32_pin_define_reset(stm_get_pin(COM2_RX));
}

__weak void com2_it_msp_init(void) {
    //  @note 框架不实现,需要重新定义此方法
    //    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    //    HAL_NVIC_EnableIRQ(USART2_IRQn);
} /*com*/
__weak void com2_it_msp_de_init(void) {}/*com*/
__weak void com2_dma_tx_msp_init(void) {}/*com*/
__weak void com2_dma_tx_msp_de_init(void) {}/*com*/
__weak void com2_dma_rx_msp_init(void) {}/*com*/
__weak void com2_dma_rx_msp_de_init(void) {}/*com*/
__weak void com2_ErrorCallback() {}/*com*/
__weak void com2_RxHalfCpltCallback() {}/*com*/
__weak void com2_RxCpltCallback() {}/*com*/
__weak void com2_RxEventCallback(uint16_t Size) {}/*com*/

/*-*****************************************串口3弱引用**********************************************-*/
__weak void com3_it_msp_init(void) {
    //  @note 框架不实现,需要重新定义此方法
    //    HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
    //    HAL_NVIC_EnableIRQ(USART3_IRQn);
} /*com*/
__weak void com3_gpio_msp_init() {
    /* io init */
    stm32_pin_define_mode_set(stm_get_pin(COM3_TX), pin_mode_af_pp);
    stm32_pin_define_mode_set(stm_get_pin(COM3_RX), pin_mode_input);
}

__weak void com3_gpio_msp_de_init() {
    stm32_pin_define_reset(stm_get_pin(COM3_TX));
    stm32_pin_define_reset(stm_get_pin(COM3_RX));
}

__weak void com3_it_msp_de_init(void) {}/*com*/
__weak void com3_dma_tx_msp_init(void) {}/*com*/
__weak void com3_dma_tx_msp_de_init(void) {}/*com*/
__weak void com3_dma_rx_msp_init(void) {}/*com*/
__weak void com3_dma_rx_msp_de_init(void) {}/*com*/
__weak void com3_ErrorCallback() {}/*com*/
__weak void com3_RxHalfCpltCallback() {}/*com*/
__weak void com3_RxCpltCallback() {}/*com*/
__weak void com3_RxEventCallback(uint16_t Size) {}/*com*/

到了这里,关于Clion开发STM32之HAL库USART封装(基础库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。比如STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等,这些都是芯片内部的电路,它们的配置寄存器、数据寄存器都在芯片里面,操作简单,直接读写就行。但是有些功能STM32内部没有

    2024年02月04日
    浏览(65)
  • 普中STM32-PZ6806L开发板(HAL库函数实现-USART1 printf+scanf/gets)

    实现printf+scanf/gets通过USART1 的发送接收。 主芯片串口引脚图 我的板子板子自带串口坏掉了, 所以使用USB转TTL线, 连接如下 电路原理图 实物图 scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入,如果你需要读取空格的话可以使用gets或者

    2024年02月04日
    浏览(52)
  • STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面写了串口通信的理论知识,在这一篇中将讲述串口通信在STM32CubeMx里面的配置,以及在函数里面怎么使用。 对于串口发送信息,分为三种方法: 串口阻塞方式收发 、 串口中断方式收发 、 串口DMA方式收发 。(DMA方式在之后的DMA章节讲解) 关于STM32CubeMx的基

    2024年02月06日
    浏览(74)
  • HAL库STM32CUBEMX学习记录(一)——USART(串口中断收发数据)

    一、首先使用STM32CUBEMX新建一个工程 二、打开工程文件 1.在usart.c中添加以下代码  2.然后在最后面加入中断回调函数 3.在usart.h文件中加入  4.新建一个cmd.c文件,创建命令check函数 5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数 6.最后串口初始化函数后打开串口中

    2024年02月16日
    浏览(45)
  • STM32 HAL库开发——基础篇

    一、基础知识 1.1 Cortex--M系列介绍 1.2 什么是stm32 1.3 数据手册查看 1.4 最小系统和 IO 分配  1.4.1 电源电路 1.4.2 复位电路 1.4.3 BOOT 启动电路 1.4.4 晶振电路 1.4.5 下载调试电路 1.4.6 串口一键下载电路  1.4.7 IO 分配  1.4.8 总结  1.5 开发工具 1.6 下载 二、 代码、工程相关 2.1 文本美化

    2024年02月07日
    浏览(33)
  • HAL库STM32常用外设教程(五)—— 定时器 输出比较

    有关于定时器 输出PWM功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(一)—— 定时器 输出PWM 有关于定时器 定时功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(四)—— 定时器 基本定时 1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以

    2024年03月27日
    浏览(64)
  • # HAL库STM32常用外设教程(四)—— 定时器 基本定时

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月02日
    浏览(68)
  • HAL库STM32常用外设教程(一)—— 定时器 输出PWM

    本篇文章为个人参考总结所用,如果错误还望指出。 涉及的知识: 1、STM32CubeMx的部分使用 2、PWM原理及常用概念 3、用单片机生成一定频率的PWM 用到的软件及单片机: 1、STM32CubeMx 2、IDE: MDK-Keil软件 3、芯片:STM32F407ZGT6 4、开发板:正点原子探索者 注:不同型号的单片机实现

    2024年02月02日
    浏览(57)
  • STM32 hal库使用笔记(四)DMA—内存到内存/内存到外设

    目录 一、简介 1.DMA简介 2.一些概念 3.工作原理 二、HAL库的配置 1.时钟树的设置 2.DMA配置 2.1 内存到内存(代码对应3.1) 2.2 内存到外设(代码对应3.2) 三、代码编写 一、简介 1.DMA简介     DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包