STM32H7使用串口DMA避坑指南

缓冲区设定 使用RAM_D2作为读写缓冲区配置 STM32H7 _ _ _ _ _ x_FLASH.ld配置 .dma_buffer : /* 冒号前有一个空格 */ { *(.dma_buffer) } >RAM_D2 然后在需要进行读写缓冲区的文件中添加以下定义: /// 这里通过宏定义来定义DMA_BUFFER /// __ICCARM__:表示 IAR EWARM 编译器 /// 所以如果是GCC的话就使用else块中的定义了 #if defined( __ICCARM__ ) #define DMA_BUFFER \ _Pragma("location=\".dma_buffer\"") #else #define DMA_BUFFER \ __attribute__((section(".dma_buffer"))) #endif #define BUFFER_SIZE 256 DMA_BUFFER uint8_t tx_buffer[BUFFER_SIZE]; static uint8_t tx_idx = 0; DMA_BUFFER uint8_t rx_buffer[BUFFER_SIZE]; 串口异常处理函数 如果不对串口异常进行处理,清理相关错误标记,可能无法继续执行中断函数 /// 错误码是定义如下 #define HAL_UART_ERROR_NONE (0x00000000U) /*!< No error */ #define HAL_UART_ERROR_PE (0x00000001U) /*!< Parity error */ #define HAL_UART_ERROR_NE (0x00000002U) /*!< Noise error */ #define HAL_UART_ERROR_FE (0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE (0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ #define HAL_UART_ERROR_RTO (0x00000020U) /*!< Receiver Timeout error */ /// 下面错误处理函数中把奇偶校验错误以及数据溢出错误标志清除 /// 可以直接在调试时打断点查看huart->ErrorCode的值 void HAL_UART_ErrorCallback(UART_HandleTypeDef* huart) { if (huart->Instance == USART6) { __HAL_UART_CLEAR_OREFLAG(huart); __HAL_UART_CLEAR_PEFLAG(huart); huart->RxState = HAL_UART_STATE_READY; HAL_UARTEx_ReceiveToIdle_DMA(huart, rx_buffer, BUFFER_SIZE); __HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT); } } 关闭半中断 在调用HAL_UARTEx_ReceiveToIdle_DMA函数时默认打开“半中断”,数据在接收到一半(左右)时会触发HAL_UARTEx_RxEventCallback回掉函数, 如果仅需要处理完整数据的可以在调用HAL_UARTEx_ReceiveToIdle_DMA函数后直接执行__HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT);,即可关闭半中断 ...

April 7, 2025 · 2 min · 375 words · noxrick91

Rust嵌入式开发embassy环境搭建

先配置Rust开发STM32所需的环境,文章地址: https://fake-rick.github.io/posts/rust%E9%85%8D%E7%BD%AEstm32%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/ 安装项目创建CLI工具 cargo install cargo-embassy 生成项目 cargo embassy init my_project --chip stm32f407vgtx 在Cargo.toml中[dependencies]添加: embassy-stm32 = { version = "0.1.0", features = ["defmt", "stm32f407vg", "unstable-pac", "memory-x", "time-driver-any", "exti", "chrono"] } Embed.toml文件 # This file was automatically generated. [default.general] chip = "STM32F407VGTx" [default.reset] halt_afterwards = false [default.rtt] enabled = true [default.gdb] enabled = false 运行 cargo run 如果在终端出现以下内容则表示运行成功:

August 5, 2024 · 1 min · 57 words · noxrick91

Rust配置STM32嵌入式开发环境

安装 安装cargo工具 cargo install cargo-generate 安装stlink v2驱动 sudo apt-get install git make cmake libusb-1.0-0-dev sudo apt-get install gcc build-essential git clone https://github.com/stlink-org/stlink.git cd stlink/ mkdir build cd build cmake .. make cd bin/ sudo cp st-* /usr/local/bin cd ../lib/ sudo cp *.so* /lib32 cd ../../ sudo cp config/udev/rules.d/49-stlinkv* /etc/udev/rules.d/ 安装烧录和调试的工具 Linux, macOS curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.sh | sh WIndows irm https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.ps1 | iex 安装适用于ARM Cortex-M目标的rust-std组件 rustup target add thumbv6m-none-eabi thumbv7m-none-eabi thumbv7em-none-eabi thumbv7em-none-eabihf ...

August 4, 2024 · 1 min · 132 words · noxrick91