我照着GPS例程下的USART2写了一个USART3的文件,但无论如何串口3也不输出任何数据,大神帮忙看看是哪里出了问题

2019-10-14 23:20发布

[mw_shl_code=c,true]#include "delay.h" #include "usart3.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "usart2.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32开发板 //串口2驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2014/3/29 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //串口发送缓存区 __align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节 #ifdef USART3_RX_EN //如果使能了接收 //串口接收缓存区 u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节. //通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据. //如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到 //任何数据,则表示此次接收完毕. //接收到的数据状态 //[15]:0,没有接收到数据;1,接收到了一批数据. //[14:0]:接收到的数据长度 u16 USART3_RX_STA=0; void USART3_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据 { res =USART_ReceiveData(USART3); if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据 { TIM_SetCounter(TIM3,0);//计数器清空 if(USART3_RX_STA==0)TIM3_Set(1); //使能定时器4的中断 USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值 }else { USART3_RX_STA|=1<<15; //强制标记接收完成 } } } //初始化IO 串口3 //pclk1CLK1时钟频率(Mhz) //bound:波特率 void USART3_Init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); USART_DeInit(USART3); //复位串口3 //USART3_TX PB.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.2 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PA2 //USART3_RX PB.11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PA3 USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_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); //初始化串口 2 //波特率设置 // USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置 //USART2->CR1|=0X200C; //1位停止,无校验位. USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送 UART_DMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)USART3_TX_BUF);//DMA2通道3,外设为串口3,存储器为USART3_TX_BUF USART_Cmd(USART3, ENABLE); //使能串口 #ifdef USART3_RX_EN //如果使能了接收 //使能接收中断 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 TIM3_Init(99,7199); //10ms中断 USART3_RX_STA=0; //清零 TIM3_Set(0); //关闭定时器4 #endif } //串口3,printf 函数 //确保一次发送数据不超过USART2_MAX_SEND_LEN字节 void printf3(char* fmt,...) { va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); while(DMA_GetCurrDataCounter(DMA1_Channel2)!=0); //等待通道7传输完成 UART_DMA_Enable(DMA1_Channel2,strlen((const char*)USART3_TX_BUF)); //通过dma发送出去 } //定时器4中断服务程序 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断 { USART3_RX_STA|=1<<15; //标记接收完成 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 TIM3_Set(0); //关闭TIM4 } } //设置TIM4的开关 //sta:0,关闭;1,开启; void TIM3_Set(u8 sta) { if(sta) { TIM_SetCounter(TIM3,0);//计数器清空 TIM_Cmd(TIM3, ENABLE); //使能TIMx }else TIM_Cmd(TIM3, DISABLE);//关闭定时器4 } //通用定时器中断初始化 //这里始终选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 void TIM3_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//TIM4时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 } #endif[/mw_shl_code]
我把串口2 全改成了串口3 DMA也用了别的频道,定时器用的是定时器3,但串口就是不输出数据,串口1 2 正常输出数据,自己实在是找不出哪里错了。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
倾心成铭
1楼-- · 2019-10-15 17:36
原子哥用了定时器4做串口2的计时,我感觉不是随便的,我查了中文参考手册,


应该和定时器UP有关系,我就用了定时器2。。。。
倾心成铭
2楼-- · 2019-10-15 18:31
回复【7楼】桂电小手:
---------------------------------
回复在楼下,可以看看
桂电小手
3楼-- · 2019-10-15 18:50
回复【9楼】倾心成铭:
---------------------------------
谢谢,学习了
macunshi
4楼-- · 2019-10-16 00:37
 精彩回答 2  元偷偷看……
天外火星人
5楼-- · 2019-10-16 02:20
回复【11楼】macunshi:
---------------------------------
我的也是一样诶,你检查出什么问题没有?
千年莫凡
6楼-- · 2019-10-16 03:13
回复【6楼】倾心成铭:
---------------------------------
181行确定对吗?是DM1吧

一周热门 更多>