完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。 串口1的初始化: //使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明 void STM32LLUart1Init(void) { LL_USART_InitTypeDef UART_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); //使能GPIO时钟 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); //使能串口1时钟 GPIO_InitStruct.Pin = bspUART1_TX_PIN; //TXPin指定 GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; //io模式配置为复用模式 GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; //设置为高速率 GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; //设置为推挽输出 GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; //不带上拉 GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = bspUART1_RX_PIN; //TXPin指定 GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); NVIC_SetPriority(USART1_IRQn, 0); //开启串口中断 NVIC_EnableIRQ(USART1_IRQn); UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; //设置时钟预分频 UART_InitStruct.BaudRate = 115200; //设置串口通信波特率 UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据位 UART_InitStruct.StopBits = LL_USART_STOPBITS_1; //1位停止位 UART_InitStruct.Parity = LL_USART_PARITY_NONE; //奇偶校验关闭 UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开 UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭 UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; //数据采样频率倍数设置 LL_USART_Init(USART1, &UART_InitStruct); LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧 LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8 LL_USART_DisableFIFO(USART1); //因为使用dma接收,关闭FIFO LL_USART_ConfigAsyncMode(USART1); //其他基本配置 LL_USART_Enable(USART1); //使能串口 while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))); //检查相关标志位 LL_USART_EnableIT_IDLE(USART1); //使能空闲中断 LL_USART_EnableIT_ERROR(USART1); //使能错误中断 } 串口中断处理函数: void USART1_IRQHandler(void) { uint32_t isr_reg = 0; isr_reg = LL_USART_ReadReg(USART1, ISR); if (LL_USART_IsActiveFlag_IDLE(USART1)) { LL_USART_ClearFlag_IDLE(USART1); //设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内, //这里可能需要对收取到缓存的数据做一些操作。 } LL_USART_WriteReg(USART1,ICR,isr_reg) } 串口发送函数: void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length) { uint16_t i = 0; for(i=0;i while(!LL_USART_IsActiveFlag_TXE(USART1)); LL_USART_TransmitData8(USART1,buffer); } } 串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试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 07:23 , Processed in 0.668399 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号