完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不晓得是不是自己用寄存器操作习惯了,总是用不习惯STM32的HAL库,效率实在是有些低。特别是用到多个串口进行高速传输的应用,就一个入口函数,然后一个一个的callback调用,效率上讲,实在是有些差。于是自己尝试了一下,在基于STM32cube的基础上(借用一下Cube生成的初始化函数,还是有必要的),改成了寄存器操作版本。这样,GPIO口的初始化,时钟的初始化之类的操作,就利用了cube。。偷个懒吧。
我还是使用了STM32G070的开发板,利用板载的USART2。RX使用中断来接收,Tx为polling的方式。FIFO的阈值为1/8(没记错的话)。 MX_USART2_UART_Init(void)修改如下: static void MX_USART2_UART_Init(void) { ... ... ... /* USER CODE BEGIN USART2_Init 2 */ //启动单字节接收,实际上直接使用USART2->CR1这样调用也可以 huart2.Instance->CR1 |= USART_CR1_RE | USART_CR1_RXNEIE_RXFNEIE; huart2.Instance->CR1 |= USART_CR1_PEIE; /* USER CODE END USART2_Init 2 */ } 在中断函数USART2_IRQHandler修改为: unsigned char RxData[256];//用来测试接收的情况 unsigned char RxIndex; void USART2_IRQHandler(void) { if(USART2->ISR & USART_ISR_RXNE_RXFNE) //接收数据寄存器非空 { RxData[RxIndex++] = USART2->RDR; } } main函数中,进行循环发送测试: //在主循环中不停的发,来测试 unsigned int Delay = 60000; while(Delay--); USART2->TDR = 'a'; while(!(USART2->ISR & USART_ISR_TC)); USART2->TDR = '1'; while(!(USART2->ISR & USART_ISR_TC)); USART2->TDR = '3'; while(!(USART2->ISR & USART_ISR_TC)); USART2->TDR = '9'; while(!(USART2->ISR & USART_ISR_TC)); 以上只是个简单的例程,不涉及到错误的处理,例如帧错误,溢出错误等。如果要加这些功能,就需要额外对USART2进行寄存器配置操作。对应的中断函数,也需要额外的处理流程 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:53 , Processed in 0.623828 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号