【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例

【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例


  • 🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:2.3.1
  • 📌STSW-STM8069官方资源下载地址:https://www.st.com/zh/embedded-software/stsw-stm8069.html
  • 🔧IAR编译器版本:IAR Assembler for STMicroelectronics STM8 3.11.1

STM8S208RB芯片为实验目标开发芯片,围绕其基本功能和外设进行该系列工程案例的创建和学习。目前已经基本完善了该系列的常规应用和外设驱动的案例示例的开发和验证工作。反而文字行的内容摘要跟不上,只能一点点写,陆续更新发布出来。

  • 📌STM8S207/208RBT6最小系统板:https://oshwhub.com/perseverance51/stm8s207rbt6-kai-fa-ban
    在这里插入图片描述

⚡注意事项

  • 🌿当STM8系列单片机使用24MHz晶振时,需要调整等待周期为1。否则无法运行。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 🌿使用标准外设库时,注意时钟参数配置,外部时钟晶振多少就设置多少频率的。
    在这里插入图片描述

🌼通用输入输出口(GPIO)

● 可选择的输入模式:浮动输入和带上拉输入
● 可选择的输出模式:推挽式输出和开漏输出
在这里插入图片描述

  • 📑在官方封装的库函数中,提供了12种IO配置模式:
    • stm8s_gpio.h
typedef enum
{
  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 */
}GPIO_Mode_TypeDef;
  1. GPIO_Mode_In_FL_No_IT:浮空输入无中断
  2. GPIO_Mode_In_PU_No_IT:上拉输入无中断
  3. GPIO_Mode_In_FL_IT:浮空输入有中断
  4. GPIO_Mode_In_PU_IT :上拉输入有中断
  5. GPIO_Mode_Out_OD_Low_Fast :开漏-输出低-高速 Output open-drain, low level, 10MHz
  6. GPIO_Mode_Out_PP_Low_Fast :推挽-输出低-高速 Output push-pull, low level, 10MHz
  7. GPIO_Mode_Out_OD_Low_Slow :开漏-输出低-低速 Output open-drain, low level, 2MHz
  8. GPIO_Mode_Out_PP_Low_Slow :推挽-输出低-低速 Output push-pull, low level, 2MHz
  9. GPIO_Mode_Out_OD_HiZ_Fast :开漏-输出高阻-高速 Output open-drain, high-impedance level, 10MHz
  10. GPIO_Mode_Out_PP_High_Fast :推挽-输出高-高速 Output push-pull, high level, 10MHz
  11. GPIO_Mode_Out_OD_HiZ_Slow :开漏-输出高阻-低速 Output open-drain, high-impedance level, 2MHz
  12. GPIO_Mode_Out_PP_High_Slow :推挽-输出高-低速 Output push-pull, high level, 2MHz

🛠点灯引脚配置

  • 🔖个人的开发板板载LED在PC6和PC7引脚上。
#define LED_GPIO_PORT  ((GPIO_TypeDef *)GPIOC)
#define LED_GPIO_PINS  (GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_3)

#define  LED1_ON()    GPIO_WriteLow(GPIOC , GPIO_PIN_7) //LED1亮
#define  LED1_OFF()   GPIO_WriteHigh(GPIOC , GPIO_PIN_7) //LED1灭
#define  LED1_TOGGLE   GPIO_WriteReverse(GPIOC , GPIO_PIN_7) //LED1状态取反

#define  LED2_ON()    GPIO_WriteLow(GPIOC , GPIO_PIN_6) //LED2亮
#define  LED2_OFF()   GPIO_WriteHigh(GPIOC , GPIO_PIN_6) //LED2灭
#define  LED2_TOGGLE   GPIO_WriteReverse(GPIOC , GPIO_PIN_6) //LED2状态取反

📝主程序

#include "stm8s.h"
#include "led.h"
#include "delay.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {   
    nCount--;
  }
}

void main(void)
{
  //内部时钟为1分频 = 16Mhz
    CLK_SYSCLKConfig( CLK_PRESCALER_HSIDIV1 );//不启用,则系统时钟为8MHz
    LED_Init();
 
  while (1)
  {
    /* Toggles LEDs */
    GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);
//    Delay(0xFFFF);
    delay_ms(1000);
  }

   
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
  • 🌿延时函数源文件delay.c
#include "delay.h"


/*********************************************************************************
*   函 数 名: delay_us
*   功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的微秒数,输入nCount=1微妙
*   返 回 值: 无
*********************************************************************************/
void delay_us(unsigned int nCount)   //16M 晶振时  延时 1个微妙
{
    nCount*=3;//等同于 nCount=nCount*3  相当于把nCount变量扩大3倍
    while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。
}

/*******************************************************************************
**函数名称:void delay(unsigned int ms) 
**功能描述:大概延时
**入口参数:unsigned int ms   输入大概延时数值
**输出:无
*******************************************************************************/
void delay_ms(unsigned int ms)
{
  	unsigned int x , y;
    for( x = ms; x > 0; x-- )         /*  通过一定周期循环进行延时*/
        for( y = 3147 ; y > 0 ; y-- );
     __asm( "nop" ); //Perform no operation //assembly code
      __asm( "nop" );
}
  • 🌿毫秒延时测量
    在这里插入图片描述

🎉在没有频繁中断任务运行时,该阻塞延时精度还是可以满足一般需求。

📚工程源码

  • 🔖IAR对中文路径不友好,不要将工程解压在带有中文字符路径的文件夹内直接打开工程编译,这样会导致IAR内部检索文件路径将消耗大量CPU资源。

链接: https://pan.baidu.com/s/1t1IRwIJUJGjncKU1AeiTfw
提取码: xyvs
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值