浅谈STM8S208与STM32F1系列-GPIO端口输入输出分类-寄存器配置下
下面是STM8S208B和STM32F103引脚配置的程序和寄存器对应。注意!注意!注意:看代码照着颜色来看,没标颜色的不用仔细看,过一遍就好。不然会感觉很乱。个人感觉: 1.比较了STM8和STM32本质上都是给寄存器赋值。STM32多了对系统时钟的初始化。
2.看了STM8的数据手册和自带库,赋值主要是按位赋值。STM32参考手册和数据库,赋值定义主要是16位来赋值。
3.STM8数据手册解释介绍寄存器没有stm32参考手册详细。
一、用STM8S208B芯片完成灯闪烁。引脚:PI0
main函数为灯闪烁函数,下面定义的每句话的出自iostm8s208mb.h文件(ST官方自带库的.h文件)看代码看带颜色标记的快。(从上到下一层一层递进) void main(void)
{undefined
PI_DDR_DDR0=1; //配置PI0端口为输出模式 0x502A
PI_CR1_C10=1;//配置PI0端口为推挽输出模式 0x502B
PI_CR2_C20=0;//配置PI0端口低斜率输出0x502C
LED=1; //上电后让PI0引脚输出高电平0x5028
while(1) //执行死循环
{undefined
LED=1;//让PI0引脚输出高电平
delay(200);//延时保持熄灭状态
LED=0;//让PI0引脚输出低电平
delay(10);//延时保持点亮状态
}
} PI_DDR_DDR0等可以直接用出自iostm8s208mb.h文件(ST官方自带库的.h文件)
#define PI_DDR_DDR0 PI_DDR_bit.DDR0
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{undefined
unsigned char DDR0 : 1;
unsigned char DDR1 : 1;
unsigned char DDR2 : 1;
unsigned char DDR3 : 1;
unsigned char DDR4 : 1;
unsigned char DDR5 : 1;
unsigned char DDR6 : 1;
unsigned char DDR7 : 1;
} __BITS_PI_DDR;
#endif
__IO_REG8_BIT(PI_DDR, 0x502A, __READ_WRITE, __BITS_PI_DDR);
#define PI_CR1_C10 PI_CR1_bit.C10
/* Port I control register 1 */
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{undefined
unsigned char C10 : 1;
unsigned char C11 : 1;
unsigned char C12 : 1;
unsigned char C13 : 1;
unsigned char C14 : 1;
unsigned char C15 : 1;
unsigned char C16 : 1;
unsigned char C17 : 1;
} __BITS_PI_CR1;
#endif
__IO_REG8_BIT(PI_CR1, 0x502B, __READ_WRITE, __BITS_PI_CR1);
#define PI_CR2_C20 PI_CR2_bit.C20
/* Port I control register 2 */
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{undefined
unsigned char C20 : 1;
unsigned char C21 : 1;
unsigned char C22 : 1;
unsigned char C23 : 1;
unsigned char C24 : 1;
unsigned char C25 : 1;
unsigned char C26 : 1;
unsigned char C27 : 1;
} __BITS_PI_CR2;
#endif
__IO_REG8_BIT(PI_CR2, 0x502C, __READ_WRITE, __BITS_PI_CR2);
#define LED PI_ODR_ODR0//连接至LED引脚
#define PI_ODR_ODR0 PI_ODR_bit.ODR0
/* Port I data output latch register */
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{undefined
unsigned char ODR0 : 1;
unsigned char ODR1 : 1;
unsigned char ODR2 : 1;
unsigned char ODR3 : 1;
unsigned char ODR4 : 1;
unsigned char ODR5 : 1;
unsigned char ODR6 : 1;
unsigned char ODR7 : 1;
} __BITS_PI_ODR;
#endif
__IO_REG8_BIT(PI_ODR, 0x5028, __READ_WRITE, __BITS_PI_ODR); 二、用STM32F103芯片完成灯闪烁。引脚:PA8
main函数为原子STM32f103mini开发板寄存器版本代码,完成LED:PA8和PD2交替闪烁。
图片是STM32中文参考手册里的截图。 解释:ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读 出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口
的输出电平。 GPIOA可直接用定义在stm32f10x.h文件中(ST官方库)
int main(void)
{
Stm32_Clock_Init(9); //系统时钟
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{undefined
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
} void LED_Init(void)
{undefined
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<5; //使能PORTD时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8推挽输出
GPIOA->ODR|=1<<8; //PA8输出高
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD.2推挽输出
GPIOD->ODR|=1<<2; //PD.2输出高
} GPIOA可直接用定义在stm32f10x.h文件中(ST官方库)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 0x4000 0000+0x1 0000+0x 0800=0x4001 0800H 为实际的地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */别名区域中的外围基址 typedef struct
{undefined
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef; #define LED0 PAout(8) // PA8//正点原子自己定义的函数在sys.h中
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO操作宏定义
#define MEM_ADDR(addr)*((volatile unsigned long*)(addr)) //正点原子自己定义的函数在sys.h中
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //正点原子自己定义的函数
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C 0x40000000+0x10000+0x0800+C=0x4001 080CH为实际地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
页:
[1]