STM32/STM8L/STM8S系列之一、流水灯

本文详细介绍如何在STM32F103和STM8S103微控制器上点亮LED灯,包括电路配置、代码实现及解决常见问题的方法。针对STM32F103,特别讲解了如何正确配置PB3和PB4引脚的复用功能;对于STM8S103,则强调了外部电阻的重要性。

一、STM32F103点亮LED

1、电路图:

这里写图片描述

2、代码:

//FUNCTION:LED初始化
//PARA    :无
//RETURN  :无
void LED_INIT(void) 
{
    GPIO_InitTypeDef GPIO_InitStructure;  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE); //使能AFIO和GPIOB端口
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭PB3 PB4的复用功能,使能通用IO功能

    //GPIO Structure
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;  //Chose Pin3 and Pin4
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //Set Frequency 50MHz   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);                  //GPIOB
}
//main函数
int main(void)
{
    LED_INIT();

    while (1)
    {           
        GPIO_SetBits(GPIOB, GPIO_Pin_3);    //LED3 ON
        GPIO_ResetBits(GPIOB, GPIO_Pin_4);  //LED4 OFF
        mydelay_ms(500);                    //延时

        GPIO_ResetBits(GPIOB, GPIO_Pin_3);  //LED3 OFF
        GPIO_SetBits(GPIOB, GPIO_Pin_4);    //LED4 ON
        mydelay_ms(500);                    //延时
    }
}

3、LED点不亮原因:

一开始检查代码都正常,貌似没有错误,可是灯就是不亮,后来看手册发现原来PB3、PB4引脚都有个复用功能,系统默认使用了复用的功能,从而不再是通用IO输出功能,需要把复用功能关掉,才能正常输出IO信号。
如下图:

图2 stm32f103c数据手册,PB口功能

可以看到,默认功能是JTDO和JNTRST,所以把这两个功能关闭即可。对应代码为LED初始化函数 LED_INIT() 中的以下两行:

    //关闭PB3 PB4的复用功能,使能PB2、PB3的通用IO功能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE); 
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

二、STM8L151G6U6点亮LED

待补充


三、STM8S103点亮LED

1、流程

点亮LED,流程跟STM32基本一样:

  • (1)配置GPIO(STM8S不需要专门配置每个引脚的时钟,最开始的时候配置系统时钟即可)
  • (2)GPIO输出高低电平

废话不说,上代码:

2、上代码

//FUNCKTION: LED灯GPIO口初始化
//PARA     : 无
//RETURN   : 无
void LED_Config() 
{
    GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
    GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_SLOW);
}


//FUNCKTION: 打开LED灯
//PARA     : 无
//RETURN   : 无
void LED_ON()
{
    GPIO_WriteHigh(GPIOB, GPIO_PIN_4);
    GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
}


//FUNCKTION: 关闭LED灯
//PARA     : 无
//RETURN   : 无
void LED_OFF()
{
    GPIO_WriteLow(GPIOB, GPIO_PIN_4);
    GPIO_WriteLow(GPIOB, GPIO_PIN_5);
}

3、死活点不亮LED的坑

因为使用的是*PB4和PB5这两个GPIO口,查看数据手册可以看到如下图:
这里写图片描述
可以看到红圈内标记该GPIO口为T(3),继续下翻,到该表格的最下面,有关T(3)的描述:
这里写图片描述
英语不好,就不献丑翻译了,反正意思是要自己在外部添加上拉电阻或下拉电阻,不然没用。

于是,赶紧找个导线,飞个线,接个电阻,OK,完事,亮了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值