Всем привет!
Недавно пришла отладочная плата STM32F746G-DISCO, очень был этому рад и конечно решил поделится с Вами первыми впечатлениями. В предыдущем обзоре об новом ядре Cortex M7, я уже рассказывал, какая аппаратная поддержка реализовано на данной отладочной плате.
Первое что будем делать, загрузим демонстрационную прошивку с каталога для ранее скаченного куба версии 1.1.0. Для этого необходимо будет скачать новую версию STM32 ST-LINK Utility (на момент написания статьи доступная версия 3.7.0). Файл прошивки размещается в каталоге C:\STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Demonstration\Binaries.
Если посмотреть внимательно у нас две области памяти для загрузки прошивки на отладочную плату. Это связанно с тем, что бинарь не много, не мало, а весит 18,2 метра.
Теперь поработаем с отладочной платой и посмотрим, что из себя представляет демонстрационный проект.
Чтобы начать запускать примеры из Keil необходимо установить пакеты для работы stm32f7.
Второй пример, который я запустил, был STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Applications\LwIP, в дальнейшем появятся статьи по работе с LwIP и со стеком протоколов TCP/IP. При включении устройство пытается получить адрес по DHCP. DHCP (Dynamic Host Configuration Protocol — протокол динамической настройки узла) — сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP, и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок. Протокол DHCP используется в большинстве сетей TCP/IP. Пример — это web-server, страничка с информацией об компании ST.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 |
/* Includes ------------------------------------------------------------------*/ #include "main.h" #include "lwip/netif.h" #include "lwip/tcpip.h" #include "cmsis_os.h" #include "ethernetif.h" #include "app_ethernet.h" #include "lcd_log.h" #include "httpserver-netconn.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ struct netif gnetif; /* network interface structure */ /* Private function prototypes -----------------------------------------------*/ static void SystemClock_Config(void); static void StartThread(void const * argument); static void BSP_Config(void); static void Netif_Config(void); static void MPU_Config(void); static void CPU_CACHE_Enable(void); /* Private functions ---------------------------------------------------------*/ /** * @brief Main program * @param None * @retval None */ int main(void) { /* Configure the MPU attributes as Write Through */ MPU_Config(); /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* STM32F7xx HAL library initialization: - Configure the Flash ART accelerator on ITCM interface - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* Init thread */ #if defined(__GNUC__) osThreadDef(Start, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE * 5); #else osThreadDef(Start, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE * 2); #endif osThreadCreate (osThread(Start), NULL); /* Start scheduler */ osKernelStart(); /* We should never get here as control is now taken by the scheduler */ for( ;; ); } /** * @brief Start Thread * @param argument not used * @retval None */ static void StartThread(void const * argument) { /* Initialize LCD and LEDs */ BSP_Config(); /* Create tcp_ip stack thread */ tcpip_init(NULL, NULL); /* Initialize the LwIP stack */ Netif_Config(); /* Initialize webserver demo */ http_server_netconn_init(); /* Notify user about the network interface config */ User_notification(&gnetif); #ifdef USE_DHCP /* Start DHCPClient */ #if defined(__GNUC__) osThreadDef(DHCP, DHCP_thread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE * 5); #else osThreadDef(DHCP, DHCP_thread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE * 2); #endif osThreadCreate (osThread(DHCP), &gnetif); #endif for( ;; ) { /* Delete the Init Thread */ osThreadTerminate(NULL); } } /** * @brief Initializes the lwIP stack * @param None * @retval None */ static void Netif_Config(void) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; /* IP address setting */ IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); /* - netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw, void *state, err_t (* init)(struct netif *netif), err_t (* input)(struct pbuf *p, struct netif *netif)) Adds your network interface to the netif_list. Allocate a struct netif and pass a pointer to this structure as the first argument. Give pointers to cleared ip_addr structures when using DHCP, or fill them with sane numbers otherwise. The state pointer may be NULL. The init function pointer must point to a initialization function for your ethernet netif interface. The following code illustrates it's use.*/ netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input); /* Registers the default network interface. */ netif_set_default(&gnetif); if (netif_is_link_up(&gnetif)) { /* When the netif is fully configured this function must be called.*/ netif_set_up(&gnetif); } else { /* When the netif link is down this function must be called */ netif_set_down(&gnetif); } } /** * @brief Initializes the STM32756G-EVAL's LCD and LEDs resources. * @param None * @retval None */ static void BSP_Config(void) { /* Initialize the LCD */ BSP_LCD_Init(); /* Initialize the LCD Layers */ BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS); /* Set LCD Foreground Layer */ BSP_LCD_SelectLayer(1); BSP_LCD_SetFont(&LCD_DEFAULT_FONT); /* Initialize LCD Log module */ LCD_LOG_Init(); /* Show Header and Footer texts */ LCD_LOG_SetHeader((uint8_t *)"Webserver Application Netconn API"); LCD_LOG_SetFooter((uint8_t *)"STM32746G-DISCO board"); LCD_UsrLog ((char *)" State: Ethernet Initialization ...\n"); } /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSE) * SYSCLK(Hz) = 216000000 * HCLK(Hz) = 216000000 * AHB Prescaler = 1 * APB1 Prescaler = 4 * APB2 Prescaler = 2 * HSE Frequency(Hz) = 25000000 * PLL_M = 25 * PLL_N = 432 * PLL_P = 2 * PLL_Q = 9 * VDD(V) = 3.3 * Main regulator output voltage = Scale1 mode * Flash Latency(WS) = 7 * @param None * @retval None */ static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; HAL_StatusTypeDef ret = HAL_OK; /* Enable HSE Oscillator and activate PLL with HSE as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 432; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 9; ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); if(ret != HAL_OK) { while(1) { ; } } /* Activate the OverDrive to reach the 216 MHz Frequency */ ret = HAL_PWREx_EnableOverDrive(); if(ret != HAL_OK) { while(1) { ; } } /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7); if(ret != HAL_OK) { while(1) { ; } } } /** * @brief Configure the MPU attributes as Write Through for SRAM1/2. * @note The Base Address is 0x20010000 since this memory interface is the AXI. * The Region Size is 256KB, it is related to SRAM1 and SRAM2 memory size. * @param None * @retval None */ static void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct; /* Disable the MPU */ HAL_MPU_Disable(); /* Configure the MPU attributes as WT for SRAM */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress = 0x20010000; MPU_InitStruct.Size = MPU_REGION_SIZE_256KB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.SubRegionDisable = 0x00; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /** * @brief CPU L1-Cache enable. * @param None * @retval None */ static void CPU_CACHE_Enable(void) { /* Enable I-Cache */ SCB_EnableICache(); /* Enable D-Cache */ SCB_EnableDCache(); } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif |
Итого: моя оценка отладочной плате 10 🙂
подскажите, пожалуйста, где заказывали и как, сколько денег??
Заказывал в belchip.by, привезли за ~1 315 000 бел. руб.
Вопрос по загрузке прошивки. У них после загрузки бинарникак в ридми написано:
4- copy the audio and video files provided under «Utilities/Media/» in the USB key
5- Plug a USB micro A-Male to A-Female cable on CN12 connector
-> The internal Flash and the external QSPI are now programmed and the demonstration is shown on the board.
Как они умудряются залить мультимедиа файлы если флэш всего 1 Мб?
Подключается внешний накопитель(флешка) к разъему USB HS.Для подключения необходим переходник USB OTG.
Сегодня тоже получил эту плату. В ней уже был зашит демо-проект. Перепрошил другой программой, а потом захотел восстановить исходный демо-проект. В STM32Cube_FW_F7_V1.3.0 нашел Demonstration — там проект. Я его загрузил в Keil, запустил на отладку (Debug) (программа осталась зашитой в ПЗУ). Но в демо-проекте перестали отображаться пиктограммы рисунков в меню. Я уже туда и файл STM32746G-DISCO_Demo_V1.1.0.hex зашил через Keil — то же самое, всё работает, только вместо пиктограммок в меню непонятно что. То ли эти пиктограммы где-то в отдельной области хранились и я их затер? Надо будет в тексте программы разбираться — как там менюшки рисуются.
Вам в помощь startup пример с исходников куба для F7, тоже принцип для Linux embeded
прежде чем демку шить обратно, надо выбрать external loader -> N25Q128A_STM32F746G_DISCO