完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
自从ST推出了cubeMX工具以后,开发STM32系列的项目就变得非常简单了。
以串口为例,只需要简单配置一下串口的属性,然后自动生成项目代码,就可以直接发送数据了。 串口属性中NVIC中需要enable串口中断,这样可以实现高效串口收发。 PERIPHERALS MODES FUNCTIONS PINS SYS Serial Wire SYS_JTCK-SWCLK PA14 SYS Serial Wire SYS_JTMS-SWDIO PA13 SYS SysTick SYS_VS_Systick VP_SYS_VS_Systick USART1 Asynchronous USART1_RX PA10 USART1 Asynchronous USART1_TX PA9 Pin Nb PINs FUNCTIONs LABELs 21 PA5 GPIO_Output 42 PA9 USART1_TX 43 PA10 USART1_RX 46 PA13 SYS_JTMS-SWDIO 49 PA14 SYS_JTCK-SWCLK 不过配置好的项目代码在需要接收的场合使用并不太完善。但是通过阅读配置好的代码发现,示例代码提供了__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),既然是__weak,那就是我们可以重写这个函数,类似于C++的重载特性。所以只需要重构一下void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个回调函数,每次有接收中断产生后,程序就会自动调用这个回调函数。 所以我们只需要在这个回调函数中保存好接收的数据到接收缓冲区就能实现串口接收功能。 另外,在main函数增加接收数据结束判断UART1_ReceiveCHK(),以时间间隔大于30mS为结束条件,这样就可以实现完整的收发功能了。(当然,也可以参照AT命令的RN来判断结束,缺点是无法实现任意数据收发。) int main(void){ while (1) UART1_ReceiveCHK(); } 参见如下代码: /* USER CODE BEGIN 0 */ uint8_t uRxBuffer; //接收中断缓冲 uint8_t Uart1_RxBuffer[256]; //接收缓冲 uint8_t Uart1_RxCnt = 0; //接收缓冲计数 uint32_t Uart1_RxTime = 0; //最后接收时间 uint8_t cAlmStr[] = "Data Overflow(Max256)rn"; /***根据接收时间判断是否一次接收完成***/ void UART1_ReceiveCHK(void) { if(Uart1_RxCnt>0) { if(HAL_GetTick()-Uart1_RxTime>10)//一次接收结束 { HAL_UART_Transmit(&huart1, Uart1_RxBuffer, Uart1_RxCnt,0xFFFF); //将收到的信息发送出去 Uart1_RxCnt = 0; HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); HAL_UART_Receive_IT(&huart1, &uRxBuffer, 1); //使能接收中断 } } else if(HAL_GetTick()-Uart1_RxTime>300)//长时间无接收,重新启动接收中断 { Uart1_RxTime = HAL_GetTick(); HAL_UART_Receive_IT(&huart1, &uRxBuffer, 1); //使能接收中断 } } /***重载RXCALLBACK函数,实现接收数据缓存***/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart != &huart1)return; /* Prevent unused argument(s) compilation warning */ UNUSED(huart); if(Uart1_RxCnt >= 255) //溢出判断 { Uart1_RxCnt = 0; HAL_UART_Transmit(&huart1, cAlmStr, sizeof(cAlmStr),0xFFFF); } else { Uart1_RxBuffer[Uart1_RxCnt++] = uRxBuffer; //接收数据 Uart1_RxTime = HAL_GetTick(); //接收时间 } HAL_UART_Receive_IT(&huart1,&uRxBuffer, 1);//使能接收中断 } /* USER CODE END 0 */ 实测功能OK,截图如下: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:11 , Processed in 0.778644 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号