STM32 HAL库常勤奋能封装

[复制链接]
发表于 前天 07:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
关制止
  1. /**
  2. * @brief       关闭所有中断(但是不包括fault和NMI中断)
  3. * @param       无
  4. * @retval      无
  5. */
  6. void sys_intx_disable(void)
  7. {
  8.     __ASM volatile("cpsid i");
  9. }
复制代码
开制止
  1. /**
  2. * @brief       开启所有中断
  3. * @param       无
  4. * @retval      无
  5. */
  6. void sys_intx_enable(void)
  7. {
  8.     __ASM volatile("cpsie i");
  9. }
复制代码
进入待机模式
  1. /**
  2. * @brief       进入待机模式
  3. * @param       无
  4. * @retval      无
  5. */
  6. void sys_standby(void)
  7. {
  8.     __HAL_RCC_PWR_CLK_ENABLE();    /* 使能电源时钟 */
  9.     SET_BIT(PWR->CR, PWR_CR_PDDS); /* 进入待机模式 */
  10. }
复制代码
设置栈顶指针
  1. /**
  2. * @brief       设置栈顶地址
  3. * @note        左侧若出现红X, 属于MDK误报, 实际是没问题的
  4. * @param       addr: 栈顶地址
  5. * @retval      无
  6. */
  7. void sys_msr_msp(uint32_t addr)
  8. {
  9.     __set_MSP(addr);    /* 设置栈顶地址 */
  10. }
复制代码
进入低功耗模式
  1. /**
  2. * @brief       执行: WFI指令(执行完该指令进入低功耗状态, 等待中断唤醒)
  3. * @param       无
  4. * @retval      无
  5. */
  6. void sys_wfi_set(void)
  7. {
  8.     __ASM volatile("wfi");
  9. }
复制代码
体系软复位 (第一种)
  1. /**
  2. * @brief       系统软复位
  3. * @param       无
  4. * @retval      无
  5. */
  6. void sys_soft_reset(void)
  7. {
  8.     NVIC_SystemReset();
  9. }
复制代码
体系软复位 (第二种)
  1. /*!
  2. * @brief ARM 软重启
  3. * @retval: 无
  4. */
  5. #define SCB_AIRCR             (*(unsigned long *)0xE000ED0C)      //Reset control Address Register
  6. #define SCB_RESET_VALUE       0x05FA0004                          //reset value ,write to SCB_AIRCR  can reset cpu
  7. void Reset_System(void)
  8. {
  9.         SCB_AIRCR=SCB_RESET_VALUE;
  10. }
复制代码
GPIO初始化封装
  1. /**
  2.   * @brief 初始化GPIO
  3.   * @note   
  4.   * @retval
  5.   */
  6. void MX_GPIOX_PIN_Init(GPIO_TypeDef *GPIOx,uint32_t GPIO_PIN_x,uint32_t GPIO_MODE_x,uint32_t Speed_x)
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStruct = {0}; /* gpio初始化 */
  9.        
  10.         GPIO_InitStruct.Pin = GPIO_PIN_x; // 设置GPIO_Pin
  11.         GPIO_InitStruct.Mode = GPIO_MODE_x; // 设置模式为输入
  12.         GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉
  13.         GPIO_InitStruct.Speed = Speed_x;
  14.         HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); // 初始化GPIOX的GPIO_Pin
  15. }
复制代码
开启GPIOx相应时钟
  1. /**
  2.   * @brief 开启对应GPIO Port时钟
  3.   * @note   
  4.   * @retval
  5.   */
  6. void MX_GPIOX_Clock_Enable(GPIO_TypeDef *GPIOx) {
  7.     /* 确保GPIOx是有效的GPIO口 */
  8.     if (GPIOx == GPIOA) {
  9.         __HAL_RCC_GPIOA_CLK_ENABLE();
  10.     } else if (GPIOx == GPIOB) {
  11.         __HAL_RCC_GPIOB_CLK_ENABLE();
  12.     } else if (GPIOx == GPIOC) {
  13.         __HAL_RCC_GPIOC_CLK_ENABLE();
  14.     } else if (GPIOx == GPIOD) {
  15.         __HAL_RCC_GPIOD_CLK_ENABLE();
  16.     } else if (GPIOx == GPIOE) {
  17.         __HAL_RCC_GPIOE_CLK_ENABLE();
  18.     } else if (GPIOx == GPIOF) {
  19.         __HAL_RCC_GPIOF_CLK_ENABLE();
  20.     } else if (GPIOx == GPIOG) {
  21.         __HAL_RCC_GPIOG_CLK_ENABLE();
  22.     } else if (GPIOx == GPIOH) {
  23.         __HAL_RCC_GPIOH_CLK_ENABLE();
  24.     } else if (GPIOx == GPIOI) {
  25.         __HAL_RCC_GPIOI_CLK_ENABLE();
  26.     }
  27. }
复制代码
SP330协议转换芯片设置接口封装

