gd32f150 firmare DAC 的一个小漏洞

[复制链接]
2182|9
 楼主| zj4068 发表于 2015-6-16 15:56 | 显示全部楼层 |阅读模式
/**
  * @brief  Set the specified data holding register value for DAC channel1.
  * @param  DAC_Align: Specifies the data alignment for DAC channel1.
  *   This parameter can be one of the following values:
  *     @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
  *     @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
  *     @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
  * @param  Data: Data to be loaded in the selected data holding register.
  * @retval None
  */
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
{
    __IO uint32_t temp = 0;

    temp = (uint32_t)DAC_BASE;
    temp += DHR12R_OFFSET + DAC_Align;

    /* Set the DAC channel1 selected data holding register */
    *(__IO uint32_t *) temp = Data;
}

今天正好在调dac,我调用左对齐,数值会把低4位的数据干掉,dac输出的值很小,我仔细看了一下这个函数和相关的寄存器,如果左对齐的话要数据要左移4位,算不算这个函数的一个小漏洞

void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
{
    __IO uint32_t temp = 0;

    temp = (uint32_t)DAC_BASE;
    temp += DHR12R_OFFSET + DAC_Align;

    if(DAC_Align == DAC_ALIGN_12B_L)
      *(__IO uint32_t *) temp = (Data << 4);
    else
      /* Set the DAC channel1 selected data holding register */
      *(__IO uint32_t *) temp = Data;
}

smilingangel 发表于 2015-6-16 19:06 | 显示全部楼层
这种情况怎么出现的?
白丁野老 发表于 2015-6-17 11:13 | 显示全部楼层
算不算漏洞,也没个参考的,可以试着比比同样STM32的库函数,是不是也是一样的。如果不一样,那就是漏洞,只能这么说了。
kywang 发表于 2015-6-17 16:25 | 显示全部楼层
对于左对齐,数值会把低4位的数据干掉,是不需要移位的。所以上面的函数第一个是对的,第二个是错误的。
kywang 发表于 2015-6-17 16:34 | 显示全部楼层
对于左对齐,数值会把低4位的数据干掉,对于16位数据,取高12位,把低4位干掉,如果你嫌弃DAC 输出小的话,可以将高12位设置为大数据就行了。所有GD的库是没有问题的。
baimiaocun2015 发表于 2015-6-17 21:39 | 显示全部楼层
这个是怎么回事呢?数据类型不对?
麦可可 发表于 2015-6-19 18:35 | 显示全部楼层
这也算一个不大不小的bug吧,要注意。
zhangbo1985 发表于 2015-6-19 19:07 | 显示全部楼层
调用左对齐,数值会把低4位的数据干掉??这个是怎样的一个过程的?不是很清楚楼主的意思的。
zhangbo1985 发表于 2015-6-19 19:07 | 显示全部楼层
若是将数据左移操作的话,,数据肯定会变化的啊。
月正浓 发表于 2015-6-22 09:54 | 显示全部楼层
我试试去,居然还有这么一个情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

23

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部