当前位置: 首页 > news >正文

天河移动网站建设如何提升网络营销推广

天河移动网站建设,如何提升网络营销推广,手机网站首页怎么做,万维网站STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中#xff0c;会发现库函数大都被设计成了一对#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中会发现库函数大都被设计成了一对 HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为3个字符或者4个字符 怎么理解这个设计呢 2.问题分析 2.1 结论 首先说结论 HAL_PPP/PPPP_Init 是与具体芯片无论是STM32F4/F1/F7无关的设置 HAL_PPP/PPPP_MspInit 是与具体芯片相关的配置如STM32F429IGTx 这样的设计是将不变的东西以库函数HAL_PPP/PPPP_Init的形式固定下来而将需要用户根据 芯片进行编写的部分抽象成函数HAL_PPP/PPPP_MspInit的形式用户只需要编写这部分函数 即可这样做减少了用户的代码编写量 __weak关键字的使用是定义一个弱函数这个函数的函数体通常是空的 方便用户重写一个自己的函数HAL_PPP/PPPP_MspInit来覆盖之前库函数中定义的函数带有 __weak关键字的HAL_PPP/PPPP_MspInit函数编译器在编译的时候如果检查到有重名的 但不含__weak关键字HAL_PPP/PPPP_MspInit的函数此时就会默认编译这个用户写的函数 2.2 实例分析 下面以串口通信为例进行分析 在编写串口通信的代码的时候常使用正点原子提供的usart.cusart.h组合正点原子在usart.c中 定义了HAL_UART_MspInit作为回调函数 void HAL_UART_MspInit(UART_HandleTypeDef *huart) {// GPIO configurationGPIO_InitTypeDef GPIO_Initure;if(huart-InstanceUSART1){__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA 时钟 __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1 时钟 GPIO_Initure.PinGPIO_PIN_9; //PA9GPIO_Initure.ModeGPIO_MODE_AF_PP; // AF复用,PP为推挽push pull GPIO_Initure.PullGPIO_PULLUP; // 设置上拉GPIO_Initure.SpeedGPIO_SPEED_FAST; // 设置为高速GPIO_Initure.AlternateGPIO_AF7_USART1; // 复用为USART1HAL_GPIO_Init(GPIOA,GPIO_Initure); // 初始化PA9 GPIO_Initure.PinGPIO_PIN_10; //PA10HAL_GPIO_Init(GPIOA,GPIO_Initure); // 初始化PA10 #if EN_USART1_RXHAL_NVIC_EnableIRQ(USART1_IRQn); // 使能USART1中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); // 抢占优先级3 子优先级3 #endif }}这个库同时提供了一个调用串口初始化的接口void uart_init(u32 bound) // bound为波特率 void uart_init(u32 bound) { //UART initializationUART1_Handler.InstanceUSART1; // USART1UART1_Handler.Init.BaudRatebound; // 设置波特率UART1_Handler.Init.WordLengthUART_WORDLENGTH_8B; // 字长为8位的数据格式UART1_Handler.Init.StopBitsUART_STOPBITS_1; // 一个停止位UART1_Handler.Init.ParityUART_PARITY_NONE; // 无奇偶校验位UART1_Handler.Init.HwFlowCtlUART_HWCONTROL_NONE; // 无硬件流控UART1_Handler.Init.ModeUART_MODE_TX_RX; // 收发模式HAL_UART_Init(UART1_Handler); // HAL_UART_Init() 会使能UART1HAL_UART_Receive_IT(UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE); // 该函数会开启接收中断标志位UART_IT_RXNE,并设置接收缓冲以及接收缓冲的最大接收数量}这样在main函数中首先调用函数uart_init() 然后uart_init()函数就会去调用HAL_UART_Init这个函数就是HAL库中的函数 跳转到文件stm32f4xx_hal_uart.c找到函数HAL_UART_Init的定义 /*** brief Initializes the UART mode according to the specified parameters in* the UART_InitTypeDef and create the associated handle.* param huart: pointer to a UART_HandleTypeDef structure that contains* the configuration information for the specified UART module.* retval HAL status*/ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) {/* Check the UART handle allocation */if(huart NULL){return HAL_ERROR;}/* Check the parameters */if(huart-Init.HwFlowCtl ! UART_HWCONTROL_NONE){ /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */assert_param(IS_UART_HWFLOW_INSTANCE(huart-Instance));assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart-Init.HwFlowCtl));}else{assert_param(IS_UART_INSTANCE(huart-Instance));}assert_param(IS_UART_WORD_LENGTH(huart-Init.WordLength));assert_param(IS_UART_OVERSAMPLING(huart-Init.OverSampling));if(huart-gState HAL_UART_STATE_RESET){ /* Allocate lock resource and initialize it */huart-Lock HAL_UNLOCKED;/* Init the low level hardware */HAL_UART_MspInit(huart);}huart-gState HAL_UART_STATE_BUSY;/* Disable the peripheral */__HAL_UART_DISABLE(huart);/* Set the UART Communication parameters */UART_SetConfig(huart);/* In asynchronous mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register,- SCEN, HDSEL and IREN bits in the USART_CR3 register.*/huart-Instance-CR2 ~(USART_CR2_LINEN | USART_CR2_CLKEN);huart-Instance-CR3 ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);/* Enable the peripheral */__HAL_UART_ENABLE(huart);/* Initialize the UART state */huart-ErrorCode HAL_UART_ERROR_NONE;huart-gState HAL_UART_STATE_READY;huart-RxState HAL_UART_STATE_READY;return HAL_OK; }可以看到函数HAL_UART_Init中调用了函数HAL_UART_MspInit 在库文件中本身是有一个同名的使用__weak关键字定义的函数 /*** brief UART MSP Init.* param huart: pointer to a UART_HandleTypeDef structure that contains* the configuration information for the specified UART module.* retval None*/__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) {/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_MspInit could be implemented in the user file*/ }由于使用了正点原子的库所以编译器在编译的时候就不会再编译这个HAL库自带的函数HAL_UART_MspInit 而是编译引入的库函数HAL_UART_MspInit 3. STM32程序的一般执行流程 由上面1.2节的分析对于一个真实的STM32应用程序可以总结其运行一般执行编写流程如下 以一个真实的点亮跑马灯的main.c为例进行分析(工程使用HAL库): #include sys.h #include delay.h #include usart.hvoid Delay(__IO uint32_t nCount);void Delay(__IO uint32_t nCount) {while(nCount--){} }int main(void) {GPIO_InitTypeDef GPIO_Initure;HAL_Init(); Stm32_Clock_Init(360,25,2,8); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_Initure.PinGPIO_PIN_0|GPIO_PIN_1; GPIO_Initure.ModeGPIO_MODE_OUTPUT_PP; GPIO_Initure.PullGPIO_PULLUP; GPIO_Initure.SpeedGPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOB,GPIO_Initure);while(1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); Delay(0x7FFFFF);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); Delay(0x7FFFFF);}}这里插入正点原子的图进行解释 一个项目首先是引导程序先运行汇编函数会引导SystemInit函数进行系统初始化的设置再HAL库版本的项目中有这个函数的定义在寄存器版本中通常会将汇编代码中引导SystemInit函数的语句删掉。然后引导程序会引导main函数main函数被引导完成之后就会开始执行用户写的main函数中的代码。然后HAL_Init()函数会调用函数进行全局的MSP初始化然后调用了正点原子提供的库函数Stm32_Clock_init函数这个函数调用HAL_RCC_Oscconfig和HAL_RCC_ClockConfig函数进行系统时钟初始化使用该函数需要导入SYSTEM库正点原子提供上面的一系列初始化都是常规操作也就是每一个项目必做的系统的初始化。下面正式进入了用户自己编写得到逻辑假设用户要使用PPP外设那么就会调用HAL库中的函数HAL_PPP_Init这个函数又会去尝试调用用户自定义的HAL_PPP_MspInit然后进入用户自己定义的逻辑。 ———————————————— 原文链接《[STM32] NOTE07-STM32使用HAL库之Msp回调函数理解》 STM32HAL库中外设初始化MSP回调机制及中断回调机制详解 我们开始学习HAL库的过程中一定会发现与固件库开发中外设初始化流程和中断处理机制不相同在这里将为大家解答一下心中的译文。 HAL外设初始化MSP回调机制 在外设初始化函数中HAL_PPP_Init();中需配置外设的相关参数外设用到的IO和NVIC和时钟等放到HAL_PPP_MspInit()回调函数中。初始化函数会自动调用回调函数. HAL库中断回调机制 HAL库中中断处理机制与固件库中不同他是经过公共中断处理函数自动调用中断处理回调函数。用户想要再中断中实现的逻辑代码则要放在回调函数中而公共中断处理函数会帮你检测是否有中断发生并帮你清除中断标志位。 HAL_PPP_IRQHandler();公共中断处理函数它会自动调用中断处理回调函数HAL_PPP_Callback() 用户要写在中断服务处理函数中的逻辑代码要放在回调函数中公共中断处理函数会帮你清除中断标志,并且自动调用回调函数 参考原文《STM32HAL库中外设初始化MSP回调机制及中断回调机制详解》
http://www.zqtcl.cn/news/390175/

