Осторожно, некропост.
Я тут обнаружил, что как минимум Raisonanse C complier для STM8 генерит жуткий говнокод для стандартной конструкции переписывания 16-бит числа в 8-бит регистры. Прошу учесть, что порядок байтов для stm8 - старший, младший, порядок записи регистров имеет значение.
Итак, стандартный код на С из всех учебников
- Код: Выделить всё • Развернуть
-      unsigned int ch1Sum;
 ...
 TIM5_CCR1H = ch1Sum >> 8;
 TIM5_CCR1L = ch1Sum;
 
 
генерит вот что:
- Код: Выделить всё • Развернуть
- ;TIM5_CCR1H = ch1Sum >> 8; 
 LDW   X,ch1Sum
 CLR   A
 RRWA  X,A
 LD    A,XL
 LD    TIM5_CCR1,A
 ;TIM5_CCR1L = ch1Sum;
 MOV   TIM5_CCR1+1,ch1Sum+1
 
 
Короче, жуть.
Переписываем так:
- Код: Выделить всё • Развернуть
-      unsigned int ch1Sum;
 ...
 TIM5_CCR1H = ((u8*)&ch1Sum)[0];
 TIM5_CCR1L = ch1Sum;
 
 
Получаем адекватные 2 MOVa:
- Код: Выделить всё • Развернуть
- ;TIM5_CCR1H = ((u8*)&ch1Sum)[0]; 
 MOV   TIM5_CCR1,ch1Sum
 ;TIM5_CCR1L = ch1Sum;
 MOV   TIM5_CCR1+1,ch1Sum+1
 
 
И аналогично в обратную сторону:
- Код: Выделить всё • Развернуть
-     unsigned int uSonicRange;
 ...
 ((unsigned char *)&uSonicRise)[0] = TIM1_CCR2H;
 ((unsigned char *)&uSonicRise)[1] = TIM1_CCR2L;