国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Clion開發(fā)STM32之HAL庫USART封裝(基礎(chǔ)庫)

這篇具有很好參考價(jià)值的文章主要介紹了Clion開發(fā)STM32之HAL庫USART封裝(基礎(chǔ)庫)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

引用參考:文章來源地址http://www.zghlxwxcb.cn/news/detail-633593.html

  1. Clion開發(fā)STM32之HAL庫GPIO宏定義封裝(最新版)

頭文件

/*******************************************************************************
 * Copyright (c) [scl]。保留所有權(quán)利。
 *      本文僅供個(gè)人學(xué)習(xí)和研究使用,禁止用于商業(yè)用途。
 ******************************************************************************/
#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 /*為了保證驅(qū)動(dòng)的獨(dú)立性*/
#define sys_force_static_inline      __attribute__((always_inline)) static inline
#define error_handle()
#endif
#define COM_DEFAULT_CNF {\
                .BaudRate = 115200, /*波特率*/\
                .WordLength = UART_WORDLENGTH_8B,/*數(shù)據(jù)寬度*/\
                .StopBits = UART_STOPBITS_1,/*停止位*/\
                .Parity = UART_PARITY_NONE,/*校驗(yàn)位*/\
                .Mode = UART_MODE_TX_RX,/*讀寫模式*/\
                .HwFlowCtl = UART_HWCONTROL_NONE,/*硬件控制*/\
                .OverSampling = UART_OVERSAMPLING_16,/*采樣率*/\
        }

/** @brief  檢查是否設(shè)置了指定的 UART 標(biāo)志。
  * @param  __UART__ 具體串口實(shí)例.
  * @param  __FLAG__ 具體標(biāo)志位
  *        此參數(shù)可以是以下值之一:
  *            @arg UART_FLAG_CTS:  CTS 更改標(biāo)志(不適用于 UART4 和 UART5)
  *            @arg UART_FLAG_LBD:  LIN 中斷檢測標(biāo)志
  *            @arg UART_FLAG_TXE:  傳輸數(shù)據(jù)寄存器空標(biāo)志
  *            @arg UART_FLAG_TC:   傳輸完成標(biāo)志
  *            @arg UART_FLAG_RXNE: 接收數(shù)據(jù)寄存器不為空標(biāo)志
  *            @arg UART_FLAG_IDLE: 空閑線路檢測標(biāo)志
  *            @arg UART_FLAG_ORE:  溢出錯(cuò)誤標(biāo)志
  *            @arg UART_FLAG_NE:   噪聲錯(cuò)誤標(biāo)志
  *            @arg UART_FLAG_FE:   幀錯(cuò)誤標(biāo)志
  *            @arg UART_FLAG_PE:   奇偶校驗(yàn)錯(cuò)誤標(biāo)志
  * @retval 狀態(tài)(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  使能具體的中斷源標(biāo)志位
  * @param  __UART__ 具體串口實(shí)例
  * @param  __INTERRUPT__  中斷源
  *          此參數(shù)可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 中斷
  *            @arg UART_IT_LBD:  LIN中斷檢測中斷
  *            @arg UART_IT_TXE:  發(fā)送數(shù)據(jù)寄存器空中斷
  *            @arg UART_IT_TC:   傳輸完成中斷
  *            @arg UART_IT_RXNE: 接收數(shù)據(jù)寄存器不為空中斷
  *            @arg UART_IT_IDLE: 空閑線路檢測中斷
  *            @arg UART_IT_PE:   奇偶校驗(yàn)錯(cuò)誤中斷
  *            @arg UART_IT_ERR:  錯(cuò)誤中斷(幀錯(cuò)誤, 噪聲錯(cuò)誤, 溢出錯(cuò)誤)
  * @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 具體的中斷源標(biāo)志位.
  * @param  __UART__ 具體串口實(shí)例.
  * @param  __INTERRUPT__ 指定要禁用的 UART 中斷源.
  *          此參數(shù)可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 中斷
  *            @arg UART_IT_LBD:  LIN中斷檢測中斷
  *            @arg UART_IT_TXE:  發(fā)送數(shù)據(jù)寄存器空中斷
  *            @arg UART_IT_TC:   傳輸完成中斷
  *            @arg UART_IT_RXNE: 接收數(shù)據(jù)寄存器不為空中斷
  *            @arg UART_IT_IDLE: 空閑線路檢測中斷
  *            @arg UART_IT_PE:   奇偶校驗(yàn)錯(cuò)誤中斷
  *            @arg UART_IT_ERR:  錯(cuò)誤中斷(幀錯(cuò)誤, 噪聲錯(cuò)誤, 溢出錯(cuò)誤)
  * @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 串口錯(cuò)誤標(biāo)志位判斷 并清除
 */
