完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
单片机STM32F103R8T6,环境IAR8.22
请各位大神帮忙看下: /******************************************************************************* * Function Name : void USART3_Init(u32 baud) * Description : 初始化USART2 TX A2 RX A3* Input : 无 * Output : 无 * Return : 无 *******************************************************************************/ void USART3_Init(u32 baud) { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 USART_InitTypeDef USART_InitStructure; //定义结构体 // NVIC_InitTypeDef NVIC_InitStruct; // 第1步:打开GPIO和USART部件的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//打开PIOA口的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //打开UART_3的时钟 // 第2步:将USART Tx的GPIO(PB10)配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置PB口时钟 GPIO_Init(GPIOB, GPIO_InitStructure); //第3步:将USART Rx的GPIO配置为浮空输入模式 // 将USART Rx的GPIO(PB11)配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置PB口时钟 GPIO_Init(GPIOB, GPIO_InitStructure); //第4步:配置USART参数 USART_InitStructure.USART_BaudRate =baud; //设置波特率4800、9600、19200、38400、115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据 USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流量控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接受和发送使能 USART_Init(USART3, USART_InitStructure); // 串口3初始化 // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 开启 USART 接收缓冲区非空中断 // USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启 USART 发送缓冲区空中断 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); //开启 USART1 总线空闲中断 //第5步:使能 USART, 配置完毕 USART_Cmd(USART3, ENABLE); //使能或失能USART USART_ClearFlag(USART3, USART_FLAG_TC); //清除发送完成标志 USART3_DMA_TxConfig(); } void USART3_DMA_TxConfig(void) { DMA_InitTypeDef DMA_InitStruct; /*开启DMA时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_Cmd(DMA1_Channel2,DISABLE); //close DMA Channel DMA_DeInit(DMA1_Channel2); /*设置DMA源:串口数据寄存器地址*/ DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)( USART3->DR); //内存--->外设 /*内存地址(要传输的变量的指针)*/ DMA_InitStruct.DMA_MemoryBaseAddr = (u32)uart3.sendBuf; /*方向:从内存到外设*/ DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStruct.DMA_BufferSize = uart3.sendLen; /*外设地址不增*/ DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:不断循环*/ DMA_InitStruct.DMA_Mode = DMA_Mode_Normal ; // DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; /*优先级:中*/ DMA_InitStruct.DMA_Priority = DMA_Priority_Medium; /*禁止内存到内存的传输 */ DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; /*配置DMA1的2通道*/ DMA_Init(DMA1_Channel2, DMA_InitStruct); DMA_ClearFlag(DMA1_FLAG_GL4); //DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断 DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE); //open DMA send inttrupt /*使能DMA*/ // DMA_Cmd (DMA1_Channel2,ENABLE); USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); } //下面是调试函数,每500ms调用一次,执行一次发送 int debug = 0; void USART3_DealRev(void) { static long t=0; t++; if(t>2) { debug = 2; t = 0; } if(debug == 1) { for(int i= 0; i<50; i++) uart3.sendBuf[i] = i+1; uart3.sendLen = 50; USART3_SendData((unsigned char *)uart3.sendBuf,uart3.sendLen ); uart3.sendLen = 0; debug = 0; } else if(debug == 2) { for(int i= 0; i<50; i++) uart3.sendBuf[i] = i+1; DMA_SetCurrDataCounter(DMA1_Channel2, 50); DMA_Cmd (DMA1_Channel2,ENABLE); debug = 0; } } //中断函数一直不进入 void DMA1_Channel2_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1)) { uart3.sendLen = 0; DMA_ClearITPendingBit(DMA1_IT_GL1); //清除全部中断标志 DMA_Cmd(DMA1_Channel2, DISABLE); //处理完,重开DMA } } |
|
相关推荐
1个回答
|
|
|
首先,需要确保USART3使用的DMA通道及其相关寄存器已正确配置。其次,在发送完成后,需要重新配置DMA通道以便进行下一次发送。
下面是一个可能的解决方案,供参考: 1. 确保已正确配置USART3以及相关GPIO引脚,如下所示: ```c void USART3_Init(u32 baud) { // 初始化USART3寄存器 USART3->CR1 = USART_CR1_TE; // 使能USART3发送使能 USART3->CR2 = 0; USART3->CR3 = 0; USART3->BRR = (u16)(USART_CLOCK / baud); // 设置波特率 // 初始化相关GPIO引脚 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB的时钟 GPIOB->CRH &= ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10 | GPIO_CRH_MODE11); // 复位GPIOB10和GPIOB11的控制寄存器 GPIOB->CRH |= (GPIO_CRH_MODE10_3 | GPIO_CRH_CNF10_1); // GPIOB10复用推挽输出 GPIOB->CRH |= GPIO_CRH_CNF11_0; // GPIOB11浮空输入 } ``` 2. 配置USART3使用的DMA通道,确保DMA相关寄存器已正确设置,如下所示: ```c void USART3_DMA_Init(void) { DMA1_Channel2->CPAR = (u32)&USART3->DR; // 设置DMA1通道2的外设地址为USART3的数据寄存器地址 DMA1_Channel2->CMAR = (u32)&tx_buffer; // 设置DMA1通道2的存储器地址为发送缓冲区的地址 DMA1_Channel2->CNDTR = tx_len; // 设置DMA1通道2的传输数据量,即发送的字节数 DMA1_Channel2->CCR = DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 配置DMA1通道2为读传输模式,使能存储器增量模式,使能传输完成中断 DMA1_Channel2->CCR |= DMA_CCR_EN; // 使能DMA1通道2 } ``` 3. 编写发送函数,使用DMA发送数据: ```c void USART3_SendDataDMA(u8* data, u32 len) { memcpy(tx_buffer, data, len); // 将要发送的数据复制到发送缓冲区 DMA1_Channel2->CCR &= ~DMA_CCR_EN; // 关闭DMA1通道2,以便重新配置 DMA1_Channel2->CNDTR = len; // 设置DMA1通道2的传输数据量,即发送的字节数 DMA1_Channel2->CCR |= DMA_CCR_EN; // 重新使能DMA1通道2 USART3->CR1 &= ~USART_CR1_TE; // 关闭USART3的发送使能 USART3->CR1 |= USART_CR1_TE; // 重新使能USART3的发送使能 } ``` 4. 在发送完成中断中重新配置DMA通道以进行下一次发送: ```c void DMA1_Channel2_IRQHandler(void) { if(DMA1->ISR & DMA_ISR_TCIF2) // 检查DMA1通道2的传输完成中断标志位 { DMA1->IFCR = DMA_IFCR_CTCIF2; // 清除DMA1通道2的传输完成中断标志位 // 在这里重新配置DMA1通道2以进行下一次发送 // 重新配置USART3的发送使能 USART3->CR1 &= ~USART_CR1_TE; USART3->CR1 |= USART_CR1_TE; } } ``` 请注意,这只是一个可能的解决方案,并且可能需要根据实际情况进行调整。确保DMA通道和USART3的配置都正确,并在发送完成后重新配置DMA通道和USART3的发送使能。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4207 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3263 浏览 1 评论
2796 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2227 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15169 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3169浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1942浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2110浏览 3评论
2020浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2218浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 07:29 , Processed in 0.598796 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
740