Я думаю, что все детали содержатся в той ветке, которую вы разместили, поэтому я постараюсь немного разбить ее;
В частности,
If you access a 16-bit hardware register using two 8-bit
accesses, the high-order byte doesn't read correctly (it
always read as 0xFF for me). This is fair enough since
TI's docs state that 16-bit hardware registers must be
read and written using 16-bit-wide instructions, and
normally would be, unless you're using memcpy() to
read them.
Таким образом, проблема в том, что аппаратные регистры сообщают правильное значение только в том случае, если их значения считываются за одно 16-битное чтение. Это было бы эквивалентно выполнению;
uint16 value = *(regAddress);
Это считывает из адреса в регистр значений, используя одно 16-байтовое чтение. С другой стороны, у вас есть memcpy, который копирует данные по одному байту за раз. Что-то вроде;
while (n--)
{
*(uint8*)pDest++ = *(uint8*)pSource++;
}
Таким образом, регистры считываются 8 битами (1 байт) за раз, в результате чего значения становятся недействительными.
Решение, опубликованное в этом потоке, состоит в том, чтобы использовать версию memcpy, которая будет копировать данные с использованием 16-битного чтения, где источник и пункт назначения выровнены по 6-битному.