笔者接到一个C51单片机的工程要转移到stm上来,然后有一些思索感受,遂做个简单的记录。使用宏定义的好处大家都熟知,便于移植与维护,清晰直观,因此要善于应用,方便自己也方便他人;51的数据输入输出寄存器是同一个,而且输入输出方向寄存器是分开的,因此,在移植的时候要多一些工作!下面是51的原工程部分代码:
#define CHIP_MODE_GPIO P2
#define CHIP_MODE_GPIO_DIR_REG P2MDOUT //0 as in or 1 as out
#define CHIP_MODE_GPIO_GPIO_PIN PIN_2 //P2^4
sbit CHIP_MODE_IO = CHIP_MODE_GPIO ^ CHIP_MODE_GPIO_GPIO_PIN;
#define CHIP_MODE_OPEN_DRAIN() CHIP_MODE_GPIO_DIR_REG &= ~(1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_PUSH_PULL() CHIP_MODE_GPIO_DIR_REG |= (1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_H() CHIP_MODE_IO = LOGIC_1
#define CHIP_MODE_L() CHIP_MODE_IO = LOGIC_0
这是我的简单移植应用测试:
#define PIN_0 0
#define PIN_1 1
#define PIN_2 2
#define PIN_3 3
#define PIN_4 4
#define PIN_5 5
#define PIN_6 6
#define PIN_7 7
#define CHIP_MODE_GPIO PB_ODR //输出数据
#define CHIP_MODE_GPIO_GPIO_PIN PIN_5 //PB5
#define CHIP_MODE_GPIO_DIR_REG PB_DDR
#define CHIP_MODE_GPIO_OUTPUT_TYPE_REG PB_CR1
#define CHIP_MODE_IO_OUTPUT_OPERATION() CHIP_MODE_GPIO_DIR_REG |= (1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_OPEN_DRAIN() CHIP_MODE_GPIO_OUTPUT_TYPE_REG &= ~(1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_PUSH_PULL() CHIP_MODE_GPIO_OUTPUT_TYPE_REG |= (1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_H() CHIP_MODE_GPIO |= (1 << CHIP_MODE_GPIO_GPIO_PIN)
#define CHIP_MODE_L() CHIP_MODE_GPIO &= ~(1 << CHIP_MODE_GPIO_GPIO_PIN)
void Gpio_Init()
{
CHIP_MODE_IO_OUTPUT_OPERATION();
CHIP_MODE_PUSH_PULL();
CHIP_MODE_L();
}
int main( void )
{
Gpio_Init();
while (1)
{
}
return 0;
}
stm IO的操作按照方向配置、输入输出类型、输入输出数据步骤来。另外,补充两点经验:
①:如果宏定义是操作的话,最好加上类似函数的括号,如果是端口引脚等申明则不需要,这样比较直观
②:宏定义紧跟字符串编译器是无法识别的,有操作运算符分开则是可以的