Пн дек 21, 2015 11:54:28
void main( void )
{
CLK_ECKR_bit.HSEON = 1; // Вкючаем HSE (Внешний кварц - 8Мгц.)
while(CLK_ECKR_bit.HSERDY != 1) {} //Ждем готовности источника тактирования
CLK_CKDIVR = 0; // Предделитель равен нулю
CLK_SWCR_bit.SWEN=1; // Разрешаем переключение источника тактовой частоты
CLK_SWR = 0x04; // Выбираем HSE источником тактовой частоты
while (CLK_SWCR_bit.SWBSY==1) {} // Ждем готовности переключения
CLK_SWCR_bit.SWBSY = 0;
//Инициализация пина, на котором буду выводить меандр
PC_DDR_bit.DDR6 = 1;
PC_CR1_bit.C16 = 1;
PC_CR2_bit.C26 = 1;
PC_ODR_bit.ODR6 = 1; //Переключаем вывод в 1
TIM3_Init();
while(1)
{
PC_ODR_bit.ODR6 ^= 1; //Инвертируем состояние вывода
TIM3_Start(50000);
TIM3_Wait();
}
}
void TIM3_Init(void)
{
CLK_PCKENR1_bit.PCKEN11 = 1; //Включаем тактирование таймера №3
TIM3_PSCR_bit.PSC = 3; //Длительность такта таймера 1 мкс
TIM3_CR1_bit.ARPE = 1;
TIM3_CR1_bit.CEN = 0; //Таймер выключен
}
void TIM3_Start(uint16_t StopTime)
{
TIM3_CR1_bit.CEN = 0; //Выключим таймер
TIM3_SR1_bit.UIF = 0; //Сбросить флаг переполнения таймера
TIM3_ARRH = (StopTime) >> 8; //Устанавливаем время таймера (Старший байт)
TIM3_ARRL = (StopTime) & 0xFF; //Устанавливаем время таймера (Младший байт)
TIM3_CR1_bit.CEN = 1; //Включаем таймер
}
void TIM3_Wait(void)
{
while(TIM3_SR1_bit.UIF == 0){;} //Ждем переполнения таймера
}
Пн дек 21, 2015 12:11:32
Пн дек 21, 2015 12:14:36
scorpi_0n писал(а):Ничего там аномального нет кроме самой проги и недочитанного RM. А так как написано так и работает. Всё правильно.
ARPE установлен. Значит значения в регистры таймера попадут только по апдэйту. Что и наблюдается на картинке.
Пн дек 21, 2015 12:26:49
Пн дек 21, 2015 13:32:26
Пн дек 21, 2015 13:51:43
Вт июл 02, 2019 10:26:02
URS регистра TIM_CR1 чтобы данные вступили в силу