sp330.h
  1. #define USE_SP330        1 //使用sp330
  2. /* sp330 configure begin */
  3. #if USE_SP330
  4. #define U1_SP330_SLEW_Pin GPIO_PIN_15
  5. #define U1_SP330_SLEW_GPIO_Port GPIOA
  6. #define U1_SP330_SHDN_Pin GPIO_PIN_12
  7. #define U1_SP330_SHDN_GPIO_Port GPIOC
  8. #define U1_SP330_DE_Pin GPIO_PIN_0
  9. #define U1_SP330_DE_GPIO_Port GPIOD
  10. #define U1_SP330_RE_Pin GPIO_PIN_1
  11. #define U1_SP330_RE_GPIO_Port GPIOD
  12. #define U1_SP330_HALE_FULL_Pin GPIO_PIN_2
  13. #define U1_SP330_HALE_FULL_GPIO_Port GPIOD
  14. #define U1_SP330_MODE_Pin GPIO_PIN_5
  15. #define U1_SP330_MODE_GPIO_Port GPIOD
  16. #define U4_SP330_DE_Pin GPIO_PIN_6
  17. #define U4_SP330_DE_GPIO_Port GPIOD
  18. #define U4_SP330_RE_Pin GPIO_PIN_7
  19. #define U4_SP330_RE_GPIO_Port GPIOB
  20. #define U4_SP330_HALE_FULL_Pin GPIO_PIN_8
  21. #define U4_SP330_HALE_FULL_GPIO_Port GPIOB
  22. #define U4_SP330_MODE_Pin GPIO_PIN_9
  23. #define U4_SP330_MODE_GPIO_Port GPIOB
  24. #define U4_SP330_SLEW_Pin GPIO_PIN_0
  25. #define U4_SP330_SLEW_GPIO_Port GPIOE
  26. #define U4_SP330_SHDN_Pin GPIO_PIN_1
  27. #define U4_SP330_SHDN_GPIO_Port GPIOE
  28. /* sp330模式 */
  29. typedef enum
  30. {
  31.         RS232_MODE = 232,
  32.         RS422_MODE = 422,
  33.         RS485_MODE = 485
  34. }SP330_MODE;
  35. /* sp330通信方式 */
  36. typedef enum
  37. {
  38.         HALF_DUPLEX = 11,
  39.         FULL_DUPLEX = 22 //全双工
  40. }SP330_COMM_MODE;
  41. /* 配置结构体 */
  42. typedef struct
  43. {
  44.         uint16_t SP330_Work_Mode;   //取值范围为SP330_MODE枚举
  45.         uint16_t SP330_Comm_Mode;   //SP330_COMM_MODE
  46.         uint16_t SP330_DE_GPIO_Pin; //发送脚
  47.         uint16_t SP330_RE_GPIO_Pin; //接收脚
  48.         uint16_t SP330_MODE_GPIO_Pin; //模式配置
  49.         uint16_t SP330_SLEW_GPIO_Pin; //限摆率设置
  50.         uint16_t SP330_SHDN_GPIO_Pin; //功耗模式设置:
  51.         uint16_t SP330_HALE_FULL_GPIO_Pin; //双工模式
  52.         GPIO_TypeDef *SP330_RE_GPIOx;
  53.         GPIO_TypeDef *SP330_DE_GPIOx;
  54.         GPIO_TypeDef *SP330_SLEW_GPIOx;
  55.         GPIO_TypeDef *SP330_SHDN_GPIOx;
  56.         GPIO_TypeDef *SP330_MODE_GPIOx;
  57.         GPIO_TypeDef *SP330_HALE_FULL_GPIOx;   
  58. }Sp330_Configure;
  59. void Sp330_Init(Sp330_Configure *sp330); //sp330初始化
  60. void Uart_Sp330_Configure(void); //sp330配置
  61. /* sp330 configure end */
  62. #endif
