你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 点灯丨V2.1.0

[复制链接]
STMCU小助手 发布时间:2021-1-15 14:57
STM32 点灯丨V2.1.0
今天把昨天的设想给实现了,目前来看,这个程序可以算是当前的一个完成版本了。
加了IO口的GPIO的宏,方面以后改IO口。
  1. #define LED_PIN              GPIO_Pin_5
  2. #define LED_GPIO_PORT        GPIOB
  3. #define LED_GPIO_CLK         RCC_APB2Periph_GPIOB
  4. #define LED_POLAR            0        //LED的电平有效性,0:低电平有效,1:高电平有效
  5. #define LED_TYPE_NUM         3        //LED的类型数
复制代码

这样,以后就可以直接在文件顶部直接修改,而不用修改初始化函数里的东西了。
在参数里增加了,IO口的电平有效性设置(也用宏来管理了),如果下次改成高电平有效,我们只要改一个数就可以实现了。
  1. typedef struct
  2. {
  3.     u16 Err_num;         //故障代码
  4.     u8  Type;            //LED的类型,0:常亮,1:闪烁,2:故障提示
  5.     u8  Enable;          //使能LED
  6.     u8  PolarLED;        //LED电平有效极性
  7. }LED_t;
复制代码

增加了极性检测函数,这样可以更好理解和维护程序。
  1. /** @brief        端口极性检查
  2.   * @param[in]    polar   : 极性
  3.                   data  : 数据
  4.   * @param[out]   无
  5.   * @retval       0   : 无效
  6.                   1   : 有效
  7.   * @note         无
  8.   */
  9. u8 sLed_Polar(u8 polar, u8 data)
  10. {
  11.     if((polar ^ data) & 0X01) //极性相反
  12.     {
  13.         return 0;
  14.     }
  15.     else
  16.     {
  17.         return 1;
  18.     }
  19. }
复制代码

相应的,循环函数也做了一些修改,主要是在输出到LED端口的时候,用极性检测函数,先检测一下极性,再输出。
  1. /** @brief        LED循环
  2.   * @param[in]    无
  3.   * @param[out]   无
  4.   * @retval       类型
  5.   * @note         10ms
  6.   */
  7. void sLED_Loop(void)
  8. {
  9.     static u32 s_Cnt;
  10.     static bool  Flash;
  11.     static u32 ErrCnt;

  12.     s_Cnt = (s_Cnt +1)%(FLASH_FREQ * 1000);
  13.     switch(s_LED.Type)
  14.     {
  15.         case 0 :
  16.             LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable);  //亮LED
  17.             break;        
  18.         case 1:
  19.             if(s_Cnt % FLASH_FREQ == 0)  //500ms,闪烁一次
  20.             {
  21.                 Flash = !Flash;  //0灭,1:亮               
  22.                 LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable & Flash);//检查极性               
  23.             }        
  24.             break;
  25.         case 2:
  26.             if(s_Cnt % FLASH_FREQ == 0)  //间隔500ms
  27.             {
  28.                 Flash = !Flash;  //翻转
  29.                 if(Flash == 1)
  30.                     ErrCnt++;
  31.                 if(ErrCnt > s_LED.Err_num)
  32.                 {
  33.                     ErrCnt++;
  34.                     Flash = 0;
  35.                     if(ErrCnt > s_LED.Err_num + 2)//灭两个周期
  36.                         ErrCnt = 0;
  37.                 }
  38.                 LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable & Flash);//检查极性           
  39.             }
  40.             break;
  41.         default:
  42.             break;            
  43.     }   
  44. }
复制代码

最后,就是昨天说的,设计接口函数,通过接口函数来设置、读取LED的参数。使程序更好理解,更好管理。
获取当前LED的类型
  1. /** @brief        获取当前LED的类型
  2.   * @param[in]    无
  3.   * @param[out]   无
  4.   * @retval       类型
  5.   * @note         无
  6.   */
  7. u8 sLED_ReadType(void)
  8. {
  9.     return s_LED.Type;
  10. }
复制代码

设置LED的类型
  1. /** @brief        设置LDE的类型
  2.   * @param[in]    type   : 类型
  3.   * @param[out]   无
  4.   * @retval       1   : 设置成功
  5.                   0   : 设置失败
  6.   * @note         无
  7.   */
  8. u8 sLED_SetType(u8 type)
  9. {
  10.     if(type < LED_TYPE_NUM)
  11.     {
  12.         s_LED.Type = type;
  13.         return 1;            
  14.     }
  15.     else
  16.         return 0;
  17. }
复制代码

使能LED
  1. /** @brief        使能LED
  2.   * @param[in]    Enable :使能
  3.   * @param[out]   无
  4.   * @retval       无
  5.   * @note         无
  6.   */
  7. void sLED_Enable(u8 Enable)
  8. {
  9.     Enable = (Enable != 0);
  10.     s_LED.Enable = sLed_Polar(s_LED.PolarLED , Enable);
  11. }
复制代码

这样,我们只要将LED的头文件包换过去,就可以通过接口操作LED相应的参数了,这样是不是就比之前规范很多了,嘻嘻。
按照惯例,放一个测试视频。效果还是跟原来一样的。
如果大家想要工程文件的话,可以在公众号中找我要。
2.1.png
文章出处: Yue無缺

收藏 评论0 发布时间:2021-1-15 14:57

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版