Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт фев 12, 2015 10:02:48
IAR AVR позволяет r4-r15 использовать в личных целях


Здесь можно немножко помяукать :)
https://radiokot.ru/forum/

Код: Выделить всё
RCC->CFGR |= RCC_CFGR_PLLMULL6; //HSI / 2 * 6 = 24 MHz
RCC->CR |= RCC_CR_PLLON; //enable PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0) {} //wait till PLL is ready
RCC->CFGR &= ~RCC_CFGR_SW; //clear SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; //select PLL as system clock
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} //wait till PLL is used
Код: Выделить всё
RCC->CR |= RCC_CR_HSEON; //enable HSE
while((RCC->CR & RCC_CR_HSERDY) == 0) {} //wait till HSE is ready
RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | //HCLK = SYSCLK
RCC_CFGR_PPRE2_DIV1 | //PCLK2 = HCLK
RCC_CFGR_PPRE1_DIV1; //PCLK1 = HCLK
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //clear PLLMULL bits
RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1 | //PLL source = PREDIV1
RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | //HSE / 2 = 4 MHz
RCC_CFGR_PLLMULL6; //4 * 6 = 24 MHz
RCC->CR |= RCC_CR_PLLON; //enable PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0) {} //wait till PLL is ready
RCC->CFGR &= ~RCC_CFGR_SW; //clear SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; //select PLL as system clock
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} //wait till PLL is used
Код: Выделить всё
void Init_Clk()
{
FLASH->ACR |= FLASH_ACR_PRFTBE; //Включить буфер предварительной выборки
FLASH->ACR &= ~FLASH_ACR_LATENCY; //Очистить FLASH_ACR_LATENCY
FLASH->ACR |= FLASH_ACR_LATENCY_2; //Пропускать 2 такта
RCC->CFGR = 0;
[b] RCC->CFGR |= RCC_CFGR_SW_HSE; // Включаем SYSCLK от PLL ???
while ((RCC->CFGR & RCC_CFGR_SWS_HSE) == 1){}[/b]
RCC->CR &=~(RCC_CR_PLLON); // Отключаем PLL
while((RCC->CR & RCC_CR_PLLRDY) == 1){}
RCC->CFGR &=~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); // Обнуление CFGR
RCC->CFGR |= RCC_CFGR_PLLSRC;
RCC->CFGR |= RCC_CFGR_PLLMULL16; // Умножить частоту PLL_MUL
RCC->CR |= RCC_CR_PLLON; // Запустить PLL
while((RCC->CR &RCC_CR_PLLRDY)==0){} // Ожидание готовности PLL
RCC->CFGR &= ~(RCC_CFGR_SW); // Очистить биты SW0 и SW1
RCC->CFGR |= RCC_CFGR_SW_PLL; // Тактирование с выхода PLL
while((RCC->CFGR & RCC_CFGR_SWS)!=0x08){} // Ожидание переключения на PLL
}Код: Выделить всё
(RCC->CFGR & RCC_CFGR_SWS_HSE) == 1Код: Выделить всё
#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */Это что-то инопланетное ? Про программатор с таким именем не слышал. Если комп достаточно не новый и имеет LPT или COM, то для начинающего лучше "5 проводков" или AVR910 . А лучше купить у кетайцев на Ali USB ASP .дмитрий95 писал(а):Какой програматор выбрать ?AVR
USB bar
В окошке Address: пишем "i:0000" и смотрим.paskal писал(а):...А ОЗУ как посмотреть?
Код: Выделить всё
символ ABCHGEFD
PORTD ...AB.DC
PORTC E.F...HG
Код: Выделить всё
// для удобства определим константы, определяющие биты сегментов
#define A 0x80
#define B 0x40
... и так далее
// в этой переменной у нас будет число, которое надо вывести на сегменты
char symbol;
// далее я разобью оператор на строки, чтобы было понятнее, в каком месте что делается
PORTD = // в порт D будет выводиться
(PORTD & ~(A | B | D | C)) // содержимое тех битов порта, которые не назначены сегментам, отсюда инверсия перед скобками
| (((symbol & (A | B)) >> 3) // сдвинутые на 3 позиции вправо биты AB
| ((symbol & D) << 1) // сдвинутый на 1 влево бит D
| ((symbol & C) << 5) // и сдвинутый на 5 влево бит С
; // все, наконец-то
// аналогично надо сформировать и новое значение порта С - не буду делать этого в целях экономии своих сил
Код: Выделить всё
void SetSeg(char s)
{
(s & _A_)? Port_SEG_A_0 : Port_SEG_A_1;
(s & _B_)? Port_SEG_B_0 : Port_SEG_B_1;
(s & _C_)? Port_SEG_C_0 : Port_SEG_C_1;
(s & _D_)? Port_SEG_D_0 : Port_SEG_D_1;
(s & _E_)? Port_SEG_E_0 : Port_SEG_E_1;
(s & _F_)? Port_SEG_F_0 : Port_SEG_F_1;
(s & _G_)? Port_SEG_G_0 : Port_SEG_G_1;
(s & _H_)? Port_SEG_H_0 : Port_SEG_H_1;
}
Код: Выделить всё
#define SEG_A (1 << PB6)
...
#define Port_SEG_A_0 (PORTB &= ~SEG_A)
#define Port_SEG_A_1 (PORTB |= SEG_A)
...
Код: Выделить всё
TGpio<PORTA, PIN1> Pin_SEG_A;
...
Pin_SEG_A.Init(OUT_PP_2M, OUT_LO);
...
Pin_SEG_A = (s & _A_);
...