完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32双串口的使用
最近老是需要stm32通过串口去跟WiFi模块、蓝牙模块、openmv进行数据交互,然后需要用到stm32的串口调试,就把这个程序整理成一个工程,方便调试。 实验目的:外设模块(WiFi模块、蓝牙模块、openmv)发数据给stm32,然后stm32将数据发给上位机(电脑),以及电脑将数据发送给stm32,stm32将数据发给外设模块。 硬件:stm32F103zet6,openmv4,stlink。 一、初始化配置(hal库) 1、时钟设置 2、sys设置 3、配置串口1(用于stm32与电脑的数据交互)和串口3(stm32与外设模块的数据交互)(记得开启中断!!!!!!同时记得配置中断优先级) 4、设置几个led灯和蜂鸣器(个人喜欢用来检测程序运行到哪一步,比较直观)另外,我是用正点原子的,led0是PB5,beep是PB8,初始都设置为不亮,不响。 5、设置文件名以及ide,然后生成。 二、程序编写 首先,设置几个变量 #define MAX_rebuffsize 512//定义最大的接受字节数 #define my_timeout 1000//超时 uint8_t usart3_rebuff[MAX_rebuffsize];//定义串口三的接受数据 uint8_t usart3_rebuf;//串口3接受中断缓冲 uint16_t usart3_Rx_cnt=0; //用于中断计数 uint8_t usart1_rebuff[MAX_rebuffsize];//定义串口一的接受数据 uint8_t usart1_rebuf;//串口1接收中断缓冲 uint16_t usart1_Rx_cnt=0; 然后在main里面开启串口一和串口三的接收中断。 HAL_UART_Receive_IT(&huart1,(void *)&usart1_rebuf,1); HAL_UART_Receive_IT(&huart3,(void *)&usart3_rebuf,1);//每收到一个字 //节就进入中断 接下来就是整个回调函数的编写: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1) { if(usart1_Rx_cnt >= 511) //溢出判断 { usart1_Rx_cnt = 0; memset(usart1_rebuff,0x00,sizeof(usart1_rebuff)); HAL_UART_Transmit(&huart1, (uint8_t *)"usart1数据溢出rn", 16,0xFFFF); } else{ usart1_rebuff[usart1_Rx_cnt++] = usart1_rebuf; //接收数据转存 if((usart1_rebuff[usart1_Rx_cnt-1] == 0x0A)&&(usart1_rebuff[usart1_Rx_cnt-2] == 0x0D)) //判断结束位 { HAL_UART_Transmit(&huart3, usart1_rebuff, usart1_Rx_cnt,0xFFFF); //将收到的信息发送出去 while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束 usart1_Rx_cnt = 0; memset(usart1_rebuff,0x00,sizeof(usart1_rebuff)); //清空数组 } } HAL_UART_Receive_IT(&huart1,(void *)&usart1_rebuf,1); } else{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//判断是否进入串口三中断回调 if(usart3_Rx_cnt >= 511 )//溢出判断 { usart3_Rx_cnt = 0; memset(usart3_rebuff,0x00,sizeof(usart3_rebuff)); HAL_UART_Transmit(&huart1, (uint8_t *)"usart3数据溢出rn", 16,0xFFFF); } else{ usart3_rebuff[usart3_Rx_cnt++] = usart3_rebuf; //接收数据转存 if((usart3_rebuff[usart3_Rx_cnt-1] == 0x0A)&&(usart3_rebuff[usart3_Rx_cnt-2] == 0x0D)) //判断结束位 { HAL_UART_Transmit(&huart1, usart3_rebuff, usart3_Rx_cnt,0xFFFF); //将收到的信息发送出去 while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束 // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);//判读是否发出去 usart3_Rx_cnt = 0; memset(usart3_rebuff,0x00,sizeof(usart3_rebuff)); //清空数组 } } HAL_UART_Receive_IT(&huart3,(void *)&usart3_rebuf,1); } } 其中,led和蜂鸣器的函数可以随意写入你想检测的位置,看需要,也可以不写。 至此函数编写完毕,编译后直接烧入stm32,进行测试。 三、测试 ok大概就是这样子!希望对大家有点帮助。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 17:03 , Processed in 1.100817 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号