相关文章:

  • 长沙制作网站词条有哪些网站可以做
  • 网站 网页区别简单的网页设计作品
  • 济南做网站推广有哪些公司天津建设工程信息网官方
  • 番禺市桥网站建设有关网站建设的知识
  • 信用中国 网站 支持建设怎么做网站美工
  • 做网站怎么样引流郑州最好的妇科医院排行
  • 云软件网站建设做仓单的网站
  • 邯郸做移动网站报价注册公司流程流程图
  • linux部署wordpress福州短视频seo推荐
  • 做地推的网站做网站感觉挣不到钱啊
  • 网站建设公司哪家好 搜搜磐石网络营销网站建设免费
  • 如何改网站的内容源码买卖网站
  • 企业网站 报价免费创意字体设计
  • 调用百度地图做全景的网站网站维护要求
  • 济宁网上做科目一的网站网站维护工程师薪酬
  • 领先的响应式网站建设平台湖北企业建站系统信息
  • 嘉兴市住房和城乡建设局网站巩义网站建设方案报价
  • 桂林做网站的公司哪家最好长沙网络工程学院
  • 广州 天河网站设计wordpress评论开关
  • 河南郑州建设网站做贺卡网站
  • 我的家乡湛江网站设计烟台网站建设招聘
  • 如何做网站改版评析网站建设报价单
  • 有关天猫网站开发的论文热狗seo顾问
  • 西安成品网站建设云主机建网站教程
  • 网站后台是怎么更新电商网站开发需求文档
  • 教人怎么做网页的网站有关建设网站的问题
  • wordpress资源站源码网站规划与建设课设报告
  • 网站后台ftp账户企企业业网网站站建建设设
  • 网站建设公司专业的建站优化公司成都天府新区网站建设
  • 建站模板 discuzui设计的流程有哪些步骤