OpenEdv-开源电子网

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

意法半导体三合一开发板的stm8s开发板上串口无法进入接收中断

[复制链接]

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
发表于 2013-9-24 11:41:06 | 显示全部楼层 |阅读模式

如题,开发环境是iar,代码如下

串口初始化

void UART3_INIT(void)
{
    u16 baud_div=0;
   
    /*1位起始位 8位数据位 结束位由CR3设置 不使用奇偶校验 */
    UART3_CR1 = (0<<4)|(0<<2);
   
    UART3_CR3 = 0x00;
    /*使能发送和接收 接收中断使能 禁止发送中断*/
    //UART3_CR2 = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(1<<3)|(1<<2);
    UART3_CR2_TEN = 1;
    UART3_CR2_REN = 1;
    UART3_CR2_RIEN = 1;
   
    /*设置1位停止位 不使能SCLK*/
    //UART3_CR3 = (0<<6)|(0<<4)|(0<<3);
   
     /*使用智能卡模式需要设置的,基本上保持默认就行了 */
   // UART3_CR5 = (0<<2)|(0<<1);    
    
    /*设置波特率*/

    baud_div =(SysClockFreq/BaudRate);  /*求出分频因子*/
    
   
    UART3_BRR2 = ((u8)(baud_div & 0x0f)) | ((u8)((baud_div & 0xf000) >> 8)) ;
    //UART3_BRR2 |= (u8)((baud_div & 0xf000) >> 8);
    UART3_BRR1 = (u8)((baud_div & 0x0ff0) >> 4);    /*先给BRR2赋值 最后再设置BRR1*/
   
    UART3_CR1 |= (0<<5);         /*使能UART*/
}

中断处理函数:

#pragma vector=0x17
__interrupt void UART3_RX_IRQHandler(void)
{
#if 0
    u8 Res;
    if(UART3_SR & UART_FLAG_RXNE) 
    {/*接收中断(接收到的数据必须是0x0d 0x0a结尾)*/
 Res =(u8)UART3_DR;
        /*(USART1->DR);读取接收到的数据,当读完数据后自动取消RXNE的中断标志位*/
 if(( UART_RX_NUM&0x80)==0)/*接收未完成*/
 {
     if( UART_RX_NUM&0x40)/*接收到了0x0d*/
            {
                if(Res!=0x0a)
                    UART_RX_NUM=0;/*接收错误,重新开始*/
                else 
                    UART_RX_NUM|=0x80; /*接收完成了 */
            }
            else /*还没收到0X0D*/
            { 
                if(Res==0x0d)
                    UART_RX_NUM|=0x40;
                else
                {
                    RxBuffer[ UART_RX_NUM&0X3F]=Res ;
                    UART_RX_NUM++;
                    if( UART_RX_NUM>63)
                        UART_RX_NUM=0;/*接收数据错误,重新开始接收*/ 
                }  
            }
  }    
    } 
#else
    unsigned char c;
    c = UART3_DR;          // 接收到数据了
    while(!UART3_SR_TXE);
    c++;                              // 把接收到的数据加1
    UART3_DR = c;         // 再发回去,为什么这么做?在电脑上串口调试软件里发1就收到2,发A就收到B,看运行结果比较方便 
#endif
}

主函数初始化串口,没做其他的,请原子大哥和各位帮忙指点下!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2013-9-24 15:39:44 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-9-30 08:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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