void getFactoryTSCalibData(TSCALIB_TypeDef* data) { uint32_t deviceID; deviceID = DBGMCU_GetDEVID(); if (deviceID == 0x427) *data = *FACTORY_TSCALIB_MDP_DATA; else if (deviceID == 0x416) *data = *FACTORY_TSCALIB_MD_DATA; else while(1); // add error handler - device cannot be identified calibration data not loaded! }
void _start(void) { /* copy data from rom */ if (&__data_start != &__data_start_rom) { unsigned int *src = &__data_start_rom; unsigned int *dest = &__data_start; while (dest != &__data_end) *dest++ = *src++; } /* zero out bss */ unsigned int *bss = &__bss_start; while (bss != &__bss_end) *bss++ = 0; USART_TypeDef *debug_usart; #if TARGET_STM3210E /* configure the usart1 pins */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_USART1, DISABLE); GPIO_InitTypeDef init; init.GPIO_Pin = GPIO_Pin_9; init.GPIO_Speed = GPIO_Speed_50MHz; init.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &init); init.GPIO_Pin = GPIO_Pin_10; init.GPIO_Speed = GPIO_Speed_50MHz; init.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &init); debug_usart = USART1; #endif #if TARGET_STM32_P107 /* configure the usart3 pins */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); GPIO_InitTypeDef init; init.GPIO_Pin = GPIO_Pin_8; init.GPIO_Speed = GPIO_Speed_50MHz; init.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &init); init.GPIO_Pin = GPIO_Pin_9; init.GPIO_Speed = GPIO_Speed_50MHz; init.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &init); debug_usart = USART3; #endif init_leds(); usart_init(debug_usart); printf("how are you gentlemen\n"); printf("devid 0x%x\n", DBGMCU_GetDEVID()); dump_clocks(); // bring up te HSE printf("enabling external crystal\n"); RCC_HSEConfig(RCC_HSE_ON); RCC_WaitForHSEStartUp(); printf("external crystal up\n"); // try to program up the pll printf("enabling pll\n"); #if STM32F10X_CL RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_4); #else RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); #endif RCC_PLLCmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; printf("pll latched\n"); printf("setting up clocks\n"); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PCLK2Config(RCC_HCLK_Div1); #if STM32F10X_CL RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); #else RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); #endif usart_init(debug_usart); set_led(3, 0); set_led(3, 1); printf("after new sysclk\n"); dump_clocks(); printf("done!\n"); /* try to fire the systick */ // __set_BASEPRI(8 << __NVIC_PRIO_BITS); /* start the systick timer */ NVIC_SetVectorTable(0, 0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); uint32_t pri = NVIC_EncodePriority(3, 0, 0); NVIC_SetPriority(SysTick_IRQn, pri); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); SysTick_Config(systick_counter); #if 0 uint32_t last = 0; for (;;) { uint32_t now = current_time(); if (now - last >= 1000000) { printf("time %d\n", now); last = now; } } #endif #if 0 uint32_t val; for (val = 0; ; val++) { set_led(0, val & 0x1); set_led(1, val & 0x2); set_led(2, val & 0x4); set_led(3, val & 0x8); } #endif /* write the boot sequence */ led_panel_command_write(0b100000000010, 12); // SYS_EN led_panel_command_write(0b100000000110, 12); // LED_ON led_panel_command_write(0b100000010000, 12); // BLINK_OFF led_panel_command_write(0b100000110000, 12); // INT_RC led_panel_command_write(0b100001001000, 12); // n-mos open drain, 16 com led_panel_command_write(0b100101011110, 12); // PWM_CTRL | 0xf for(uint j = 0; ; j++) { GPIO_ResetBits(GPIOF, LED_CS); led_panel_write(0b1010000000, 10); // start write at address 0 for (int i = 0; i < 96; i++) { led_panel_write(((j % 96) > i) ? 0b1111: 0, 4); } GPIO_SetBits(GPIOF, LED_CS); spin(10000); } for(;;) ; }
/* * Device Information View * Device: Win32 or Cortex-M3 etc * Memory: * Thread: * IP Address: * Gateway: * DNS: */ static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { switch (event->type) { case RTGUI_EVENT_PAINT: { struct rtgui_dc* dc; struct rtgui_rect rect; char* line; rt_uint32_t total, used, max_used; line = rtgui_malloc(256); if (line == RT_NULL) return RT_FALSE; dc = rtgui_dc_begin_drawing(widget); if (dc == RT_NULL) { rtgui_free(line); return RT_FALSE; } rtgui_widget_get_rect(widget, &rect); /* fill background */ rtgui_dc_fill_rect(dc, &rect); rect.y2 = rect.y1 + 18; { rt_uint32_t dev_index, rev_index; dev_index = DBGMCU_GetDEVID(); dev_index = (dev_index - 0x410)/2; rev_index = DBGMCU_GetREVID(); switch (rev_index) { case 0x1000: case 0x0000: rev_index = 0; /* Revision A */ break; case 0x1001: case 0x2001: rev_index = 3; /* Revision Z */ break; case 0x2000: rev_index = 1; /* Revision B */ break; case 0x2002: rev_index = 2; /* Revision Y */ break; default: rev_index = 4; /* Unknown */ break; }; /* check device index */ if (dev_index > 4) dev_index = 3; /* draw each information */ sprintf(line, "设备: %s %s", stm32_devname[dev_index], stm32_revname[rev_index]); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; } rt_memory_info(&total, &used, &max_used); sprintf(line, "内存: 当前使用 %d 字节", used); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; { rt_uint16_t rect_width; rtgui_color_t saved; rtgui_rect_t mem_rect = rect; rtgui_rect_inflate(&mem_rect, -2); rtgui_dc_draw_rect(dc, &mem_rect); rtgui_rect_inflate(&mem_rect, -1); rect_width = rtgui_rect_width(mem_rect); saved = RTGUI_WIDGET_BACKGROUND(widget); RTGUI_WIDGET_BACKGROUND(widget) = light_grey; mem_rect.x2 = mem_rect.x1 + (max_used * rect_width / total); rtgui_dc_fill_rect(dc, &mem_rect); RTGUI_WIDGET_BACKGROUND(widget) = blue; mem_rect.x2 = mem_rect.x1 + (used * rect_width / total); rtgui_dc_fill_rect(dc, &mem_rect); /* restore color */ RTGUI_WIDGET_BACKGROUND(widget) = saved; } rect.y1 += 18; rect.y2 += 18; sprintf(line, "线程数: %d", get_thread_cnt()); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #ifdef RT_USING_LWIP { struct ip_addr ip_addr; struct _ip_addr { rt_uint8_t addr0, addr1, addr2, addr3; } *addr; addr = (struct _ip_addr*)&netif_default->ip_addr.addr; sprintf(line, "IP地址 : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; addr = (struct _ip_addr*)&netif_default->gw.addr; sprintf(line, "网关地址: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; addr = (struct _ip_addr*)&netif_default->netmask.addr; sprintf(line, "网络掩码: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #if LWIP_DNS ip_addr = dns_getserver(0); addr = (struct _ip_addr*)&ip_addr; sprintf(line, "DNS地址 : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #endif } #endif rtgui_dc_end_drawing(dc); rtgui_free(line); return RT_FALSE; } case RTGUI_EVENT_KBD: { struct rtgui_event_kbd* ekbd; ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) { rtgui_workbench_t* workbench; workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(device_view)->parent); rtgui_workbench_remove_view(workbench, device_view); rtgui_view_destroy(device_view); device_view = RT_NULL; } } return RT_FALSE; } /* use parent event handler */ return rtgui_view_event_handler(widget, event); }