STM8单片机学习总结初步02
扫描二维码
随时随地手机看文章
之前做的PCB板回来前,需构建“驱动代码”的“架构”问题,相对简单,按流程图整理出的文件截图共2页,具体如下:
第1页:
第2页:
--------------------------华丽分割线 1-------------------------
编程使用的“版本”为“IAR for STM8 1401”,使用还不错,比较顺手,由于已经完成过部分驱动,并将所有头文件封装进"includes.h"中,包含的头文件如下:
#ifndef __INCLUDES_H_FOR_STM8
#define __INCLUDES_H_FOR_STM8
#include"ultra_maps.h"
#include"ultra_edit.h"
#include "stm8s.h"
#include "stm8s_clk.h"
#include "stm8s_gpio.h"
#include "delay.h"
#include "bsp_gpio.h"
#include "bsp_key.h"
#include "bsp_usart.h"
#include "bsp_adc.h"
#include "bsp_adc_multi.h"
#include "bsp_tim1.h"
#include "bsp_tim2.h"
#include "bsp_tim4.h"
#include "bsp_relay.h"
#endif
控制“功率LED”使用代码位于“bsp_relay.h”和“bsp_relay.c”中,代码很多,采用“宏定义”实现有效控制,“宏定义”如下:
#define RELAY01_GPIO_PORT (GPIOC)
#define RELAY01_GPIO_PINS (GPIO_PIN_7)
#define RELAY02_GPIO_PORT (GPIOC)
#define RELAY02_GPIO_PINS (GPIO_PIN_6)
#define RELAY03_GPIO_PORT (GPIOC)
#define RELAY03_GPIO_PINS (GPIO_PIN_5)
#define RELAY04_GPIO_PORT (GPIOC)
#define RELAY04_GPIO_PINS (GPIO_PIN_4)
#define RELAY05_GPIO_PORT (GPIOC)
#define RELAY05_GPIO_PINS (GPIO_PIN_3)
#define RELAY06_GPIO_PORT (GPIOB)
#define RELAY06_GPIO_PINS (GPIO_PIN_4)
#define RELAY07_GPIO_PORT (GPIOB)
#define RELAY07_GPIO_PINS (GPIO_PIN_5)
“bsp_relay.c”中使用的所有函数如下:
void Relay_GPIO_Init(void);
void Relay_Left_ALL_ON(void);
void Relay_Left_ALL_OFF(void);
void Relay_Left_Single_ON(uint8_t numOfPin);
void Relay_Left_Single_OFF(uint8_t numOfPin);
void Relay_Right_ALL_ON(void);
void Relay_Right_ALL_OFF(void);
void Relay_Right_Single_ON(uint8_t numOfPin);
void Relay_Right_Single_OFF(uint8_t numOfPin);
void Relay_Left_Right_USART1_Action(uint8_t numOfPin);
看“函数名”大概就可以知道函数功能,以下是“void Relay_Left_Single_ON(uint8_t numOfPin)”函数代码,其他函数代码均按照此结构编写:
void Relay_Left_Single_ON(uint8_t numOfPin)
{
uint8_t temp = 0;
temp = numOfPin;
switch(temp)
{
case 1:
{
GPIO_WriteHigh(RELAY04_GPIO_PORT, RELAY04_GPIO_PINS);
break;
}
case 2:
{
GPIO_WriteHigh(RELAY05_GPIO_PORT, RELAY05_GPIO_PINS);
break;
}
case 3:
{
GPIO_WriteHigh(RELAY06_GPIO_PORT, RELAY06_GPIO_PINS);
break;
}
default:
{
Relay_Left_ALL_OFF();
break;
}
}
}
函数均不复杂,但“分而治之”的方式还是让人受益良多;在后期“修改/调试代码”时,简直不要太愉快;