一、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信号。
如下图:
可以看到,默认功能是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,完事,亮了。。。。