OpenEdv-开源电子网

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

原子的这段程序,我不是很懂。希望有人指点 下。

[复制链接]

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
发表于 2013-12-20 22:20:56 | 显示全部楼层 |阅读模式
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据

if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了 
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
}  
}
}    
     } 
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();    
#endif

#endif


if((USART_RX_STA&0x8000)==0),USART_RX_STA这个变量不是0吗?它是怎么来判断接收未完成的?


还有这句函数,是怎么实现的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-20 22:54:51 | 显示全部楼层
回复【楼主位】shaofeng03:
---------------------------------
在中断服务函数里面,会修改USART_RX_STA的值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-21 10:20:28 | 显示全部楼层
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
我在您的程序里面,好像没看到您对USART_RX_STA,的修改,我只看到前面, 您对它附了一个0,还有就是为什么用
if((USART_RX_STA&0x8000)==0) 来判断接收未完成,在前面不是已经判断了,已经接收到了数据,并把数据存储在res里面吗?
     这个我很不明白,我是小白一个,希望,前面,能给我详细的解释下,这串代码,你的思路!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-21 13:00:40 | 显示全部楼层
回复【3楼】shaofeng03:
---------------------------------
赋值为0,是为了使能下一次接收。
这里是判断最高位。不关心其他位。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-21 15:39:33 | 显示全部楼层
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
    RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);

    if(RxCounter1 == NbrOfDataToRead1)
    {
      /* Disable the USART1 Receive interrupt */
      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
    }
  }
  
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */
    USART_SendData(USART1, TxBuffer1[TxCounter1++]);

    if(TxCounter1 == NbrOfDataToTransfer1)
    {
      /* Disable the USART1 Transmit interrupt */
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    }    
  }
}

/**
  * @brief  This function handles USART2 global interrupt request.
  * @param  None
  * @retval None
  */
void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
    RxBuffer2[RxCounter2++] = USART_ReceiveData(USART2);

    if(RxCounter2 == NbrOfDataToRead1)
    {
      /* Disable the USART2 Receive interrupt */
      USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
    }
  }
  
  if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */
    USART_SendData(USART2, TxBuffer2[TxCounter2++]);

    if(TxCounter2 == NbrOfDataToTransfer2)
    {
      /* Disable the USART2 Transmit interrupt */
      USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
    }
  }
}


原子哥,这是官方UART中断函数吗?
我又去翻你的程序,stm32f10x_it.c  文件 
里面是没有这俩段的,是被你改成这样的?
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-21 19:52:29 | 显示全部楼层
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
原子哥,这句,我不懂。为什么要 &0X3FFF,
USART_RX_BUF[],这个数组不是只能8位吗?
应该是与0x3f 阿
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-21 20:52:40 | 显示全部楼层
回复【6楼】shaofeng03:
---------------------------------
为啥USART_RX_BUF[],这个数组只能8位?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-21 22:39:47 | 显示全部楼层
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

