Это присвоение упомянуто уже трижды - один раз как "равно" и дважды, как "или равно" - а зачем побитово ИЛИть с предыдущим значением? А теперь вот еще и только с младшей его частью...?
Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.
Alexeyslav писал(а):Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.
Вы тоже не поняли моего вопроса. О том, что младший разряд, при сдвиге к старшим, заполняется нулями, даше хреновые-химеры знают, не надо никого равнять с ними - вопрос конечно же был о другом:
Alex2016 писал(а):
Как я уже говорил, это присвоение было упомянуто трижды и все три раза по-разному... так вот было интересно - нафига было в процитированном варианте ИЛИть-то с битами предыдущего результата?
Ещё раз... к чему твои дурные вопросы??? ТС не дочитал референс... пробовал выпутаться из ситуации по разному... там что угодно можно было увидеть... Когда ему указали на порядок чтения-записи...он указал решение в послесловии...
И вообще... тебе не кажется странным... что тебя вообще никто не понимает... похоже что и даже ты сам???
"Я не даю готовых решений, я заставляю думать!"(С)
#define F_APB1 20000000UL
void delay_ms(uint16_t delay)
{
TIM14->PSC = F_APB1 / 1000 + 1; //устанавливаем предделитель
TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}
void delay_mc(uint16_t delay)
{
TIM14->PSC = F_APB1 / 1000000 + 1; //устанавливаем предделитель
TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}
GPIO_ResetBits(GPIOA, GPIO_Pin_14);
GPIO_SetBits(GPIOF, GPIO_Pin_0);
service47 писал(а):Как сделать такое же от STM32, но для STM8 в IAR:
Да строчку в строчку... Для TIM1 уж точно... Для других таймеров... с учётом особенностей прескалера... Таймера то похожи...
А вообще... смысла в этом никакого нет... только минус таймер... Этот идиотизм только для Мега-Пых ногодрыга и годится...
"Я не даю готовых решений, я заставляю думать!"(С)
Файлы .с тоже добавлены. Но:
Error[Pe020]: identifier "TIM1_SR1_bit" is undefined
Error[Pe020]: identifier "TIM1_CR1" is undefined и т.д.
Если же добавить из самого IAR'а:
#include "iostm8.h"
#include <iostm8l051f3.h>
и закомментировать:
//#include "stm8l15x.h"
то:
Error[Pe256]: invalid redeclaration of type name "__BITS_PA_ODR" (declared at line 45 of "D:\...\iostm8l051f3.h 45
Что конкретно не выходит "программно"? Целые не целятся? Массивы не массивятся? 'Goto' огрызается, типа "сам пошел"? Какие были предприняты действия, к чему они привели и что не получилось?
ЗЫ
В коде понравилась индусская тема - "if (ADSampRdy == TRUE)"... Как-то половинчато написано, нет завершенности...
Надо было так написать:
скажите, в IAR есть ли возможность в коде определить тип МК под который идет компилирование?
на подобие того, как в атмел студии дефайнятся специальные переменные препроцессора о наличию которых можно установить конкретный МК