|
1、我个人的回答是不需要。2、也不需要改;
3、__weak的含义是弱定义。一般出现弱定义的地方,函数体内部都是空的。
如下,我以STM32CubeMX生成的MDK5.16的STM32L432的工程做为说明。(我的例程是关于串口的一个例子)。
A、首先,HAL_Init()都干了一些什么事情呢?
这个可以根据这个函数上面的注释看到:
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
这个就是初始化一些外设,flash相关及滴答定时器相关。
我们调到HAL_Init()这个函数中去看
- HAL_StatusTypeDef HAL_Init(void)
- {
- /* Configure Flash prefetch, Instruction cache, Data cache */
- /* Default configuration at reset is: */
- /* - Prefetch disabled */
- /* - Instruction cache enabled */
- /* - Data cache enabled */
- #if (INSTRUCTION_CACHE_ENABLE == 0)
- __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
- #endif /* INSTRUCTION_CACHE_ENABLE */
- #if (DATA_CACHE_ENABLE == 0)
- __HAL_FLASH_DATA_CACHE_DISABLE();
- #endif /* DATA_CACHE_ENABLE */
- #if (PREFETCH_ENABLE != 0)
- __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
- #endif /* PREFETCH_ENABLE */
- /* Set Interrupt Group Priority */
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
- /* Use SysTick as time base source and configure 1ms tick (default clock after Reset is MSI) */
- HAL_InitTick(TICK_INT_PRIORITY);
- /* Init the low level hardware */
- HAL_MspInit();
- /* Return function status */
- return HAL_OK;
- }
复制代码 初始化了,systick的中断优先级分组,CACHE等(至于初始化哪些寄存器,你可以跟进去看,这个里面有说明初始化的是哪个寄存器的)和HAL_MspInit。
B、至于HAL_MspInit这个函数,跟进去发现在stm32l4xx_hal.c这个C文件中,这个函数是弱定义。而且函数体是空的。
- /**
- * [url=home.php?mod=space&uid=159083]@brief[/url] Initialize the MSP.
- * @retval None
- */
- __weak void HAL_MspInit(void)
- {
- /* NOTE : This function should not be modified, when the callback is needed,
- the HAL_MspInit could be implemented in the user file
- */
- }
复制代码 而在stm32l4xx_hal_msp.c中,可以看到设置了一堆的NVIC
- void HAL_MspInit(void)
- {
- /* USER CODE BEGIN MspInit 0 */
- /* USER CODE END MspInit 0 */
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
- /* System interrupt init*/
- /* MemoryManagement_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
- /* BusFault_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
- /* UsageFault_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
- /* SVCall_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
- /* DebugMonitor_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
- /* PendSV_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0);
- /* SysTick_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- /* USER CODE BEGIN MspInit 1 */
- /* USER CODE END MspInit 1 */
- }
复制代码 这些都是MX工具在配置的时候,已经设置好了的。
所以在main.c中在main后面
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART2_UART_Init();
复制代码
想必你看名字就知道了,初始化外设等后,之后,设置系统时钟,然后初始化gpio,初始化uart。基本都是这些套路。
还有需要注意的一点:建议所有的函数体,或者宏定义,变量的定义,宏定义等等,都写在类似,这个begin和end的中间。
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
复制代码 如此以来,你在MX导入后缀名为.ioc的MX工具的文件再次设置你的外设啊之类的东西的时候,你之前的代码在再次生成工程的时候,不会丢失。
还有附上一些有关cube库结构的介绍和F4的HAL库的说明手册以供楼主参考。毕竟标准外设库是先入为主,熟悉新的HAL库的时候,确实需要花费时间的。
STM32 Cube introduction-lesson 1.pdf
(2.22 MB, 下载次数: 74)
STM32 Cube introduction-lesson 2.pdf
(766.49 KB, 下载次数: 68)
F4 HAL驱动详解.pdf
(4.48 MB, 下载次数: 116)
以上,希望可以帮助到楼主
|
赞赏
-
1
查看全部赞赏
-
|