大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6的GPIO。
首先看原理图,这里使用我设计的地心一号的开发板做演示:
可以看到,单片机的PB4管脚外接了一个绿色的LED。虽然限流电阻很大,有10K,但因为LED是高亮的,所以亮度依然可以满足我们的需求。
程序如何写?很简单,如下:
#include "stm8s.h"
#include "stm8s_gpio.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
#define LED_GPIO_PORT (GPIOB)
#define LED_GPIO_PINS (GPIO_PIN_4)
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
/* Initialize I/Os in Output Mode */
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
while (1)
{
/* Toggles LEDs */
GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
Delay(0xffff);
}
}
首先看宏定义,那里定义了要初始化的GPIO的组和编号,组为GPIOB,编号为GPIO_PIN_4。
然后看main函数里的内容。初始化部分相比寄存器操作非常简单,只有一句话:
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
STM8S的GPIO,在使用库函数方式进行初始化的时候,有多种状态可选,如下:
GPIO_MODE_IN_FL_NO_IT = (uint8_t)0x00, /*!< Input floating, no external interrupt */
GPIO_MODE_IN_PU_NO_IT = (uint8_t)0x40, /*!< Input pull-up, no external interrupt */
GPIO_MODE_IN_FL_IT = (uint8_t)0x20, /*!< Input floating, external interrupt */
GPIO_MODE_IN_PU_IT = (uint8_t)0x60, /*!< Input pull-up, external interrupt */
GPIO_MODE_OUT_OD_LOW_FAST = (uint8_t)0xA0, /*!< Output open-drain, low level, 10MHz */
GPIO_MODE_OUT_PP_LOW_FAST = (uint8_t)0xE0, /*!< Output push-pull, low level, 10MHz */
GPIO_MODE_OUT_OD_LOW_SLOW = (uint8_t)0x80, /*!< Output open-drain, low level, 2MHz */
GPIO_MODE_OUT_PP_LOW_SLOW = (uint8_t)0xC0, /*!< Output push-pull, low level, 2MHz */
GPIO_MODE_OUT_OD_HIZ_FAST = (uint8_t)0xB0, /*!< Output open-drain, high-impedance level,10MHz */
GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0, /*!< Output push-pull, high level, 10MHz */
GPIO_MODE_OUT_OD_HIZ_SLOW = (uint8_t)0x90, /*!< Output open-drain, high-impedance level, 2MHz */
GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0 /*!< Output push-pull, high level, 2MHz */
初始化GPIOB的GPIO_PIN_4,初始化为推挽输出、快速、引脚初始化完成后输出低电平。
最后,通过翻转函数和延时函数,实现LED的闪烁。
要深入理解STM8S的库函数操作,需要有51单片机的基础,同时对C语言理解较好。想要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。
一直没搞明白stm8的gpio宏操作是怎么计算实际gpio口的对应关系的
PB_ODR &=~0x01
PB_ODR |= 0x01
PB_ODR &=~0x02
PB_ODR |= 0x02
PB_ODR &=~0x03
PB_ODR |= 0x03
这都是对应哪几个gpio口呢? 是怎么计算规则的?
PB_ODR 表示PB口,每一组有八个IO,PB_ODR |= 0x01 表示把PB的第一个IO也就是PB0置一