void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
{
__IO uint32_t tmp = 0;
/* Check the parameters */
assert_param(IS_DAC_ALIGN(DAC_Align));
assert_param(IS_DAC_DATA(Data));
tmp = (uint32_t)DAC_BASE;
tmp += DHR12R1_OFFSET + DAC_Align;
/* Set the DAC channel1 selected data holding register */
*(__IO uint32_t *) tmp = Data;
}//DAC通道1发数据到DHRX
当DAC_Align参数为DAC_Align_12b_L,也就是数据左对齐,tmp = (uint32_t)DAC_BASE; tmp += DHR12R1_OFFSET + DAC_Align;这两条语句计算出DAC_DHR12L1寄存器的地址,这里是没问题的,该地址和STM32中文参考手册中所给的DAC_DHR12L1地址一样,但是,由于DAC_DHR12L1寄存器低四位是保留的,而*(__IO uint32_t *) tmp = Data;这条语句其中的Data却没有移位就直接赋值给了DAC_DHR12L1,这就造成最后传到DAC通道1数据输出寄存器(DAC_DOR1)中的数据不准确了。
|