复制代码
sp330.c
  1. /**
  2.   * @brief sp330配置函数
  3.   * @note   
  4.   * @retval
  5.   */
  6. void Uart_Sp330_Configure(void)
  7. {
  8.         /* 配置结构体定义 */
  9.         Sp330_Configure u1_sp330;
  10.         Sp330_Configure u4_sp330;
  11.        
  12.         u1_sp330.SP330_DE_GPIOx = U1_SP330_DE_GPIO_Port;
  13.         u1_sp330.SP330_DE_GPIO_Pin = U1_SP330_DE_Pin;
  14.         u1_sp330.SP330_RE_GPIOx = U1_SP330_RE_GPIO_Port;
  15.         u1_sp330.SP330_RE_GPIO_Pin = U1_SP330_RE_Pin;
  16.         u1_sp330.SP330_SHDN_GPIOx = U1_SP330_SHDN_GPIO_Port;
  17.         u1_sp330.SP330_SHDN_GPIO_Pin = U1_SP330_SHDN_Pin;
  18.         u1_sp330.SP330_SLEW_GPIOx = U1_SP330_SLEW_GPIO_Port;
  19.         u1_sp330.SP330_SLEW_GPIO_Pin = U1_SP330_SLEW_Pin;
  20.         u1_sp330.SP330_MODE_GPIOx = U1_SP330_MODE_GPIO_Port;
  21.         u1_sp330.SP330_MODE_GPIO_Pin = U1_SP330_MODE_Pin;
  22.         u1_sp330.SP330_Work_Mode = RS422_MODE; //422模式
  23.         u1_sp330.SP330_Comm_Mode = FULL_DUPLEX; //全双工
  24.        
  25.         Sp330_Init(&u1_sp330); //初始化uart1 sp330
  26.        
  27.         u4_sp330.SP330_DE_GPIOx = U4_SP330_DE_GPIO_Port;
  28.         u4_sp330.SP330_DE_GPIO_Pin = U4_SP330_DE_Pin;
  29.         u4_sp330.SP330_RE_GPIOx = U4_SP330_RE_GPIO_Port;
  30.         u4_sp330.SP330_RE_GPIO_Pin = U4_SP330_RE_Pin;
  31.         u4_sp330.SP330_SHDN_GPIOx = U4_SP330_SHDN_GPIO_Port;
  32.         u4_sp330.SP330_SHDN_GPIO_Pin = U4_SP330_SHDN_Pin;
  33.         u4_sp330.SP330_SLEW_GPIOx = U4_SP330_SLEW_GPIO_Port;
  34.         u4_sp330.SP330_SLEW_GPIO_Pin = U4_SP330_SLEW_Pin;
  35.         u4_sp330.SP330_MODE_GPIOx = U4_SP330_MODE_GPIO_Port;
  36.         u4_sp330.SP330_MODE_GPIO_Pin = U4_SP330_MODE_Pin;
  37.         u4_sp330.SP330_Work_Mode = RS422_MODE; //422模式
  38.         u4_sp330.SP330_Comm_Mode = FULL_DUPLEX; //全双工
  39.        
  40.         Sp330_Init(&u4_sp330); //初始化uart4 sp330       
  41. }
  42. void Sp330_Init(Sp330_Configure *sp330)
  43. {
  44. #if 0 //mx生成时已初始化引脚,不在这里再次初始化了
  45.         /* 开启GPIO时钟 */
  46.         MX_GPIOX_Clock_Enable(sp330->SP330_DE_GPIOx);
  47.         MX_GPIOX_Clock_Enable(sp330->SP330_RE_GPIOx);
  48.         MX_GPIOX_Clock_Enable(sp330->SP330_SLEW_GPIOx);
  49.         MX_GPIOX_Clock_Enable(sp330->SP330_SHDN_GPIOx);
  50.         MX_GPIOX_Clock_Enable(sp330->SP330_HALE_FULL_GPIOx);
  51.         MX_GPIOX_Clock_Enable(sp330->SP330_MODE_GPIOx);
  52.        
  53.         /* 初始化GPIO */
  54.         MX_GPIOX_PIN_Init(sp330->SP330_DE_GPIOx,sp330->SP330_DE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  55.         MX_GPIOX_PIN_Init(sp330->SP330_RE_GPIOx,sp330->SP330_RE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  56.         MX_GPIOX_PIN_Init(sp330->SP330_SLEW_GPIOx,sp330->SP330_SLEW_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  57.         MX_GPIOX_PIN_Init(sp330->SP330_SHDN_GPIOx,sp330->SP330_SHDN_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  58.         MX_GPIOX_PIN_Init(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  59.         MX_GPIOX_PIN_Init(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
  60. #endif
  61.        
  62.         /* 模式配置 RS485 \RS422 \RS232设置*/
  63.         if(sp330->SP330_Work_Mode == RS232_MODE)
  64.                 HAL_GPIO_WritePin(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_PIN_RESET);
  65.         else if(sp330->SP330_Work_Mode == RS422_MODE || sp330->SP330_Work_Mode == RS485_MODE)       
  66.         {
  67.                 HAL_GPIO_WritePin(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_PIN_SET);
  68.                 HAL_GPIO_WritePin(sp330->SP330_DE_GPIOx,sp330->SP330_DE_GPIO_Pin,GPIO_PIN_SET);//使能发送
  69.                 HAL_GPIO_WritePin(sp330->SP330_RE_GPIOx,sp330->SP330_RE_GPIO_Pin,GPIO_PIN_RESET); //使能接收
  70.         }
  71.         /* 通信方式设置  全双工、半双工设置*/
  72.         if(sp330->SP330_Comm_Mode == HALF_DUPLEX)
  73.                 HAL_GPIO_WritePin(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_PIN_SET);
  74.         else if(sp330->SP330_Comm_Mode == FULL_DUPLEX)
  75.                 HAL_GPIO_WritePin(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_PIN_RESET);
  76.        
  77.         /* 限摆率设置 */
  78.         HAL_GPIO_WritePin(sp330->SP330_SLEW_GPIOx,sp330->SP330_SLEW_GPIO_Pin,GPIO_PIN_SET); /*无限制*/
  79.        
  80.         /* 低功耗设置 */
  81.         HAL_GPIO_WritePin(sp330->SP330_SHDN_GPIOx,sp330->SP330_SHDN_GPIO_Pin,GPIO_PIN_SET); /* 关闭低功耗 */
  82.        
  83. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表