STM32F103C8T6点亮LED灯(流水灯)(IO口的初始复用功能)

(1)序言
      刚开始学 STM32,当然是点亮LED灯了,从arm中的“hello word”开始着手。
      软件安装,硬件连接,前面文章已经有讲,这里不再多说。

(2)实验目的:使用STM32F10C8T6完成流水灯的功能。

(3)本次入门实验遇到的问题:
      程序写完了,灯就是不亮,调试了两个小时,终于找到原因,留个悬念,后面再说。

(4)废话不说,先上电路图:

图1 引脚图

(5)OK,上干货,代码:

C
#include "stm32f10x.h"  //GPIO Structure GPIO_InitTypeDef GPIO_InitStructure;   //Delay Function void mydelay_ms(int ms) {  volatile int i;  int k = ms * 2333 ;  for ( i=0; i ;  }  }   //LED Init Function void LED_INIT(void) { //Initialize System Timer SystemInit();  //使能PB3和PB4,并关闭PB3和PB4的复用功能,使IO功能生效 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE);  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  //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 GPIO_Init(GPIOB, &GPIO_InitStructure);  }  int main(void) { LED_INIT();  while (1){ //LED3 ON && LED4 OFF GPIO_SetBits(GPIOB, GPIO_Pin_3); GPIO_ResetBits(GPIOB, GPIO_Pin_4); mydelay_ms(500);  //LED3 OFF && LED4 ON GPIO_ResetBits(GPIOB, GPIO_Pin_3); GPIO_SetBits(GPIOB, GPIO_Pin_4); mydelay_ms(500); } }


(6)代码内容分析:
      首先,该代码分为三部分:延时函数,初始化函数,主函数,具体意思见代码注释。
      其次,以下几点是代码中需要注意的地方:
         a.可以看到有两个LED灯,分别由引脚 PB3 和 PB4 控制。故给这两个引脚配置为:IO输出,高电平即可。
         b.stm32中有很多GPIO口,分别用“GPIO+x”的形式表示,x表示具体的口,上图中PB,表示用的是GPIOB口。故代码中控制应该使用GPIOB。
         c.GPIO_Pin_3表示对3引脚操作,同理GPIO_Pin_4表示对4引脚操作。结合GPIOB,则表示操作PB3和PB4。
         d.GPIO_SetBits()表示设置为高电平,GPIO_ResetBits()表示设置为低电平。

(7)本次试验遇到的问题:
      一开始检查代码都正常,貌似没有错误,可是灯就是不亮,后来看手册发现原来PB3 PB4引脚都有个复用功能,系统默认使用了复用的功能,从而不再是IO输出功能,需要把复用功能关掉,才能正常输出IO信号。
上干货(图):


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

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

(8)打完收工,继续我的菜鸟成功之旅。希望有经验的大婶要是看见有错误的地方可以给予指正,感谢~~~[捂脸]

你可能感兴趣的:(stm32,stm32)