|
第3步:在Eclipse中导入CubeMX项目
现在我们可以将使用CubeMX生成的工程导入到创建的Eclipse工程里面。为了做到这一点,我们将要使用我制作的一个工具,名字叫CubeMXImporter,可以在我的github账户获得。该工具基于Python 2.7和lxml库。可以在这里找到所有的安装指令。CubeMXImporter安装完成后,打开终端命令行,并输入以下指令: - $ python cubemximporter.py <path-to-eclipse-project-folder> <path-to-cubemx-project>
复制代码例如,如果你将Eclipse工程起名为tm32-nucleo144-f7,且CubeMX工程起名为nucleo-f7,那么该指令需要通过以下方式调用: - $ python cubemximporter.py <path-to-eclipse-workspace>/stm32-nucleo144-f7 <path-to-cubemx-output-directory>/nucleo-f7
复制代码CubeMXImporter将会自动导入工程框架、CubeF7以及中间件库(LwIP和FreeRTOS)到Eclipse工程里面。
好了,现在我们可以在Eclipse中重新打开该工程。打开后,在Project Explorer视图的工程名上右击并选择Refresh项。 通过使用建议的CubeMXImporter工具,现在我们需要手动做一些事情。首先,我们需要为Cortex-M7设定正确的FPU配置。转到 Project Settings->C/C++ Build->Settings->Target Processor。在Float ABI字段选择"FP instructions (hard)",并且在FPU Type字段选择“fpv5-sp-d16”,如下图所示:
点击OK。现在我们需要选择正确的FreeRTOS算法。在Project Explorer视图中,转到Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang文件夹。选择文件heap_1.c、heap_2.c、heap_3.c和heap_5.c。右击并选择Resource Configurations->Exclude from build...。选择所有的工程配置,然后点击OK。现在我们可以编译该应用程序并且使用OpenOCD下载到NUCLEO板。 如果一切都正确的话,就可以ping到Nucleo开发板。
第4步:创建一个简单的HTTP服务器
现在,我们准备使用LwIP建立一个简单的HTTP服务器。我们需要做的第一件重要的事情是修改stm32f7_xx_it.c里面的SysTick_Handler()函数里面的内容。一个已知的Bug会引起HAL_IncTick() 调用被省略。所以,我们需要按照以下方式进行修改: - void SysTick_Handler(void) {
- HAL_IncTick();
- osSystickHandler();
- }
复制代码main() 的代码非常简单,我们首先初始化硬件,然后使用StartDefaultTask()函数创建一个新的线程。 - int main(void) {
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_ADC1_Init();
- MX_GPIO_Init();
- MX_USART3_UART_Init();
- MX_USB_OTG_FS_PCD_Init();
- /* Create the thread(s) */
- /* definition and creation of defaultTask */
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
- /* Start scheduler */
- osKernelStart();
-
- /* We should never get here as control is now taken by the scheduler */
- while (1);
- }
复制代码StartDefaultTask()函数只是初始化LwIP栈以及启动HTTP服务器。 - void StartDefaultTask(void const * argument) {
- /* init code for LWIP */
- MX_LWIP_Init();
- http_server_netconn_init();
- /* Infinite loop */
- for(;;) {
- osThreadTerminate(NULL);
- }
- }
复制代码有关HTTP服务器是如何工作的介绍并不在本片教程的范围:它需要专门的文章介绍。所有的底层工作有http_server_serve()函数完成,该函数仅仅扫描一些已知字符串的HTTP请求。剩余的工作由jQuery执行。 - void http_server_serve(struct netconn *conn) {
- struct netbuf *inbuf;
- err_t recv_err;
- char* buf;
- u16_t buflen;
- /* Read the data from the port, blocking if nothing yet there.
- We assume the request (the part we care about) is in one netbuf */
- recv_err = netconn_recv(conn, &inbuf);
-
- if (recv_err == ERR_OK)
- {
- if (netconn_err(conn) == ERR_OK)
- {
- netbuf_data(inbuf, (void**)&buf, &buflen);
-
- /* Is this an HTTP GET command? (only check the first 5 chars, since
- there are other formats for GET, and we're keeping it very simple )*/
- if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0))
- {
- if (strncmp((char const *)buf,"GET /index.html",15)==0) {
- netconn_write(conn, (const unsigned char*)index_html, index_html_len, NETCONN_NOCOPY);
- }
- if (strncmp((char const *)buf,"GET /led1", 9) == 0) {
- HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
- }
- if (strncmp((char const *)buf,"GET /led2", 9) == 0) {
- HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
- }
- if (strncmp((char const *)buf,"GET /led3", 9) == 0) {
- HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
- }
- if (strncmp((char const *)buf,"GET /btn1", 9) == 0) {
- if(HAL_GPIO_ReadPin(User_Blue_Button_GPIO_Port, User_Blue_Button_Pin) == GPIO_PIN_SET)
- netconn_write(conn, (const unsigned char*)"ON", 2, NETCONN_NOCOPY);
- else
- netconn_write(conn, (const unsigned char*)"OFF", 3, NETCONN_NOCOPY);
- }
- if (strncmp((char const *)buf,"GET /adc", 8) == 0) {
- sprintf(buf, "%2.1f °C", getMCUTemperature());
- netconn_write(conn, (const unsigned char*)buf, strlen(buf), NETCONN_NOCOPY);
- }
- }
- }
- }
- /* Close the connection (server closes in HTTP) */
- netconn_close(conn);
-
- /* Delete the buffer (netconn_recv gives us ownership,
- so we have to make sure to deallocate the buffer) */
- netbuf_delete(inbuf);
- }
复制代码webpages/index.html包含HTML代码。该代码使用UNIX指令xxd转换成C字符串: - xxd -i index.html > index.h
复制代码并且嵌入到最终的固件(STM32F7有足够的空间来保存整个的HTML文件)。该网页可以通过 http://<nucleo-ip>/index.html访问。 |