新乡做网站的,营销型网站建设效果,wordpress如何恢复默认主题,wordpress说说功能继上一篇笔记#xff0c;搭建好STM32的编译框架#xff0c;编译出来的OHOS_Image.bin并不能跑不起来。 今天要在bsp里面添加一些代码#xff0c;让程序能跑起来。 先从裸机点亮LED灯开始#xff0c;准备以下3个文件:startup和system文件可以用OHOS官方代码。
/device/boar…继上一篇笔记搭建好STM32的编译框架编译出来的OHOS_Image.bin并不能跑不起来。 今天要在bsp里面添加一些代码让程序能跑起来。 先从裸机点亮LED灯开始准备以下3个文件:startup和system文件可以用OHOS官方代码。
/device/board/demo/demo_board/liteos_m/bsp/src/main.c
/device/board/demo/demo_board/liteos_m/bsp/src/system_stm32f4xx.c
/device/board/demo/demo_board/liteos_m/bsp/src/startup_stm32f407xx.s
main.c里面做最简单的初始化由于官方soc提供的st库是HAL库因此用HAL库点亮LED。
#include stm32f4xx_hal.hvoid HAL_MspInit(void)
{__HAL_RCC_SYSCFG_CLK_ENABLE();__HAL_RCC_PWR_CLK_ENABLE();
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);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 336;RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ 7;HAL_RCC_OscConfig(RCC_OscInitStruct);RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | 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;HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_5);
}//我的板子上有个LED连接在PA4
static void LED_Blink(void)
{GPIO_InitTypeDef GPIO_InitStruct {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin GPIO_PIN_4;GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull GPIO_PULLUP;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate 0;HAL_GPIO_Init(GPIOA, GPIO_InitStruct);while(1){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);HAL_Delay(500);}
}int main(void)
{HAL_Init();SystemClock_Config();LED_Blink();
}这段代码初始化LED引脚然后500ms改变1次LED状态。 这里面用到HAL_Delay函数是由Systick中断驱动的延时函数也考验中断能不能正常运行。 文件准备好了还要把文件加入到编译工程里 修改/home/openharmony/device/board/demo/demo_board/liteos_m/bsp/BUILD.gn 把源码路径添加到sources变量里面。
# /home/openharmony/device/board/demo/demo_board/liteos_m/bsp/BUILD.gn
# kerndev.blog.csdn.netimport(//kernel/liteos_m/liteos.gni)module_name get_path_info(rebase_path(.), name)
kernel_module(module_name) {sources [src/startup_stm32f407xx.s,src/system_stm32f4xx.c,src/main.c,]
}config(public) {defines [STM32F407xx,STM32F40_41xxx,]include_dirs [include,//device/soc/st/stm32f4xx/sdk/Core/Inc,//device/soc/st/stm32f4xx/sdk/Drivers/STM32F4xx_HAL_Driver/Inc,//device/soc/st/stm32f4xx/sdk/Drivers/CMSIS/Device/ST/STM32F4xx/Include,]ldflags [-Wl,-T rebase_path(ld/STM32F407IG_FLASH.ld),-Wl,-u_printf_float,]libs [c,m,nosys,]
}
然后开始编译编译通过把OHOS_Image.bin下载到板子里看看LED灯亮不亮。 运气好的话LED正常闪烁。 下载程序后如果LED没有闪烁需要排查以下问题
1.程序链接地址错误。 在STM32F407IG_FLASH.ld文件里定义了FLASH和RAM地址没有bootloader的情况下FLASH起始地址应该是0x080000000。
......
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN 0x20000000, LENGTH 128K
CCMRAM (xrw) : ORIGIN 0x10000000, LENGTH 64K
FLASH (rx) : ORIGIN 0x8000000, LENGTH 512K
}
......
2.中断向量表没有链接到BIN起始位置。 在STM32F407IG_FLASH.ld文件里定义了中断向量表的区块.isr_vector需要检查startup.s里面的向量表定义是否定义在.isr_vector代码段。
......
/* Define output sections */
SECTIONS
{/* The startup code goes first into FLASH */.isr_vector :{. ALIGN(4);KEEP(*(.isr_vector)) /* Startup code */. ALIGN(4);} FLASH......
3.中断向量表重映射地址错误。 在system_stm32f4xx.c文件里SystemInit函数会修改中断向量表位置取决于USER_VECT_TAB_ADDRESS宏定义。
void SystemInit(void)
{/* FPU settings ------------------------------------------------------------ */
#if (__FPU_PRESENT 1) (__FPU_USED 1)SCB-CPACR | ((3UL 10*2)|(3UL 11*2)); /* set CP10 and CP11 Full Access */
#endif#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM *//* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)SCB-VTOR VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#endif /* USER_VECT_TAB_ADDRESS */
}
4.中断函数SysTick_Handler配置错误。 在startup_stm32f407xx.s文件里找看中断向量表的定义其中SysTick_Handler位置写的是哪个函数为了HAL库正常使用可以将其修改为HAL_IncTick .section .isr_vector,a,%progbits.type g_pfnVectors, %object.size g_pfnVectors, .-g_pfnVectorsg_pfnVectors:.word _estack.word Reset_Handler.word HalExcNMI.word HalExcHardFault.word HalExcMemFault.word HalExcBusFault.word HalExcUsageFault.word 0.word 0.word 0.word 0.word SVC_Handler.word DebugMon_Handler.word 0.word HalPendSV.word HAL_IncTick //之前是OsTickHandler
5.闪烁频率不正常 检查System_Config()函数的时钟配置根据板子上的晶振频率修改PLL设置。 检查system_stm32f4xx.c里面SystemCoreClock的值是否和运行频率一致。