OpenEdv-开源电子网

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

UART_IT 请问以下USART各个中断是按照什么规律定义的呢 ,也就是如何和16位数字对应的,谢谢!

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-11-3
在线时间
0 小时
发表于 2013-11-3 21:53:04 | 显示全部楼层 |阅读模式
  
#define USART_IT_PE                          ((uint16_t)0x0028)
#define USART_IT_TXE                         ((uint16_t)0x0727)
#define USART_IT_TC                          ((uint16_t)0x0626)
#define USART_IT_RXNE                        ((uint16_t)0x0525)
#define USART_IT_IDLE                        ((uint16_t)0x0424)
#define USART_IT_LBD                         ((uint16_t)0x0846)
#define USART_IT_CTS                         ((uint16_t)0x096A)
#define USART_IT_ERR                         ((uint16_t)0x0060)
#define USART_IT_ORE                         ((uint16_t)0x0360)
#define USART_IT_NE                          ((uint16_t)0x0260)
#define USART_IT_FE                          ((uint16_t)0x0160)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-3 22:45:11 | 显示全部楼层
有点复杂,你得研究下STM32的库写法,这里面还包括有寄存器的地址信息...
跟踪到这个函数:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
{
  uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00;
  uint32_t usartxbase = 0x00;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CONFIG_IT(USART_IT));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  /* The CTS interrupt is not available for UART4 and UART5 */
  if (USART_IT == USART_IT_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }   
  
  usartxbase = (uint32_t)USARTx;

  /* Get the USART register index */
  usartreg = (((uint8_t)USART_IT) >> 0x05);

  /* Get the interrupt position */
  itpos = USART_IT & IT_Mask;
  itmask = (((uint32_t)0x01) << itpos);
    
  if (usartreg == 0x01) /* The IT is in CR1 register */
  {
    usartxbase += 0x0C;
  }
  else if (usartreg == 0x02) /* The IT is in CR2 register */
  {
    usartxbase += 0x10;
  }
  else /* The IT is in CR3 register */
  {
    usartxbase += 0x14; 
  }
  if (NewState != DISABLE)
  {
    *(__IO uint32_t*)usartxbase  |= itmask;
  }
  else
  {
    *(__IO uint32_t*)usartxbase &= ~itmask;
  }
}
对着《STM32参考手册》自己慢慢分析吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-4 14:47:12 | 显示全部楼层
昨晚看了下,后来搞明白了,
比如  #define USART_IT_TC                          ((uint16_t)0x0626)


0x0626  对应的二进制为  0000 0110  0010 0110

前8位为该中断在状态寄存器中的位置。  
中间3位为该中断使能所在哪个控制寄存器。
最后5位为该中断使能在其所在的控制寄存器的位置。






回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-1-4
在线时间
31 小时
发表于 2016-2-29 15:19:43 | 显示全部楼层
本帖最后由 lyconly1 于 2016-2-29 15:22 编辑

今天看到了,对着楼主的分析了一下,确实如楼主所言。不明白的是每一个中断使能都在手册里可以查到具体的地址,为什么不用结构体指针的方式直接定位到呢?反而要通过几次计算,得到偏移地址再定位。像这种
if (NewState != DISABLE)
  {
    /* Enable the selected USART by setting the UE bit in the CR1 register */
    USARTx->CR1 |= USART_CR1_UE;
  }
  else
  {
    /* Disable the selected USART by clearing the UE bit in the CR1 register */
    USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);
  }
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-4-24
在线时间
0 小时
发表于 2016-4-24 22:03:55 | 显示全部楼层
原子哥,我刚入门,我想问你个问题啊,
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
这一句话中,为什么USART_GetITStatus(USART1, USART_IT_RXNE) 不等于RESET,就发生中断呢?我在手册里,找不到RESET的定义。
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-5-4
在线时间
58 小时
发表于 2016-5-11 16:21:19 | 显示全部楼层
殷子 发表于 2016-4-24 22:03
原子哥,我刚入门,我想问你个问题啊,
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收 ...

在库函数里面是有关于RESET的定义的。

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

RESET的值是0,SET的值是非0(可以理解为1)

在数据接收完毕的时候,会把寄存器某一位置为1然后发生中断。于是我们就在中断里面查询这个位的值,如果是1(也就是 不等于RESET),则说明发生的中断,是由接收数据引起的。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2017-1-24
在线时间
8 小时
发表于 2017-3-1 18:08:33 | 显示全部楼层
STM32_Fancier 发表于 2013-11-4 14:47
昨晚看了下,后来搞明白了,
比如 &nbsp;#define USART_IT_TC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...

一开始也没有跟进函数里面去看,也看蒙了,进去一看就明白了;但发现LZ说的有点不对哦;比如:#define USART_IT_TC                          ((uint16_t)0x0626)  
0x0626  对应的二进制为  0000 0110  0010 0110
/* Get the USART register index */
  usartreg = (((uint8_t)USART_IT)  >>0x05); 先将低8位右移5位,根据右移后的结果来判断中断标志位是在哪个控制寄存器, 0010 0110>>0x05=1,
if (usartreg == 0x01) /* The IT is in CR1 register */
  {
    usartxbase += 0x0C;
  } 所以USART_IT_TC在CR1寄存器;
然后根据
/* Get the interrupt position */
  itpos = USART_IT & IT_Mask; //#define IT_Mask                   ((uint16_t)0x001F)
  itmask = (((uint32_t)0x01) << itpos); 得出USART_IT_TC在CR1寄存器的那一位。
itpos=0000 0110  0010 0110&0x001F=110=6;
itmask = (((uint32_t)0x01) <<6)
CR1的第6位为TCIE
按LZ的说法#define USART_IT_TC                          ((uint16_t)0x0626)确实可以找到TCIE,但是#define USART_IT_PE                          ((uint16_t)0x0028)这个呢?就找不到了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-3-13
在线时间
2 小时
发表于 2019-3-13 08:01:03 | 显示全部楼层
xiaochu312 发表于 2017-3-1 18:08
一开始也没有跟进函数里面去看,也看蒙了,进去一看就明白了;但发现LZ说的有点不对哦;比如:#define US ...

是对的   你可能没分析正确
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2019-5-4
在线时间
49 小时
发表于 2021-11-9 09:25:20 | 显示全部楼层
这样分析是对的:前8位为该中断在状态寄存器中的位置。  
中间3位为该中断使能所在哪个控制寄存器。
最后5位为该中断使能在其所在的控制寄存器的位置
分析是对的,详细可以看着https://www.toutiao.com/i7027376729929155111/
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 03:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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