在线时间30 小时
UID2017628
ST金币298
蝴蝶豆4
注册时间2013-6-8
该用户从未签到
高级会员
- 最后登录
- 2019-9-22
|
本帖最后由 yygkqzh 于 2017-5-4 14:14 编辑
最近买了一块STM32F407的板子,玩了较长时间,开发使用的是STM32CUBE,发现这个软件确实很实用,只要在软件界面进行选择,就可以帮你配置好各项参数。今天根据Paderboy的帖子【NUCLEO-L476RG开发】DMA-ADC1-串口不定长接收,也在自己的板子上搞了一把串口通过DMA方式接收数据,并通过显示接收到数据长度和接收到的数据。
下面上图:
配置时钟为外部高速时钟
配置串口1为异步收发模式
配置时钟为外部8MHz晶振,配置系统时钟168MHz
配置串口波特率115200,使能发送和接收
开启串口接收中断
使能DMA串口接收
配置NVIC
NVIC生成代码
然后输出代码 ,下面是在生成的代码中添加的。
变量定义
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- /* 可以接收的最大字符个数 */
- #define BUFFERSIZE 255
- uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
- uint8_t recv_end_flag = 0,Rx_len; //接收完成中断,接收到字符长度
- /* USER CODE END PV */
复制代码 函数声明
- /* USER CODE BEGIN PFP */
- /* Private function prototypes -----------------------------------------------*/
- void uartdamget(void);
- #ifdef __GNUC__
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- #else
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- #endif
- PUTCHAR_PROTOTYPE
- {
- HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
- return ch;
- }
- /* USER CODE END PFP */
复制代码 开启串口IDLE中断
- /* USER CODE BEGIN 2 */
- printf("This is a USART DMA Receive Test!!!\r\n");
- /* 使能串口1 IDLE中断 */
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
-
- /* USER CODE END 2 */
复制代码 while(1)循环
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- uartdamget();
-
- /* USER CODE END WHILE */
复制代码 串口DMA获取
- /* USER CODE BEGIN 4 */
- void uartdamget(void)
- {
- if(recv_end_flag ==1)
- {
- /* 打印接收到的数据长度 */
- printf("\nrx_len=%d\r\n",Rx_len);
- for(int i=0;i<Rx_len;i++)
- {
- /* 打印接收到的数据 */
- printf("%c",ReceiveBuff[i]);
- }
- printf("\r\n");
- /* 清空接收缓存区 */
- for(int i = 0; i < Rx_len ; i++)
- ReceiveBuff[i]=0;
- /* 接收数据长度清零 */
- Rx_len=0;
- recv_end_flag=0;
- }
- /* 开启下一次接收 */
- HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
- }
- /* USER CODE END 4 */
复制代码 #include "stm32f4xx_it.c"文件中断外部变量引用
- /* USER CODE BEGIN 0 */
- #define BUFFERSIZE 255
- extern uint8_t recv_end_flag,Rx_len,bootfirst;
- /* USER CODE END 0 */
复制代码 串口1中断函数
- /**
- * @brief This function handles USART1 global interrupt.
- */
- void USART1_IRQHandler(void)
- {
- /* USER CODE BEGIN USART1_IRQn 0 */
- /* USER CODE END USART1_IRQn 0 */
- HAL_UART_IRQHandler(&huart1);
- /* USER CODE BEGIN USART1_IRQn 1 */
- uint32_t temp;
- /* 如果是串口1中断 */
- if(USART1 == huart1.Instance)
- { /* 如果是串口1IDLE中断 */
- if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)){
- /* 清除中断标志 */
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
- /* 停止DMA接收 */
- HAL_UART_DMAStop(&huart1);
- /* 获取DMA当前还有多少未填充 */
- temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
- /* 计算串口接收到的数据个数 */
- Rx_len = BUFFERSIZE - temp;
- recv_end_flag = 1;
- }
- }
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码 将程序下载到板子后,使用串口调试助手发送数据到MCU,
下面是源代码
USART DMA Receive.zip
(578.77 KB, 下载次数: 926)
|
评分
-
查看全部评分
|