OpenEdv-开源电子网

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

stm32f103 USART1 , uint16 如何转成uint_8

[复制链接]

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-10-28
在线时间
24 小时
发表于 2020-12-5 09:36:33 | 显示全部楼层 |阅读模式
1金钱

函数引用 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) ,此时USART_IT_RXNE=0x0525,

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
{
  uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
  ITStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_GET_IT(USART_IT));
  /* The CTS interrupt is not available for UART4 and UART5 */
  if (USART_IT == USART_IT_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }   

  /* Get the USART register index */
usartreg = (((uint8_t)USART_IT) >> 0x05);
  /* Get the interrupt position */
  itmask = USART_IT & IT_Mask;
  itmask = (uint32_t)0x01 << itmask;

  if (usartreg == 0x01) /* The IT  is in CR1 register */
  {
    itmask &= USARTx->CR1;
  }

---------------------------
这里uint16_t USART_IT 是16位, 直接用uint8_t 强转成8位的, 可以吗

最佳答案

查看完整内容[请看2#楼]

这种强制转换是可以,不过你要确认这样转换对你数据没有影响(数据高于u16的时候)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-12-5 09:36:34 | 显示全部楼层
这种强制转换是可以,不过你要确认这样转换对你数据没有影响(数据高于u16的时候)
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-12-5 10:11:11 | 显示全部楼层
本帖最后由 liaohaijian 于 2020-12-5 10:12 编辑

那就看你丢失USART_IT的高八位了,通常U16转u8都是通过移位实现,例如:u16 a;u8 b,c;
即b=a>>8;
c=a&0xff;
回复

使用道具 举报

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-10-28
在线时间
24 小时
 楼主| 发表于 2020-12-10 11:55:02 | 显示全部楼层
liaohaijian 发表于 2020-12-5 10:11
那就看你丢失USART_IT的高八位了,通常U16转u8都是通过移位实现,例如:u16 a;u8 b,c;
即b=a>>8;
c=a&0xf ...

但是库里面的代码是直接强转的
回复

使用道具 举报

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-10-28
在线时间
24 小时
 楼主| 发表于 2020-12-10 11:57:26 | 显示全部楼层
笨鸟想飞 发表于 2020-12-5 09:36
这种强制转换是可以,不过你要确认这样转换对你数据没有影响(数据高于u16的时候)

请问, USART_IT = 0x0525,此时强转成 uint8_t 之后 是多少呀
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-12-10 12:09:30 | 显示全部楼层
dml1048147924 发表于 2020-12-10 11:57
请问, USART_IT = 0x0525,此时强转成 uint8_t 之后 是多少呀

低八位0x25
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-10 13:50:02 | 显示全部楼层
usartreg = (((uint8_t)USART_IT) >> 0x05); 这是错的, 应该是
usartreg = (uint8_t)(USART_IT >> 0x05);
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-12-14 09:00:00 | 显示全部楼层
dml1048147924 发表于 2020-12-10 11:57
请问, USART_IT = 0x0525,此时强转成 uint8_t 之后 是多少呀

0x0525=0101 0010 0101

转换保留低8位  0010 0101 =0x25
回复

使用道具 举报

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-10-28
在线时间
24 小时
 楼主| 发表于 2020-12-26 09:40:55 | 显示全部楼层
edmund1234 发表于 2020-12-10 13:50
usartreg = (((uint8_t)USART_IT) >> 0x05); 这是错的, 应该是
usartreg = (uint8_t)(USART_IT >> 0x05);

库是错的吗,库里面这种强转的很多呀,

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  __IO uint32_t tmp = 0;

  /* Check the parameters */
  assert_param(IS_FLASH_ADDRESS(Address));
  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to program the new first
    half word */
    FLASH->CR |= CR_PG_Set;
  
    *(__IO uint16_t*)Address = (uint16_t)Data;
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(ProgramTimeout);

    if(status == FLASH_COMPLETE)
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-26 09:59:58 | 显示全部楼层
dml1048147924 发表于 2020-12-26 09:40
库是错的吗,库里面这种强转的很多呀,

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t  ...

转换不是错, 错就错在你把转换跟移位放错位置
u16  abc=0x1234

u8 xx =(u8)(abc>>4);      --> xx = 0x23
u8 xx =(u8)abc>>4;        --> xx = 0x03
这是让编译器把abc当成u8来运算, 那之后abc=0x34, abc>>4, 自然就成了0x03

u8 xx =(u8)(abc>>4);      --> xx = 0x23
这一句的意思是把u16的abc右移4位, 之后的结果转成u8, 那就是0x123 --> 0x23
回复

使用道具 举报

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-10-28
在线时间
24 小时
 楼主| 发表于 2020-12-26 10:11:19 | 显示全部楼层
edmund1234 发表于 2020-12-26 09:59
转换不是错, 错就错在你把转换跟移位放错位置
u16  abc=0x1234

位置我没动,库里面就是那么写的, 这么说库里的代码还是错了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-26 13:48:20 | 显示全部楼层
dml1048147924 发表于 2020-12-26 10:11
位置我没动,库里面就是那么写的, 这么说库里的代码还是错了

库的后半段不知道有没有再用usartreg
就前面而言, 它只用了USART_IT的bit5, 而用 (((uint8_t)USART_IT) >> 0x05)就是只保留Bit5~7.
要是它后面有判断USART_IT的bit8~bit23, 那不管它是不是库, 错是必然的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 14:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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