打印
[其他ST产品]

浅谈STM8S208与STM32F1系列-GPIO端口输入输分类(下)

[复制链接]
153|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
下面是STM8S208B和STM32F103引脚配置的程序和寄存器对应。注意!注意!注意:看代码照着颜色来看,没标颜色的不用仔细看,过一遍就好。不然会感觉很乱。

个人感觉:1.比较了STM8和STM32本质上都是给寄存器赋值。STM32多了对系统时钟的初始化。

                  2.看了STM8的数据手册和自带库,赋值主要是按位赋值。STM32参考手册和数据库,赋值定义主要是16位来赋值。

                  3.STM8数据手册解释介绍寄存器没有stm32参考手册详细。

一、用STM8S208B芯片完成灯闪烁。引脚:PI0
main函数为灯闪烁函数,下面定义的每句话的出自iostm8s208mb.h文件(ST官方自带库的.h文件)看代码看带颜色标记的快。(从上到下一层一层递进)

图片是STM8S207xxSTM8S208xx的数据手册的截图。




使用特权

评论回复
沙发
米多0036|  楼主 | 2023-10-10 11:36 | 只看该作者
void main(void)
{
  PI_DDR_DDR0=1; //配置PI0端口为输出模式      0x502A
  PI_CR1_C10=1;  //配置PI0端口为推挽输出模式 0x502B
  PI_CR2_C20=0;  //配置PI0端口低斜率输出  0x502C
  LED=1;         //上电后让PI0引脚输出高电平  0x5028
  while(1)      //执行死循环
  {
    LED=1;//让PI0引脚输出高电平
    delay(200);//延时保持熄灭状态
    LED=0;//让PI0引脚输出低电平
    delay(10);//延时保持点亮状态
  }
}

使用特权

评论回复
板凳
米多0036|  楼主 | 2023-10-10 11:36 | 只看该作者
PI_DDR_DDR0等可以直接用出自iostm8s208mb.h文件(ST官方自带库的.h文件)
#define PI_DDR_DDR0              PI_DDR_bit.DDR0
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{
  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);

使用特权

评论回复
地板
米多0036|  楼主 | 2023-10-10 11:37 | 只看该作者
#define PI_CR1_C10               PI_CR1_bit.C10
/* Port I control register 1 */
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{
  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);

使用特权

评论回复
5
米多0036|  楼主 | 2023-10-10 11:37 | 只看该作者
#define PI_CR2_C20               PI_CR2_bit.C20
/* Port I control register 2 */
#ifdef __IAR_SYSTEMS_ICC__
typedef struct
{
  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
{
  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);

使用特权

评论回复
6
米多0036|  楼主 | 2023-10-10 11:37 | 只看该作者
二、用STM32F103芯片完成灯闪烁。引脚:PA8
main函数为原子STM32f103mini开发板寄存器版本代码,完成LED:PA8和PD2交替闪烁。

图片是STM32中文参考手册里的截图。

使用特权

评论回复
7
米多0036|  楼主 | 2023-10-10 11:38 | 只看该作者

使用特权

评论回复
8
米多0036|  楼主 | 2023-10-10 11:38 | 只看该作者
解释:ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读
出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口
的输出电平。

使用特权

评论回复
9
米多0036|  楼主 | 2023-10-10 11:38 | 只看该作者

使用特权

评论回复
10
米多0036|  楼主 | 2023-10-10 11:38 | 只看该作者
GPIOA可直接用定义在stm32f10x.h文件中(ST官方库)

int main(void)
{         
    Stm32_Clock_Init(9);     //系统时钟
    delay_init(72);             //延时初始化
    LED_Init();                   //初始化与LED连接的硬件接口
    while(1)
    {
        LED0=0;
        LED1=1;
        delay_ms(300);
        LED0=1;
        LED1=0;
        delay_ms(300);
    }     
}

void LED_Init(void)
{
    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输出高
}

使用特权

评论回复
11
米多0036|  楼主 | 2023-10-10 11:39 | 只看该作者
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
{
  __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;

使用特权

评论回复
12
米多0036|  楼主 | 2023-10-10 11:39 | 只看该作者
#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 */

使用特权

评论回复
13
Henryko| | 2023-10-10 12:18 | 只看该作者
这个是不是只能用寄存器方式开发啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

1163

帖子

0

粉丝