#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回調(diào)-------------------------------------------------*/
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回調(diào)-------------------------------------------------*/
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回調(diào)-------------------------------------------------*/
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 框架不實(shí)現(xiàn),需要重新定義此方法
    //    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    //    HAL_NVIC_EnableIRQ(USART1_IRQn);
}

__weak void com1_it_msp_de_init(void) {
    /* USART1 interrupt Deinit */
    //  @note 框架不實(shí)現(xiàn),需要重新定義此方法
    //    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 框架不實(shí)現(xiàn),需要重新定義此方法
    //    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 框架不實(shí)現(xiàn),需要重新定義此方法
    //    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*/

到了這里,關(guān)于Clion開發(fā)STM32之HAL庫USART封裝(基礎(chǔ)庫)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM-32:USART串口協(xié)議、串口外設(shè)—數(shù)據(jù)發(fā)送/數(shù)據(jù)發(fā)送+接收

    STM-32:USART串口協(xié)議、串口外設(shè)—數(shù)據(jù)發(fā)送/數(shù)據(jù)發(fā)送+接收

    通信的目的:將一個(gè)設(shè)備的數(shù)據(jù)傳送到另一個(gè)設(shè)備,擴(kuò)展硬件系統(tǒng)。比如STM32芯片里面集成了很多功能模塊,如定時(shí)器計(jì)數(shù)、PWM輸出、AD采集等等,這些都是芯片內(nèi)部的電路,它們的配置寄存器、數(shù)據(jù)寄存器都在芯片里面,操作簡單,直接讀寫就行。但是有些功能STM32內(nèi)部沒有

    2024年02月04日
    瀏覽(93)
  • 普中STM32-PZ6806L開發(fā)板(HAL庫函數(shù)實(shí)現(xiàn)-USART1 printf+scanf/gets)

    普中STM32-PZ6806L開發(fā)板(HAL庫函數(shù)實(shí)現(xiàn)-USART1 printf+scanf/gets)

    實(shí)現(xiàn)printf+scanf/gets通過USART1 的發(fā)送接收。 主芯片串口引腳圖 我的板子板子自帶串口壞掉了, 所以使用USB轉(zhuǎn)TTL線, 連接如下 電路原理圖 實(shí)物圖 scanf是以空白符(空格、制表符、換行等等)為結(jié)束標(biāo)志的,當(dāng)遇到空白符是就會(huì)結(jié)束一次輸入,如果你需要讀取空格的話可以使用gets或者

    2024年02月04日
    瀏覽(22)
  • STM32 HAL庫 STM32CubeMx -- 串口的使用(USART/UART)

    STM32 HAL庫 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面寫了串口通信的理論知識(shí),在這一篇中將講述串口通信在STM32CubeMx里面的配置,以及在函數(shù)里面怎么使用。 對(duì)于串口發(fā)送信息,分為三種方法: 串口阻塞方式收發(fā) 、 串口中斷方式收發(fā) 、 串口DMA方式收發(fā) 。(DMA方式在之后的DMA章節(jié)講解) 關(guān)于STM32CubeMx的基

    2024年02月06日
    瀏覽(26)
  • HAL庫STM32CUBEMX學(xué)習(xí)記錄(一)——USART(串口中斷收發(fā)數(shù)據(jù))

    HAL庫STM32CUBEMX學(xué)習(xí)記錄(一)——USART(串口中斷收發(fā)數(shù)據(jù))

    一、首先使用STM32CUBEMX新建一個(gè)工程 二、打開工程文件 1.在usart.c中添加以下代碼 ?2.然后在最后面加入中斷回調(diào)函數(shù) 3.在usart.h文件中加入 ?4.新建一個(gè)cmd.c文件,創(chuàng)建命令check函數(shù) 5.在mian函數(shù)中的while(1)循環(huán)中調(diào)用USART1_Check(USART_RX_BUF)函數(shù) 6.最后串口初始化函數(shù)后打開串口中

    2024年02月16日
    瀏覽(29)
  • STM32 HAL庫開發(fā)——基礎(chǔ)篇

    STM32 HAL庫開發(fā)——基礎(chǔ)篇

    一、基礎(chǔ)知識(shí) 1.1 Cortex--M系列介紹 1.2 什么是stm32 1.3 數(shù)據(jù)手冊(cè)查看 1.4 最小系統(tǒng)和 IO 分配? 1.4.1 電源電路 1.4.2 復(fù)位電路 1.4.3 BOOT 啟動(dòng)電路 1.4.4 晶振電路 1.4.5 下載調(diào)試電路 1.4.6 串口一鍵下載電路? 1.4.7 IO 分配? 1.4.8 總結(jié)? 1.5 開發(fā)工具 1.6 下載 二、 代碼、工程相關(guān) 2.1 文本美化

    2024年02月07日
    瀏覽(21)
  • # HAL庫STM32常用外設(shè)教程(四)—— 定時(shí)器 基本定時(shí)

    # HAL庫STM32常用外設(shè)教程(四)—— 定時(shí)器 基本定時(shí)

    1、STM32F407ZGT6 2、STM32CubeMx軟件 3、keil5 內(nèi)容簡述: 通篇文章將涉及以下內(nèi)容,如有錯(cuò)誤,歡迎指出 : 1、基礎(chǔ)定時(shí)器特性 2、基礎(chǔ)定時(shí)器的結(jié)構(gòu)和功能 3、基礎(chǔ)定時(shí)器HAL庫驅(qū)動(dòng)程序 (1)CubeMx配置 (2)TIM驅(qū)動(dòng)程序 ??STM32F407有2個(gè)高級(jí)控制定時(shí)器(TIM1、TIM8)、8個(gè)通用定時(shí)器和

    2024年02月02日
    瀏覽(22)
  • HAL庫STM32常用外設(shè)教程(五)—— 定時(shí)器 輸出比較

    HAL庫STM32常用外設(shè)教程(五)—— 定時(shí)器 輸出比較

    有關(guān)于定時(shí)器 輸出PWM功能 不了解的可以看這篇文章 :HAL庫STM32常用外設(shè)教程(一)—— 定時(shí)器 輸出PWM 有關(guān)于定時(shí)器 定時(shí)功能 不了解的可以看這篇文章 :HAL庫STM32常用外設(shè)教程(四)—— 定時(shí)器 基本定時(shí) 1、STM32F407ZGT6 2、STM32CubeMx軟件 3、keil5 內(nèi)容簡述: 通篇文章將涉及以

    2024年03月27日
    瀏覽(19)
  • HAL庫STM32常用外設(shè)教程(一)—— 定時(shí)器 輸出PWM

    HAL庫STM32常用外設(shè)教程(一)—— 定時(shí)器 輸出PWM

    本篇文章為個(gè)人參考總結(jié)所用,如果錯(cuò)誤還望指出。 涉及的知識(shí): 1、STM32CubeMx的部分使用 2、PWM原理及常用概念 3、用單片機(jī)生成一定頻率的PWM 用到的軟件及單片機(jī): 1、STM32CubeMx 2、IDE: MDK-Keil軟件 3、芯片:STM32F407ZGT6 4、開發(fā)板:正點(diǎn)原子探索者 注:不同型號(hào)的單片機(jī)實(shí)現(xiàn)

    2024年02月02日
    瀏覽(16)
  • STM32 hal庫使用筆記(四)DMA—內(nèi)存到內(nèi)存/內(nèi)存到外設(shè)

    STM32 hal庫使用筆記(四)DMA—內(nèi)存到內(nèi)存/內(nèi)存到外設(shè)

    目錄 一、簡介 1.DMA簡介 2.一些概念 3.工作原理 二、HAL庫的配置 1.時(shí)鐘樹的設(shè)置 2.DMA配置 2.1 內(nèi)存到內(nèi)存(代碼對(duì)應(yīng)3.1) 2.2 內(nèi)存到外設(shè)(代碼對(duì)應(yīng)3.2) 三、代碼編寫 一、簡介 1.DMA簡介 ? ? DMA(Direct Memory Access)直接存儲(chǔ)器存取 DMA可以提供外設(shè)和存儲(chǔ)器或者存儲(chǔ)器和存儲(chǔ)器之

    2024年02月04日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包