Багато років я займаюсь програмуванням 8-ми та 16- бітних мікроконтролерів від Microchip серії PIC10, PIC12, PIC16, PIC18 та PIC24 і я вирішив спробувати нові 32-х бітні мікроконтролери від Nuvoton. Після документацій від Microchip я стикнувся з великим недостатком інформації по базовому налаштуванні мікроконтролерів Nuvoton. По мірі ознайомлення з цими мікроконтролерами я спробую зібрати тут основні моменти, з якими в мене виникли складнощі на перших кроках
Я вибрав мікроконтролер NUC472 і всі пеодальші кроки будуть на його основі. На сайті Nuvoton відкриваєте сторінку по обраному мікроконтролеру і переходите в розділ "Resources", де зібрана документація та приклади коду.
В розділі Software вибираєте "NUC472_NUC442_BSP_CMSIS_V3.02.001". В архіві буде папка Library з бібліотекою для основних функцій (Device, StdDriver). Також в складі архіву буде велика кількість прикладів по роботі з периферійними модулями.
Розпаковуєте вміст архіву в папку, наприклад "c:\arm\Library" і додаєте цей шлях у Keil uVision.
В кінці списку буде розділ "User Manual", де представлена інформація по налаштуванню середовища розробки.
Детальну інформацію по роботі з регістрами шукайте в розділі "Technical Reference Manual", т.я. в "Data Sheet" знаходиться лише загальна інформація по роботі периферії.
NuTool-ClockConfigure - Графічна оболочка для налаштування тактових генераторів та вибору джерела тактування для різних модулів. Якщ для певного модуля джерело тактових імпульсів не вибранно - модуль вимкнений. Програма генерує код ініціалізації для c-файла.
NuTool - PinConfigure - Графічна оболочка для налаштування режиму роботи ножок. Програма генерує код ініціалізації для c-файла.
NuTool - PinView - Графічна оболочка для перегляду стану ножок
GPIO_SetMode(PB, BIT3, GPIO_MODE_OUTPUT);
GPIO_SetMode(PB, BIT2, GPIO_MODE_INPUT);
Налаштування режиму роботи ножки в режимі GPIO. PB - Налаштування порту "B"; BIT3 - Третій біт;
GPIO_MODE_OUTPUT - вихід;
GPIO_MODE_INPUT - вхід;
GPIO_MODE_OPEN_DRAIN - відкритий колектор;
GPIO_MODE_QUASI - квазі-двонаправленний;
PB3 = 0;
Встановлення "логічного нуля" на ножчі в режимі GPIO. PB3 - Ножка №3 порту "B"
UART_Open(UART0, 115200);
printf("\n\nCPU @ %dHz\n", SystemCoreClock);
printf("This is test. Press any key\n");
getchar();
Приклад роботи з UART. UART0 - номер модуля; 11520 - швидкість, кбіт/с. Частота роботи тактового генератора здається в SystemCoreClock
SYS->GPE_MFPL = (SYS_GPE_MFPL_PE2MFP_SPI0_MISO0 | SYS_GPE_MFPL_PE3MFP_SPI0_MOSI0 | SYS_GPE_MFPL_PE4MFP_SPI0_SS0 | SYS_GPE_MFPL_PE5MFP_SPI0_CLK); // В розділі нашаштування призначення виводів налаштовуються потрібні ножки (Init I/O Multi-function). Набір налаштувань для ножок можна отримати за допомогою GUI "NuTool - PinConfigure.exe"
CLK_EnableModuleClock(SPI0_MODULE); //Увімкнення тактування SPI0-модуля
CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0SEL_PLL, MODULE_NoMsk); //Настройка шляху тактування
//Після цих налаштувань, компіляції, прошивки і перезавантаження мікроконтролера у програмі PinView можна побачити активні ножки:
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 32, 1000000); // SPI0 master, MSB first, режим передачі 32 біт, SPI Mode-0, частота SCLK 1MГц
SPI_TRIGGER(SPI0); //???
SPI_EnableAutoSS(SPI0, SPI_SS0, SPI_SS_ACTIVE_LOW); //Автоматичне керування ножкою CS. Активний рівень "нуль".
printf("SPI clock rate: %d Hz\n", SPI_GetBusClock(SPI0)); //Поточна швидкість роботи SPI
//SPI_IS_BUSY(spi)
PDMA_SetTransferAddr(1, u32EndSrc, PDMA_SAR_INC, u32EndDst, PDMA_DAR_FIX);
PDMA_SetTransferAddr(номер PDMA, джерело, автозбільшення адреси джерела, місце призначення, автозбільшення адреси місця призначення;
PDMA_SAR_INC - Режим автоматичного збільшення адреси вихідного джерела (Source)
PDMA_DAR_INC - Режим автоматичного збільшення адреси кінцевого джерела (destination)
Continuous output:
SYS->GPF_MFPH = SYS_GPF_MFPH_PF10MFP_PWM0_CH1 | SYS_GPF_MFPH_PF9MFP_PWM0_CH0; //Pin config (SYS_Init section)
CLK_EnableModuleClock(PWM0CH01_MODULE); //Clock config (SYS_Init section)
CLK_EnableModuleClock(PWM0CH23_MODULE); //Clock config (SYS_Init section)
CLK_SetModuleClock(PWM0CH01_MODULE, CLK_CLKSEL2_PWM0CH01SEL_HXT, MODULE_NoMsk); //Clock config (SYS_Init section)
CLK_SetModuleClock(PWM0CH23_MODULE, CLK_CLKSEL2_PWM0CH23SEL_HXT, MODULE_NoMsk); //Clock config (SYS_Init section)
PWM_ConfigOutputChannel(PWM0, 0, 100, 30); // PWM0 Channel 0, frequency is 100Hz, duty 30%,
PWM_ConfigOutputChannel(PWM0, 1, 105, 40); // PWM0 Channel 1, frequency is 105Hz, duty 40%,
PWM_SET_ALIGNED_TYPE(PWM0,0x03,PWM_EDGE_ALIGNED); //PWM_EDGE_ALIGNED
PWM_EnableOutput(PWM0, 0x03); //0x03 = 00000011 = Mask output // Enable output of all PWM channels
PWM_Start(PWM0, 0x03); //0x03 = 00000011 = Mask output //Start
Опубліковано:
Оновленно: 05.12.2023
Serhii K Home Page © 2003-2024 |