|
STM32 点灯丨V2.1.0 今天把昨天的设想给实现了,目前来看,这个程序可以算是当前的一个完成版本了。 加了IO口的GPIO的宏,方面以后改IO口。 - #define LED_PIN GPIO_Pin_5
- #define LED_GPIO_PORT GPIOB
- #define LED_GPIO_CLK RCC_APB2Periph_GPIOB
- #define LED_POLAR 0 //LED的电平有效性,0:低电平有效,1:高电平有效
- #define LED_TYPE_NUM 3 //LED的类型数
复制代码
这样,以后就可以直接在文件顶部直接修改,而不用修改初始化函数里的东西了。 在参数里增加了,IO口的电平有效性设置(也用宏来管理了),如果下次改成高电平有效,我们只要改一个数就可以实现了。 - typedef struct
- {
- u16 Err_num; //故障代码
- u8 Type; //LED的类型,0:常亮,1:闪烁,2:故障提示
- u8 Enable; //使能LED
- u8 PolarLED; //LED电平有效极性
- }LED_t;
复制代码
增加了极性检测函数,这样可以更好理解和维护程序。 - /** @brief 端口极性检查
- * @param[in] polar : 极性
- data : 数据
- * @param[out] 无
- * @retval 0 : 无效
- 1 : 有效
- * @note 无
- */
- u8 sLed_Polar(u8 polar, u8 data)
- {
- if((polar ^ data) & 0X01) //极性相反
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
复制代码
相应的,循环函数也做了一些修改,主要是在输出到LED端口的时候,用极性检测函数,先检测一下极性,再输出。 - /** @brief LED循环
- * @param[in] 无
- * @param[out] 无
- * @retval 类型
- * @note 10ms
- */
- void sLED_Loop(void)
- {
- static u32 s_Cnt;
- static bool Flash;
- static u32 ErrCnt;
- s_Cnt = (s_Cnt +1)%(FLASH_FREQ * 1000);
- switch(s_LED.Type)
- {
- case 0 :
- LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable); //亮LED
- break;
- case 1:
- if(s_Cnt % FLASH_FREQ == 0) //500ms,闪烁一次
- {
- Flash = !Flash; //0灭,1:亮
- LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable & Flash);//检查极性
- }
- break;
- case 2:
- if(s_Cnt % FLASH_FREQ == 0) //间隔500ms
- {
- Flash = !Flash; //翻转
- if(Flash == 1)
- ErrCnt++;
- if(ErrCnt > s_LED.Err_num)
- {
- ErrCnt++;
- Flash = 0;
- if(ErrCnt > s_LED.Err_num + 2)//灭两个周期
- ErrCnt = 0;
- }
- LED = sLed_Polar(s_LED.PolarLED , s_LED.Enable & Flash);//检查极性
- }
- break;
- default:
- break;
- }
- }
复制代码
最后,就是昨天说的,设计接口函数,通过接口函数来设置、读取LED的参数。使程序更好理解,更好管理。 获取当前LED的类型 - /** @brief 获取当前LED的类型
- * @param[in] 无
- * @param[out] 无
- * @retval 类型
- * @note 无
- */
- u8 sLED_ReadType(void)
- {
- return s_LED.Type;
- }
复制代码
设置LED的类型 - /** @brief 设置LDE的类型
- * @param[in] type : 类型
- * @param[out] 无
- * @retval 1 : 设置成功
- 0 : 设置失败
- * @note 无
- */
- u8 sLED_SetType(u8 type)
- {
- if(type < LED_TYPE_NUM)
- {
- s_LED.Type = type;
- return 1;
- }
- else
- return 0;
- }
复制代码
使能LED - /** @brief 使能LED
- * @param[in] Enable :使能
- * @param[out] 无
- * @retval 无
- * @note 无
- */
- void sLED_Enable(u8 Enable)
- {
- Enable = (Enable != 0);
- s_LED.Enable = sLed_Polar(s_LED.PolarLED , Enable);
- }
复制代码
这样,我们只要将LED的头文件包换过去,就可以通过接口操作LED相应的参数了,这样是不是就比之前规范很多了,嘻嘻。 按照惯例,放一个测试视频。效果还是跟原来一样的。 如果大家想要工程文件的话,可以在公众号中找我要。 文章出处: Yue無缺
|