OpenEdv-开源电子网

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

stm32f031 串口配置问题

[复制链接]

7

主题

31

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-2-14
在线时间
8 小时
发表于 2016-5-27 16:41:35 | 显示全部楼层 |阅读模式
10金钱

最近在配置串口(stm32f031),出现一个问题,就是初始化串口中,使能发送接收中断(并没有任何的外部数据传输),就立即进入发送中断,而且一直不出中断。
原子哥,帮托帮忙看一下,谢谢:)

void send(void)

{

  USART1->TDR=res;

while((USART1->ISR&0X40)==0);

  

}


void USART1_IRQHandler(void)

{


if(USART1->ISR&(1<<5))

{            

    res=USART1->RDR;

  }


}

voidUsart1_Init(uint32_t pclk, uint32_t bound)

{

float temp;

uint16_t mantissa;

uint16_t fraction;            

  temp=(float)(pclk*1000000)/(bound*16);//得到USARTDIV

mantissa=temp;                                                            //ingeter part

fraction=(temp-mantissa)*16; //decimal part   

  mantissa<<=4;

mantissa+=fraction;

   RCC->AHBENR|=1<<17;  //enable GPIOA clock  

   RCC->APB2ENR|=1<<14; //enable usart1 clock

  

   GPIOA->MODER&=0XFFC3FFFF;//PA9usart1_Tx/ PA10 usart1_Rx

  GPIOA->MODER|=0X000800000;//MODER9 =10

  GPIOA->OTYPER&=~(1<<9);

  GPIOA->OTYPER&=~(1<<10);

  GPIOA->PUPDR&=0XFFC0FFFF;

  

   RCC->APB2RSTR|=(1<<14); //reset usart1

  RCC->APB2RSTR&=~(1<<14);// stop to reset usart1

   

   //USART1->CR1|=1<<15; //oversampling by 8

   

   //波特率设置

   USART1->BRR=mantissa; //

   USART1->CR1|=0X0D;  //

   

    NVIC_SetPriority(USART1_IRQn,2u);

   NVIC_EnableIRQ(USART1_IRQn);   

   


   USART1->CR1|=1<<5;  //receive interrupt enable

   USART1->CR1|=1<<7;  //transfer interrupt enable

   

  

}

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

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-27 16:46:15 | 显示全部楼层
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-5-28 16:20:20 | 显示全部楼层
pthread 发表于 2016-5-27 16:46
不清下中断PENDING位么

传输的中断,一般取数、或者把一个新的要传送的数放进去相应寄存器就自动清除了
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-6-1 10:28:57 | 显示全部楼层
USART1->CR1|=1<<7;  //transfer interrupt enable     两种办法:一个是不要在这里开启TXE中断,另一个是使用TC中断(记得在使能之前等待TC标志置为后再清零,然后使能)。
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-6-1 10:40:45 | 显示全部楼层
初始化代码,配置完后先清除一下中断标志,最后再使能串口。
活到老,学到老。
回复

使用道具 举报

7

主题

31

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-2-14
在线时间
8 小时
 楼主| 发表于 2016-6-1 14:08:01 | 显示全部楼层

这样对吗, 我的串口时钟4MHz, 波特率115200,
串口PA9 , PA10, 这样配置对吗,万分感谢

void Usart1_Init(uint32_t pclk, uint32_t bound)
{
  float temp;
  uint16_t mantissa;
  uint16_t fraction;          
  temp=(float)(pclk*1000000)/(bound*16);//得到USARTDIV
  mantissa=temp;                                 //ingeter part
  fraction=(temp-mantissa)*16; //decimal part         
  mantissa<<=4;
  mantissa+=fraction;
   RCC->AHBENR|=1<<17;   //enable GPIOA clock  
   RCC->APB2ENR|=1<<14;  //enable usart1 clock
   
   GPIOA->MODER&=0XFFC3FFFF;//PA9 usart1_Tx/ PA10 usart1_Rx
   GPIOA->MODER|=0X000800000;//MODER9 =10
   GPIOA->OTYPER&=~(1<<9);
   GPIOA->OTYPER&=~(1<<10);
   GPIOA->PUPDR&=0XFFC0FFFF;
   
   RCC->APB2RSTR|=(1<<14); //reset usart1
   RCC->APB2RSTR&=~(1<<14);// stop to reset usart1
   
   //USART1->CR1|=1<<15;  //oversampling by 8
   
   //波特率设置
    USART1->BRR=mantissa; //
    USART1->CR1|=0X0D;  //
   
    NVIC_SetPriority(USART1_IRQn, 2u);
    NVIC_EnableIRQ(USART1_IRQn);   
      
    while((USART1->CR1&0x40)==0x40);
   
    USART1->ICR|=1<<6;
    USART1->CR1|=1<<5;  //receive interrupt enable
    USART1->CR1|=1<<6;  //transfer interrupt enable     
}

回复

使用道具 举报

7

主题

31

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-2-14
在线时间
8 小时
 楼主| 发表于 2016-6-1 14:10:47 | 显示全部楼层
kingnike 发表于 2016-6-1 10:40
初始化代码,配置完后先清除一下中断标志,最后再使能串口。

使能串口前,我复位了串口,不能实现洗出中断标志吗?

怎样清除中断标志

万分感谢
回复

使用道具 举报

7

主题

31

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-2-14
在线时间
8 小时
 楼主| 发表于 2016-6-1 14:11:04 | 显示全部楼层
kingnike 发表于 2016-6-1 10:40
初始化代码,配置完后先清除一下中断标志,最后再使能串口。

使能串口前,我复位了串口,不能实现洗出中断标志吗?

怎样清除中断标志

万分感谢
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-6-1 15:12:37 | 显示全部楼层
        USART_ClearITPendingBit(USART1,USART_IT_TXE);
        USART_ClearITPendingBit(USART1,USART_IT_TC);


类似上面这样。
活到老,学到老。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-6-1 16:12:08 | 显示全部楼层
小肥a 发表于 2016-6-1 14:08
这样对吗, 我的串口时钟4MHz, 波特率115200,
串口PA9 , PA10, 这样配置对吗,万分感谢

while((USART1->SR & 0x40)  != 0x40);
USART1->SR  &= ~(0x1 << 6);   //我不知道在你用的芯片上状态寄存器怎么表示的,你改改
USART1->CR1 |= 1<< 5;
USART1->CR1 |= 1 << 6;

应该是这样吧。你试试 。 至于你使用的TXE中断就不要在初始化函数里使能了,在发送数据前使能,发送完最后一个字节后关闭。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 13:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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