专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
求助原子哥,串口3为什么收不到数据
2019-07-21 08:35
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
5678
9
966
我在STM32 mini开发板串口例程的基础上把串口1的应用改成了串口3,同时用杜邦线把串口3的引脚(PB11,PB10)引到了串口芯片的引脚上,用串口助手发送数据,但是怎么就是收不到数据?用jtag观察程序,发现每发送一次,会进入接收中断,但是接收的数据是空的(0x01、0xb9之类的)。这到底是为什么啊,苦恼了好几天了?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
shuuger
2019-07-21 09:03
回复【楼主位】shuuger:
---------------------------------
下面是串口3的初始化和中断处理函数
#ifdef EN_USART3_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART3_RX_BUF[USART3_REC_LEN]; //串口3接收缓冲区,最大USART3_REC_LEN个字节,末字节为换行符
u8 USART3_RX_TEMP[USART3_REC_LEN]; //缓存串口3数据,全局变量
u16 usart3_rx_len; //串口3接收到的的字节数,全局变量
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u16 USART3_RX_STA=0; //串口3接收状态标记
u16 usart3_rx_cnt; //计数器
u16 as=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART3->SR&(1<<5))//接收到数据
{
res=USART3->DR;
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)
{
USART3_RX_STA=0;//接收错误,重新开始
}
else
{
as=0;
USART3_RX_STA|=0x8000; //接收完成了
usart3_rx_len=USART3_RX_STA&0x3fff; //获取接收到的数据长度
for(usart3_rx_cnt=0;usart3_rx_cnt<usart3_rx_len;usart3_rx_cnt++)//缓存串口数据
{
USART3_RX_TEMP[usart3_rx_cnt]=USART3_RX_BUF[usart3_rx_cnt];
}
}
}else //还没收到0X0D
{
if(res==0x0d)
{
USART3_RX_STA|=0x4000;
}
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
as++;
if(USART3_RX_STA>USART3_REC_LEN)USART3_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
#endif
//初始化IO 串口3
//pclk2
CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void usart3_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口3时钟
// RCC->APB2ENR|=1<<0; //开启辅助时钟
// AFIO->MAPR&=0XFFFFFFE7; //清除MAPR的[26:24]
GPIOB->CRH&=0XFFFF00FF; //PB11-RX,PB10-TX
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口3,只有串口1的寄存器在APB2RSTR中
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
//USART3->CR2&=0XCFFF; //1个停止位
#ifdef EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<8; //PE中断使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,抢占3,优先级2
#endif
}
加载中...
查看其它9个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
---------------------------------
下面是串口3的初始化和中断处理函数
#ifdef EN_USART3_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART3_RX_BUF[USART3_REC_LEN]; //串口3接收缓冲区,最大USART3_REC_LEN个字节,末字节为换行符
u8 USART3_RX_TEMP[USART3_REC_LEN]; //缓存串口3数据,全局变量
u16 usart3_rx_len; //串口3接收到的的字节数,全局变量
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u16 USART3_RX_STA=0; //串口3接收状态标记
u16 usart3_rx_cnt; //计数器
u16 as=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART3->SR&(1<<5))//接收到数据
{
res=USART3->DR;
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)
{
USART3_RX_STA=0;//接收错误,重新开始
}
else
{
as=0;
USART3_RX_STA|=0x8000; //接收完成了
usart3_rx_len=USART3_RX_STA&0x3fff; //获取接收到的数据长度
for(usart3_rx_cnt=0;usart3_rx_cnt<usart3_rx_len;usart3_rx_cnt++)//缓存串口数据
{
USART3_RX_TEMP[usart3_rx_cnt]=USART3_RX_BUF[usart3_rx_cnt];
}
}
}else //还没收到0X0D
{
if(res==0x0d)
{
USART3_RX_STA|=0x4000;
}
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
as++;
if(USART3_RX_STA>USART3_REC_LEN)USART3_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
#endif
//初始化IO 串口3
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void usart3_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口3时钟
// RCC->APB2ENR|=1<<0; //开启辅助时钟
// AFIO->MAPR&=0XFFFFFFE7; //清除MAPR的[26:24]
GPIOB->CRH&=0XFFFF00FF; //PB11-RX,PB10-TX
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口3,只有串口1的寄存器在APB2RSTR中
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
//USART3->CR2&=0XCFFF; //1个停止位
#ifdef EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<8; //PE中断使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,抢占3,优先级2
#endif
}
一周热门 更多>