完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
手把手配置HAL库串口的dma接收及程序编写
(1)首先在cubemx配置uart环境 1.首先在RCC中的high speed clock选择晶振 crystal. 2.在system core 中选中SYS,在右侧debug中选择serial wire. 在connectivity中选中USART1,mode选择asynchronous. 参数设置如图所示,我选择默认设置,波特率为115200。 这里面的不用管 在NVIC Settings中将USART global interrupt 的enabled选上。 点击添加add,点击select,选择dma请求 开启串口的dma发送与dma接收效果,如图所示 整体配置如图,只需要很少的配置。 最后点击 GENERATE CODE 完成框架的构建。 接下来是程序部分。 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); while (1) { } } 在打开程序会显示出这样的代码。 此时在while(1)加入一个UART_Receive_DMA()函数进行接收,然后回显出来。程序添加如下图,num为测量字符串长度,特定长度回显。 uint8_t buf[36]={0}; //假设num为2, while (1) { if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)buf, num)==0) { HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buf ,num); } } 或者也可以写在中断中,效果是一样的,不过在配置时要打开 __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);串口enabled. void USART1_IRQHandler(void) { if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)***us_rx_buf, 2)==0) { HAL_UART_Transmit_DMA(&huart1, (uint8_t *)***us_rx_buf ,2); } HAL_UART_IRQHandler(&huart1); } 要想实现接收数据据包,还需要进一步配置。 接下来我们具体配置一下串口的dma. 配置如下 #define RX_BUF_NUM 36u uint8_t cache[RX_BUF_NUM]={0}; DMA_config(&cache[0], RX_BUF_NUM); void DMA_config(uint8_t *rx_buf, uint16_t dma_buf_num) { SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); __HAL_DMA_DISABLE(&hdma_usart1_rx); while(hdma_usart1_rx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart1_rx); } hdma_usart1_rx.Instance->PAR = (uint32_t) & (USART1->DR); hdma_usart1_rx.Instance->M0AR = (uint32_t)(rx_buf); hdma_usart1_rx.Instance->M1AR = (uint32_t)(rx_buf); hdma_usart1_rx.Instance->NDTR = dma_buf_num; SET_BIT(hdma_usart1_rx.Instance->CR, DMA_SxCR_DBM); __HAL_DMA_ENABLE(&hdma_usart1_rx); } 这样,dma的config就完成了。 然后进行中断处理函数。 UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_tx; DMA_HandleTypeDef hdma_usart1_rx; oid USART1_IRQHandler(void) { if(huart1.Instance->SR & UART_FLAG_RXNE)//接收到数据 { __HAL_UART_CLEAR_PEFLAG(&huart1); } else if(USART1->SR & UART_FLAG_IDLE) { __HAL_UART_CLEAR_PEFLAG(&huart1); __HAL_DMA_DISABLE(&hdma_usart1_rx); hdma_usart1_rx.Instance->NDTR = RX_BUF_NUM; DMA1_Stream1->CR &= ~(DMA_SxCR_CT); __HAL_DMA_ENABLE(&hdma_usart1_rx); } } 中断函数写完 让我们看一下现象。此时我们发送了三个1给主控,发现函数内数值已经发生改变。 重现发送数据,观察更新。 现在就可以实现一些基本的功能了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:12 , Processed in 0.762915 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号