OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4595|回复: 3

STM32F103 USART2接收数据不正常

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-8-26
在线时间
0 小时
发表于 2015-8-26 10:13:24 | 显示全部楼层 |阅读模式
5金钱

void MY_USART2_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;//I/O?ú3?ê??ˉ?á11ì?
    NVIC_InitTypeDef NVIC_InitStructure;//?D??3?ê??ˉ?á11ì?
    USART_InitTypeDef USART_InitStructure;//′??ú3?ê??ˉ?á11ì?  
    
    /* Enable the USART2 Pins Software Remapping */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 
    
    
    /* Configure USART2 Rx (PA.03) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
/*
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    */
    /* Enable the USART2 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);    
    
    USART_InitStructure.USART_BaudRate = 250000;                //ò?°?éè???a9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×?3¤?a8??êy?Y??ê?
    USART_InitStructure.USART_StopBits = USART_StopBits_2;     //ò???í£?1??
    USART_InitStructure.USART_Parity = USART_Parity_No;        //?T????D£?é??
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//Yá÷????
    USART_InitStructure.USART_Mode = USART_Mode_Rx; //ê?·¢?£ê?   
    
    USART_Init(USART2, &USART_InitStructure);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
    /* Enable USART2 */
    USART_Cmd(USART2, ENABLE);
}
uint16_t DmxData[20] = {0};
uint16_t DmxHeadFlag = 0;
uint16_t UDR = 0;
uint8_t OpenRecFlag = 0;
void USART2_IRQHandler(void)
{  
static uint8_t dmxaddress = 0;  
if(USART2->SR&(1<<5))//接收到数据
{  
    UDR = USART2->DR;
    USART2->SR &= ~(1<<5);


是想接收DMX512信号的,250K,1个开始位,8个数据位,2个结束位。但一直不正常。收不到数据,求大神搭救,好几天了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-26 10:46:42 | 显示全部楼层
怎么又有一个uart2的问题贴?
你用原子开发板还是用自己的板子做的? 
试试论坛搜索吧 有好多uart2收不到数据的帖子,应该能帮到你
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-8-26
在线时间
0 小时
 楼主| 发表于 2015-8-26 11:20:38 | 显示全部楼层
回复【2楼】Fliger:
---------------------------------
对比过了,也是根据例子改的,比较奇怪,USART2_SR里面的值有FE出错误还有ORE出错,中断进来了一直无数据。BBR的值是0x00000090,FPCLK是36M,算下来应该就是250K的波特率了,但接收不到数据
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-8-26
在线时间
0 小时
 楼主| 发表于 2015-8-26 14:37:49 | 显示全部楼层
网上查了下,据说ORE出错要先清掉ORE再读数据。我改了下
uint16_t DmxData[20] = {0};
uint16_t DmxHeadFlag = 0;
uint16_t UDR = 0;
uint8_t OpenRecFlag = 0;
void USART2_IRQHandler(void)
{  
static uint8_t dmxaddress = 0;  
if(USART2->SR&(1<<5))//接收到数据
{  
USART2->SR &= (~((1<<5)|(1<<4)));
UDR = USART2->DR;
DmxHeadFlag =  UDR&0x100;
if(DmxHeadFlag == 0)
{
dmxaddress = 0;
OpenRecFlag = 1;
dmxaddress = 0;
}
else
{
if(OpenRecFlag)
{
DmxData[dmxaddress] = UDR&0xff;
}
if(++dmxaddress > 10)
{
OpenRecFlag = 0;
}
}

}


能接到数据,但数据不对。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表