您的这句程序写着呢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-21 23:44:25 | 显示全部楼层
回复【8楼】shaofeng03:
---------------------------------
这是u8型的数组啊和你说的8位, 不是一个意思啊....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-22 11:10:45 | 显示全部楼层
我脑子短路了,
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
其它我看懂了,就是这里面为什么要&3fff。不懂
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-22 11:17:49 | 显示全部楼层
我想我看懂了。这样是为了,串口能接收16位的数据 ,14位做为判断收到0x0d,15位用做0x0a.
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-22 13:07:34 | 显示全部楼层
原子哥,我在你串口程序的基础上加了led的显示,却发现,led亮不了。
就是普通的   LED0=0;
这种,却亮不了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-22 20:23:58 | 显示全部楼层
说明程序没执行到你点灯的地方
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-23 09:54:40 | 显示全部楼层
我就在main函数那里面,加了个LED0=0;
它有执行,就是状态不变。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-23 11:45:47 | 显示全部楼层
回复【14楼】shaofeng03:
---------------------------------
仿真下吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-24 17:33:50 | 显示全部楼层
原子哥,在I2C,那章,为什么不用硬件,要用软件模拟?
这样做不会很占cpu吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-24 23:25:51 | 显示全部楼层
回复【16楼】shaofeng03:
---------------------------------
因为用硬件IIC不稳定.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2013-12-25 11:58:28 | 显示全部楼层
为什么?
软件的话,就很稳定?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-25 21:15:20 | 显示全部楼层
回复【18楼】shaofeng03:
---------------------------------
你试试硬件的吧,就知道为什么了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-25 21:16:15 | 显示全部楼层
stm32的硬件IIC,就像个人妖,外表长得好看惊艳,等你真娶回家,才发现原来是生不了娃的....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-7 06:36:24 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
最近想搞 uip ,,现在要从哪下手,原子哥,,请 指点 一下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 09:58:15 | 显示全部楼层
回复【21楼】shaofeng03:
---------------------------------
可以看看我们的教程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-15 10:27:55 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
手册 不全阿。
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-7-15 11:04:58 | 显示全部楼层
回复【23楼】shaofeng03:
---------------------------------
&0x3ff是数组下标,不是数组类型,估计你是没反应过来。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-15 16:37:40 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
原子哥,那个 enc28j60.c enc28j60.h 是您写的吗???还是 您  按 官方的 修改的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-15 23:07:22 | 显示全部楼层
回复【25楼】shaofeng03:
---------------------------------
移植别家的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-19 11:08:52 | 显示全部楼层
回复【26楼】正点原子:
---------------------------------
uip 没有 给 例程吗??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-19 23:28:20 | 显示全部楼层
回复【27楼】shaofeng03:
---------------------------------
我们例程就是uip的啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-21 15:02:18 | 显示全部楼层
回复【28楼】正点原子:
---------------------------------
我发现,,好难 看懂 您的 程序阿。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-21 23:49:12 | 显示全部楼层
回复【29楼】shaofeng03:
---------------------------------
慢慢来了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-12-20
在线时间
0 小时
 楼主| 发表于 2014-7-29 22:29:51 | 显示全部楼层
回复【30楼】正点原子:
---------------------------------
 军哥,现在我整理一下,ENC28J60 程序 不懂的地方 向您请教一下。
1、首先 在main里面 已经 有 uip_init(); 在初始化的时候 ,已经把tcp_demo_appcall ;这个函数跑过了。#define UIP_APPCALL tcp_demo_appcall 
void tcp_demo_appcall(void)
{
  
switch(uip_conn->lport)//本地监听端口80和1200 
{
case HTONS(80):
httpd_appcall(); 
break;
case HTONS(1200):
    tcp_server_demo_appcall(); 
break;
default:   
    break;
}     
switch(uip_conn->rport) //远程连接1400端口
{
    case HTONS(1400):
tcp_client_demo_appcall();
       break;
    default: 
       break;
}   
}
所以,在main();这三句好像没必要加。
uip_listen(HTONS(1200)); //监听1200端口,用于TCP Server
uip_listen(HTONS(80)); //监听80端口,用于Web Server
   tcp_client_reconnect();         //尝试连接到TCP Server端,用于TCP Client

2、在main()里面的这个函数 uip_polling(); 我可以 理解成 处理 IP数据 包的函数吗?把 MAC IP滤除,把数据 做进 buf, 确定 len长度。
没有它,,后面 的 程序 就没用 ,是这样的吗?

3、在tcp_server_demo.c里面 struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;
这句不理解?????

4、还有http.c  if(s->inputbuf[1] == ISO_space||s->inputbuf[1] == '?')  //第二个数据是空格/问号

在 同个地址 取 空格,还有“?”  这是??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-30 00:25:55 | 显示全部楼层
回复【31楼】shaofeng03:
---------------------------------
1,你去掉试试,还能正常么?
2,处理所有uip相关事务,就是轮询处理各种事件。没有这个,后面的都无法执行。
3,就是个强制转换啊。
4,这是或。。。不是同时,是只要满足等于任何一个都可以。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 17:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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